Profiling support (#743)
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -7,3 +7,4 @@ target
|
|||||||
package-lock.json
|
package-lock.json
|
||||||
**/*.csv
|
**/*.csv
|
||||||
.history
|
.history
|
||||||
|
.vscode/
|
||||||
326
.vscode/launch.json
vendored
326
.vscode/launch.json
vendored
@@ -1,326 +0,0 @@
|
|||||||
{
|
|
||||||
// Use IntelliSense to learn about possible attributes.
|
|
||||||
// Hover to view descriptions of existing attributes.
|
|
||||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
|
||||||
"version": "0.2.0",
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug unit tests in library 'rapier2d'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"--no-run",
|
|
||||||
"--lib",
|
|
||||||
"--package=rapier2d"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "rapier2d",
|
|
||||||
"kind": "lib"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug unit tests in library 'rapier2d_f64'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"--no-run",
|
|
||||||
"--lib",
|
|
||||||
"--package=rapier2d-f64"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "rapier2d_f64",
|
|
||||||
"kind": "lib"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug unit tests in library 'rapier_testbed2d'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"--no-run",
|
|
||||||
"--lib",
|
|
||||||
"--package=rapier_testbed2d"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "rapier_testbed2d",
|
|
||||||
"kind": "lib"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug executable 'all_examples2'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"build",
|
|
||||||
"--bin=all_examples2",
|
|
||||||
"--package=rapier-examples-2d"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "all_examples2",
|
|
||||||
"kind": "bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug unit tests in executable 'all_examples2'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"--no-run",
|
|
||||||
"--bin=all_examples2",
|
|
||||||
"--package=rapier-examples-2d"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "all_examples2",
|
|
||||||
"kind": "bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug executable 'all_benchmarks2'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"build",
|
|
||||||
"--bin=all_benchmarks2",
|
|
||||||
"--package=rapier-benchmarks-2d"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "all_benchmarks2",
|
|
||||||
"kind": "bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug unit tests in executable 'all_benchmarks2'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"--no-run",
|
|
||||||
"--bin=all_benchmarks2",
|
|
||||||
"--package=rapier-benchmarks-2d"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "all_benchmarks2",
|
|
||||||
"kind": "bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug unit tests in library 'rapier3d'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"--no-run",
|
|
||||||
"--lib",
|
|
||||||
"--package=rapier3d"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "rapier3d",
|
|
||||||
"kind": "lib"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug unit tests in library 'rapier3d_f64'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"--no-run",
|
|
||||||
"--lib",
|
|
||||||
"--package=rapier3d-f64"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "rapier3d_f64",
|
|
||||||
"kind": "lib"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug unit tests in library 'rapier_testbed3d'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"--no-run",
|
|
||||||
"--lib",
|
|
||||||
"--package=rapier_testbed3d"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "rapier_testbed3d",
|
|
||||||
"kind": "lib"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug executable 'all_examples3'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"build",
|
|
||||||
"--bin=all_examples3",
|
|
||||||
"--package=rapier-examples-3d"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "all_examples3",
|
|
||||||
"kind": "bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug unit tests in executable 'all_examples3'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"--no-run",
|
|
||||||
"--bin=all_examples3",
|
|
||||||
"--package=rapier-examples-3d"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "all_examples3",
|
|
||||||
"kind": "bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Run 'all_examples3'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--release",
|
|
||||||
"--bin=all_examples3",
|
|
||||||
"--package=rapier-examples-3d"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "all_examples3",
|
|
||||||
"kind": "bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug executable 'harness_capsules3'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"build",
|
|
||||||
"--bin=harness_capsules3",
|
|
||||||
"--package=rapier-examples-3d"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "harness_capsules3",
|
|
||||||
"kind": "bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug unit tests in executable 'harness_capsules3'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"--no-run",
|
|
||||||
"--bin=harness_capsules3",
|
|
||||||
"--package=rapier-examples-3d"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "harness_capsules3",
|
|
||||||
"kind": "bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug executable 'all_benchmarks3'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"build",
|
|
||||||
"--bin=all_benchmarks3",
|
|
||||||
"--package=rapier-benchmarks-3d"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "all_benchmarks3",
|
|
||||||
"kind": "bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "lldb",
|
|
||||||
"request": "launch",
|
|
||||||
"name": "Debug unit tests in executable 'all_benchmarks3'",
|
|
||||||
"cargo": {
|
|
||||||
"args": [
|
|
||||||
"test",
|
|
||||||
"--no-run",
|
|
||||||
"--bin=all_benchmarks3",
|
|
||||||
"--package=rapier-benchmarks-3d"
|
|
||||||
],
|
|
||||||
"filter": {
|
|
||||||
"name": "all_benchmarks3",
|
|
||||||
"kind": "bin"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"args": [],
|
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
5
.vscode/settings.json
vendored
5
.vscode/settings.json
vendored
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"rust-analyzer.cargo.features": [
|
|
||||||
"simd-stable"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
288
.vscode/tasks.json
vendored
288
.vscode/tasks.json
vendored
@@ -1,288 +0,0 @@
|
|||||||
{
|
|
||||||
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
|
||||||
// for the documentation about the tasks.json format
|
|
||||||
"version": "2.0.0",
|
|
||||||
"options": {
|
|
||||||
"env": {
|
|
||||||
"RUST_BACKTRACE": "1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"tasks": [
|
|
||||||
{
|
|
||||||
"label": "🚀 run 3d",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_examples3",
|
|
||||||
"--release",
|
|
||||||
"--features",
|
|
||||||
"other-backends",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "🚀 run 3d − 💌 deterministic",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_examples3",
|
|
||||||
"--release",
|
|
||||||
"--features",
|
|
||||||
"enhanced-determinism",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "🚀 run 3d − 🌈 simd",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_examples3",
|
|
||||||
"--release",
|
|
||||||
"--features",
|
|
||||||
"simd-stable,other-backends",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "🚀 run 3d − 🌈 simd 🪢 parallel",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_examples3",
|
|
||||||
"--release",
|
|
||||||
"--features",
|
|
||||||
"simd-stable,other-backends,parallel",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "🚀 run 2d",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_examples2",
|
|
||||||
"--release",
|
|
||||||
"--features",
|
|
||||||
"other-backends",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "🚀 run 2d − 🌈 simd",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_examples2",
|
|
||||||
"--release",
|
|
||||||
"--features",
|
|
||||||
"simd-stable,other-backends",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "🚀 run 2d − 🌈 simd 🪢 parallel",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_examples2",
|
|
||||||
"--release",
|
|
||||||
"--features",
|
|
||||||
"simd-stable,other-backends,parallel",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "⏱ bench 3d",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_benchmarks3",
|
|
||||||
"--release",
|
|
||||||
"--features",
|
|
||||||
"other-backends",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "⏱ bench 3d − 🌈 simd",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_benchmarks3",
|
|
||||||
"--release",
|
|
||||||
"--features",
|
|
||||||
"simd-stable,other-backends",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "⏱ bench 3d − 🌈 simd 🪢 parallel",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_benchmarks3",
|
|
||||||
"--release",
|
|
||||||
"--features",
|
|
||||||
"simd-stable,other-backends,parallel",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "⏱ bench 2d",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_benchmarks2",
|
|
||||||
"--release",
|
|
||||||
"--features",
|
|
||||||
"other-backends",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "⏱ bench 2d − 🌈 simd",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_benchmarks2",
|
|
||||||
"--release",
|
|
||||||
"--features",
|
|
||||||
"simd-stable,other-backends",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "⏱ bench 2d − 🌈 simd 🪢 parallel",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_benchmarks2",
|
|
||||||
"--release",
|
|
||||||
"--features",
|
|
||||||
"simd-stable,other-backends,parallel",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "🪲 debug 3d",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_examples3",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "🪲 debug 3d − 🌈 simd",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_examples3",
|
|
||||||
"--features",
|
|
||||||
"simd-stable",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "🪲 debug 3d − 🌈 simd 🪢 parallel",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_examples3",
|
|
||||||
"--features",
|
|
||||||
"simd-stable,parallel",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "🪲 debug 3d − 💌 deterministic",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"run",
|
|
||||||
"--bin",
|
|
||||||
"all_examples3",
|
|
||||||
"--features",
|
|
||||||
"enhanced-determinism",
|
|
||||||
"--",
|
|
||||||
"--pause"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "🛠 tests",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "cargo",
|
|
||||||
"args": [
|
|
||||||
"test"
|
|
||||||
],
|
|
||||||
"group": "build"
|
|
||||||
},
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -11,6 +11,8 @@
|
|||||||
### Added
|
### Added
|
||||||
|
|
||||||
- `RigidBodySet` and `ColliderSet` have a new constructor `with_capacity`.
|
- `RigidBodySet` and `ColliderSet` have a new constructor `with_capacity`.
|
||||||
|
- Use `profiling` crate to provide helpful profiling information in different tools.
|
||||||
|
- The testbeds have been updated to use `puffin_egui`
|
||||||
|
|
||||||
### Modified
|
### Modified
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,12 @@ resolver = "2"
|
|||||||
#parry2d-f64 = { git = "https://github.com/dimforge/parry", branch = "master" }
|
#parry2d-f64 = { git = "https://github.com/dimforge/parry", branch = "master" }
|
||||||
#parry3d-f64 = { git = "https://github.com/dimforge/parry", branch = "master" }
|
#parry3d-f64 = { git = "https://github.com/dimforge/parry", branch = "master" }
|
||||||
|
|
||||||
|
# # For feature unstable-puffin-pr-235
|
||||||
|
# # See https://github.com/dimforge/rapier/issues/760.
|
||||||
|
# puffin_egui = { version = "0.29", optional = true, git = "https://github.com/Vrixyz/puffin.git", branch = "expose_ui_options" }
|
||||||
|
# puffin = { version = "0.19", optional = true, git = "https://github.com/Vrixyz/puffin.git", branch = "expose_ui_options" }
|
||||||
|
# #
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
#debug = true
|
#debug = true
|
||||||
#codegen-units = 1
|
#codegen-units = 1
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ bitflags = "2"
|
|||||||
log = "0.4"
|
log = "0.4"
|
||||||
ordered-float = "4"
|
ordered-float = "4"
|
||||||
thiserror = "1"
|
thiserror = "1"
|
||||||
|
profiling = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
bincode = "1"
|
bincode = "1"
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ bitflags = "2"
|
|||||||
log = "0.4"
|
log = "0.4"
|
||||||
ordered-float = "4"
|
ordered-float = "4"
|
||||||
thiserror = "1"
|
thiserror = "1"
|
||||||
|
profiling = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
bincode = "1"
|
bincode = "1"
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ bitflags = "2"
|
|||||||
log = "0.4"
|
log = "0.4"
|
||||||
ordered-float = "4"
|
ordered-float = "4"
|
||||||
thiserror = "1"
|
thiserror = "1"
|
||||||
|
profiling = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
bincode = "1"
|
bincode = "1"
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ wavefront = ["mesh-loader/obj"]
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
thiserror = "1.0.61"
|
thiserror = "1.0.61"
|
||||||
|
profiling = "1.0"
|
||||||
mesh-loader = { version = "0.1.12", optional = true }
|
mesh-loader = { version = "0.1.12", optional = true }
|
||||||
|
|
||||||
rapier3d = { version = "0.22", path = "../rapier3d" }
|
rapier3d = { version = "0.22", path = "../rapier3d" }
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ bitflags = "2"
|
|||||||
log = "0.4"
|
log = "0.4"
|
||||||
ordered-float = "4"
|
ordered-float = "4"
|
||||||
thiserror = "1"
|
thiserror = "1"
|
||||||
|
profiling = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
bincode = "1"
|
bincode = "1"
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ edition = "2021"
|
|||||||
maintenance = { status = "actively-developed" }
|
maintenance = { status = "actively-developed" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "rapier_testbed2d"
|
name = "rapier_testbed2d_f64"
|
||||||
path = "../../src_testbed/lib.rs"
|
path = "../../src_testbed/lib.rs"
|
||||||
required-features = ["dim2"]
|
required-features = ["dim2"]
|
||||||
|
|
||||||
@@ -34,9 +34,12 @@ default = ["dim2"]
|
|||||||
dim2 = []
|
dim2 = []
|
||||||
parallel = ["rapier/parallel", "num_cpus"]
|
parallel = ["rapier/parallel", "num_cpus"]
|
||||||
other-backends = ["wrapped2d"]
|
other-backends = ["wrapped2d"]
|
||||||
|
profiling = ["dep:puffin_egui", "profiling/profile-with-puffin"]
|
||||||
|
# See https://github.com/dimforge/rapier/issues/760.
|
||||||
|
unstable-puffin-pr-235 = []
|
||||||
|
|
||||||
[package.metadata.docs.rs]
|
[package.metadata.docs.rs]
|
||||||
features = ["parallel", "other-backends"]
|
features = ["parallel", "profiling"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
nalgebra = { version = "0.33", features = ["rand", "glam027"] }
|
nalgebra = { version = "0.33", features = ["rand", "glam027"] }
|
||||||
@@ -55,7 +58,8 @@ bevy_ecs = "0.14"
|
|||||||
bevy_core_pipeline = "0.14"
|
bevy_core_pipeline = "0.14"
|
||||||
bevy_pbr = "0.14"
|
bevy_pbr = "0.14"
|
||||||
bevy_sprite = "0.14"
|
bevy_sprite = "0.14"
|
||||||
#bevy_prototype_debug_lines = "0.7"
|
profiling = "1.0"
|
||||||
|
puffin_egui = { version = "0.29", optional = true }
|
||||||
|
|
||||||
# Dependencies for native only.
|
# Dependencies for native only.
|
||||||
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
||||||
|
|||||||
@@ -34,9 +34,12 @@ default = ["dim2"]
|
|||||||
dim2 = []
|
dim2 = []
|
||||||
parallel = ["rapier/parallel", "num_cpus"]
|
parallel = ["rapier/parallel", "num_cpus"]
|
||||||
other-backends = ["wrapped2d"]
|
other-backends = ["wrapped2d"]
|
||||||
|
profiling = ["dep:puffin_egui", "profiling/profile-with-puffin"]
|
||||||
|
# See https://github.com/dimforge/rapier/issues/760.
|
||||||
|
unstable-puffin-pr-235 = []
|
||||||
|
|
||||||
[package.metadata.docs.rs]
|
[package.metadata.docs.rs]
|
||||||
features = ["parallel", "other-backends"]
|
features = ["parallel", "other-backends", "profiling"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
nalgebra = { version = "0.33", features = ["rand", "glam027"] }
|
nalgebra = { version = "0.33", features = ["rand", "glam027"] }
|
||||||
@@ -55,7 +58,8 @@ bevy_ecs = "0.14"
|
|||||||
bevy_core_pipeline = "0.14"
|
bevy_core_pipeline = "0.14"
|
||||||
bevy_pbr = "0.14"
|
bevy_pbr = "0.14"
|
||||||
bevy_sprite = "0.14"
|
bevy_sprite = "0.14"
|
||||||
#bevy_prototype_debug_lines = "0.7"
|
profiling = "1.0"
|
||||||
|
puffin_egui = { version = "0.29", optional = true }
|
||||||
|
|
||||||
# Dependencies for native only.
|
# Dependencies for native only.
|
||||||
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ edition = "2021"
|
|||||||
maintenance = { status = "actively-developed" }
|
maintenance = { status = "actively-developed" }
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
name = "rapier_testbed3d"
|
name = "rapier_testbed3d_f64"
|
||||||
path = "../../src_testbed/lib.rs"
|
path = "../../src_testbed/lib.rs"
|
||||||
required-features = ["dim3"]
|
required-features = ["dim3"]
|
||||||
|
|
||||||
@@ -36,9 +36,12 @@ rust.unexpected_cfgs = { level = "warn", check-cfg = [
|
|||||||
default = ["dim3"]
|
default = ["dim3"]
|
||||||
dim3 = []
|
dim3 = []
|
||||||
parallel = ["rapier/parallel", "num_cpus"]
|
parallel = ["rapier/parallel", "num_cpus"]
|
||||||
|
profiling = ["dep:puffin_egui", "profiling/profile-with-puffin"]
|
||||||
|
# See https://github.com/dimforge/rapier/issues/760.
|
||||||
|
unstable-puffin-pr-235 = []
|
||||||
|
|
||||||
[package.metadata.docs.rs]
|
[package.metadata.docs.rs]
|
||||||
features = ["parallel"]
|
features = ["parallel", "profiling"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
nalgebra = { version = "0.33", features = ["rand", "glam027"] }
|
nalgebra = { version = "0.33", features = ["rand", "glam027"] }
|
||||||
@@ -57,7 +60,8 @@ bevy_ecs = "0.14"
|
|||||||
bevy_core_pipeline = "0.14"
|
bevy_core_pipeline = "0.14"
|
||||||
bevy_pbr = "0.14"
|
bevy_pbr = "0.14"
|
||||||
bevy_sprite = "0.14"
|
bevy_sprite = "0.14"
|
||||||
#bevy_prototype_debug_lines = { version = "0.7", features = [ "3d" ] }
|
profiling = "1.0"
|
||||||
|
puffin_egui = { version = "0.29", optional = true, git = "https://github.com/Vrixyz/puffin.git", branch = "expose_ui_options" }
|
||||||
|
|
||||||
# Dependencies for native only.
|
# Dependencies for native only.
|
||||||
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
||||||
|
|||||||
@@ -34,9 +34,12 @@ default = ["dim3"]
|
|||||||
dim3 = []
|
dim3 = []
|
||||||
parallel = ["rapier/parallel", "num_cpus"]
|
parallel = ["rapier/parallel", "num_cpus"]
|
||||||
other-backends = ["physx", "physx-sys", "glam"]
|
other-backends = ["physx", "physx-sys", "glam"]
|
||||||
|
profiling = ["dep:puffin_egui", "profiling/profile-with-puffin"]
|
||||||
|
# See https://github.com/dimforge/rapier/issues/760.
|
||||||
|
unstable-puffin-pr-235 = []
|
||||||
|
|
||||||
[package.metadata.docs.rs]
|
[package.metadata.docs.rs]
|
||||||
features = ["parallel", "other-backends"]
|
features = ["parallel", "other-backends", "profiling"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
nalgebra = { version = "0.33", features = ["rand", "glam027"] }
|
nalgebra = { version = "0.33", features = ["rand", "glam027"] }
|
||||||
@@ -58,7 +61,8 @@ bevy_ecs = "0.14"
|
|||||||
bevy_core_pipeline = "0.14"
|
bevy_core_pipeline = "0.14"
|
||||||
bevy_pbr = "0.14"
|
bevy_pbr = "0.14"
|
||||||
bevy_sprite = "0.14"
|
bevy_sprite = "0.14"
|
||||||
#bevy_prototype_debug_lines = { version = "0.7", features = [ "3d" ] }
|
profiling = "1.0"
|
||||||
|
puffin_egui = { version = "0.29", optional = true }
|
||||||
|
|
||||||
# Dependencies for native only.
|
# Dependencies for native only.
|
||||||
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ usvg = "0.14"
|
|||||||
|
|
||||||
[dependencies.rapier_testbed2d]
|
[dependencies.rapier_testbed2d]
|
||||||
path = "../crates/rapier_testbed2d"
|
path = "../crates/rapier_testbed2d"
|
||||||
|
features = ["profiling"]
|
||||||
|
|
||||||
[dependencies.rapier2d]
|
[dependencies.rapier2d]
|
||||||
path = "../crates/rapier2d"
|
path = "../crates/rapier2d"
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#[cfg(target_arch = "wasm32")]
|
#[cfg(target_arch = "wasm32")]
|
||||||
use wasm_bindgen::prelude::*;
|
use wasm_bindgen::prelude::*;
|
||||||
extern crate rapier3d_f64 as rapier3d;
|
extern crate rapier3d_f64 as rapier3d;
|
||||||
|
extern crate rapier_testbed3d_f64 as rapier_testbed3d;
|
||||||
|
|
||||||
use inflector::Inflector;
|
use inflector::Inflector;
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ bincode = "1"
|
|||||||
|
|
||||||
[dependencies.rapier_testbed3d]
|
[dependencies.rapier_testbed3d]
|
||||||
path = "../crates/rapier_testbed3d"
|
path = "../crates/rapier_testbed3d"
|
||||||
|
features = ["profiling"]
|
||||||
|
|
||||||
[dependencies.rapier3d]
|
[dependencies.rapier3d]
|
||||||
path = "../crates/rapier3d"
|
path = "../crates/rapier3d"
|
||||||
@@ -42,4 +43,3 @@ path = "./harness_capsules3.rs"
|
|||||||
#[lib]
|
#[lib]
|
||||||
#crate-type = ["cdylib", "rlib"]
|
#crate-type = ["cdylib", "rlib"]
|
||||||
#path = "./all_examples3_wasm.rs"
|
#path = "./all_examples3_wasm.rs"
|
||||||
|
|
||||||
|
|||||||
@@ -211,6 +211,7 @@ impl KinematicCharacterController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Computes the possible movement for a shape.
|
/// Computes the possible movement for a shape.
|
||||||
|
#[profiling::function]
|
||||||
pub fn move_shape(
|
pub fn move_shape(
|
||||||
&self,
|
&self,
|
||||||
dt: Real,
|
dt: Real,
|
||||||
@@ -430,6 +431,7 @@ impl KinematicCharacterController {
|
|||||||
self.offset.eval(up_extends) + 0.05
|
self.offset.eval(up_extends) + 0.05
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
fn detect_grounded_status_and_apply_friction(
|
fn detect_grounded_status_and_apply_friction(
|
||||||
&self,
|
&self,
|
||||||
dt: Real,
|
dt: Real,
|
||||||
@@ -657,6 +659,7 @@ impl KinematicCharacterController {
|
|||||||
Vector2::new(side_extent, up_extent)
|
Vector2::new(side_extent, up_extent)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
fn handle_stairs(
|
fn handle_stairs(
|
||||||
&self,
|
&self,
|
||||||
bodies: &RigidBodySet,
|
bodies: &RigidBodySet,
|
||||||
@@ -817,6 +820,7 @@ impl KinematicCharacterController {
|
|||||||
/// impulses to the rigid-bodies surrounding the character shape at the time of the collisions.
|
/// impulses to the rigid-bodies surrounding the character shape at the time of the collisions.
|
||||||
/// Note that the impulse calculation is only approximate as it is not based on a global
|
/// Note that the impulse calculation is only approximate as it is not based on a global
|
||||||
/// constraints resolution scheme.
|
/// constraints resolution scheme.
|
||||||
|
#[profiling::function]
|
||||||
pub fn solve_character_collision_impulses<'a>(
|
pub fn solve_character_collision_impulses<'a>(
|
||||||
&self,
|
&self,
|
||||||
dt: Real,
|
dt: Real,
|
||||||
@@ -846,6 +850,7 @@ impl KinematicCharacterController {
|
|||||||
/// impulses to the rigid-bodies surrounding the character shape at the time of the collision.
|
/// impulses to the rigid-bodies surrounding the character shape at the time of the collision.
|
||||||
/// Note that the impulse calculation is only approximate as it is not based on a global
|
/// Note that the impulse calculation is only approximate as it is not based on a global
|
||||||
/// constraints resolution scheme.
|
/// constraints resolution scheme.
|
||||||
|
#[profiling::function]
|
||||||
fn solve_single_character_collision_impulse(
|
fn solve_single_character_collision_impulse(
|
||||||
&self,
|
&self,
|
||||||
dt: Real,
|
dt: Real,
|
||||||
|
|||||||
@@ -321,6 +321,7 @@ impl DynamicRayCastVehicleController {
|
|||||||
wheel.wheel_axle_ws = chassis_transform * wheel.axle_cs;
|
wheel.wheel_axle_ws = chassis_transform * wheel.axle_cs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
fn ray_cast(
|
fn ray_cast(
|
||||||
&mut self,
|
&mut self,
|
||||||
bodies: &RigidBodySet,
|
bodies: &RigidBodySet,
|
||||||
@@ -403,6 +404,7 @@ impl DynamicRayCastVehicleController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Updates the vehicle’s velocity based on its suspension, engine force, and brake.
|
/// Updates the vehicle’s velocity based on its suspension, engine force, and brake.
|
||||||
|
#[profiling::function]
|
||||||
pub fn update_vehicle(
|
pub fn update_vehicle(
|
||||||
&mut self,
|
&mut self,
|
||||||
dt: Real,
|
dt: Real,
|
||||||
@@ -531,6 +533,7 @@ impl DynamicRayCastVehicleController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
fn update_friction(&mut self, bodies: &mut RigidBodySet, colliders: &ColliderSet, dt: Real) {
|
fn update_friction(&mut self, bodies: &mut RigidBodySet, colliders: &ColliderSet, dt: Real) {
|
||||||
let num_wheels = self.wheels.len();
|
let num_wheels = self.wheels.len();
|
||||||
|
|
||||||
|
|||||||
@@ -108,6 +108,7 @@ impl CCDSolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Find the first time a CCD-enabled body has a non-sensor collider hitting another non-sensor collider.
|
/// Find the first time a CCD-enabled body has a non-sensor collider hitting another non-sensor collider.
|
||||||
|
#[profiling::function]
|
||||||
pub fn find_first_impact(
|
pub fn find_first_impact(
|
||||||
&mut self,
|
&mut self,
|
||||||
dt: Real,
|
dt: Real,
|
||||||
@@ -225,6 +226,7 @@ impl CCDSolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Outputs the set of bodies as well as their first time-of-impact event.
|
/// Outputs the set of bodies as well as their first time-of-impact event.
|
||||||
|
#[profiling::function]
|
||||||
pub fn predict_impacts_at_next_positions(
|
pub fn predict_impacts_at_next_positions(
|
||||||
&mut self,
|
&mut self,
|
||||||
dt: Real,
|
dt: Real,
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ impl TOIEntry {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn try_from_colliders<QD: ?Sized + QueryDispatcher>(
|
pub fn try_from_colliders<QD: ?Sized + QueryDispatcher>(
|
||||||
query_dispatcher: &QD,
|
query_dispatcher: &QD,
|
||||||
ch1: ColliderHandle,
|
ch1: ColliderHandle,
|
||||||
|
|||||||
@@ -244,6 +244,7 @@ impl ImpulseJointSet {
|
|||||||
///
|
///
|
||||||
/// If `wake_up` is set to `true`, then the bodies attached to this joint will be
|
/// If `wake_up` is set to `true`, then the bodies attached to this joint will be
|
||||||
/// automatically woken up during the next timestep.
|
/// automatically woken up during the next timestep.
|
||||||
|
#[profiling::function]
|
||||||
pub fn insert(
|
pub fn insert(
|
||||||
&mut self,
|
&mut self,
|
||||||
body1: RigidBodyHandle,
|
body1: RigidBodyHandle,
|
||||||
@@ -329,6 +330,7 @@ impl ImpulseJointSet {
|
|||||||
///
|
///
|
||||||
/// If `wake_up` is set to `true`, then the bodies attached to this joint will be
|
/// If `wake_up` is set to `true`, then the bodies attached to this joint will be
|
||||||
/// automatically woken up.
|
/// automatically woken up.
|
||||||
|
#[profiling::function]
|
||||||
pub fn remove(&mut self, handle: ImpulseJointHandle, wake_up: bool) -> Option<ImpulseJoint> {
|
pub fn remove(&mut self, handle: ImpulseJointHandle, wake_up: bool) -> Option<ImpulseJoint> {
|
||||||
let id = self.joint_ids.remove(handle.0)?;
|
let id = self.joint_ids.remove(handle.0)?;
|
||||||
let endpoints = self.joint_graph.graph.edge_endpoints(id)?;
|
let endpoints = self.joint_graph.graph.edge_endpoints(id)?;
|
||||||
@@ -356,6 +358,7 @@ impl ImpulseJointSet {
|
|||||||
/// The provided rigid-body handle is not required to identify a rigid-body that
|
/// The provided rigid-body handle is not required to identify a rigid-body that
|
||||||
/// is still contained by the `bodies` component set.
|
/// is still contained by the `bodies` component set.
|
||||||
/// Returns the (now invalid) handles of the removed impulse_joints.
|
/// Returns the (now invalid) handles of the removed impulse_joints.
|
||||||
|
#[profiling::function]
|
||||||
pub fn remove_joints_attached_to_rigid_body(
|
pub fn remove_joints_attached_to_rigid_body(
|
||||||
&mut self,
|
&mut self,
|
||||||
handle: RigidBodyHandle,
|
handle: RigidBodyHandle,
|
||||||
|
|||||||
@@ -489,6 +489,7 @@ impl Multibody {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Computes the constant terms of the dynamics.
|
/// Computes the constant terms of the dynamics.
|
||||||
|
#[profiling::function]
|
||||||
pub(crate) fn update_dynamics(&mut self, dt: Real, bodies: &mut RigidBodySet) {
|
pub(crate) fn update_dynamics(&mut self, dt: Real, bodies: &mut RigidBodySet) {
|
||||||
/*
|
/*
|
||||||
* Compute velocities.
|
* Compute velocities.
|
||||||
@@ -1094,6 +1095,7 @@ impl Multibody {
|
|||||||
/// is the sum of the current position of `self` and this `displacement`.
|
/// is the sum of the current position of `self` and this `displacement`.
|
||||||
// TODO: this shares a lot of code with `forward_kinematics` and `update_body_jacobians`, except
|
// TODO: this shares a lot of code with `forward_kinematics` and `update_body_jacobians`, except
|
||||||
// that we are only traversing a single kinematic chain. Could this be refactored?
|
// that we are only traversing a single kinematic chain. Could this be refactored?
|
||||||
|
#[profiling::function]
|
||||||
pub fn forward_kinematics_single_branch(
|
pub fn forward_kinematics_single_branch(
|
||||||
&self,
|
&self,
|
||||||
bodies: &RigidBodySet,
|
bodies: &RigidBodySet,
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ impl Multibody {
|
|||||||
/// desired transform.
|
/// desired transform.
|
||||||
///
|
///
|
||||||
/// The displacement calculated by this function is added to the `displacement` vector.
|
/// The displacement calculated by this function is added to the `displacement` vector.
|
||||||
|
#[profiling::function]
|
||||||
pub fn inverse_kinematics_delta_with_jacobian(
|
pub fn inverse_kinematics_delta_with_jacobian(
|
||||||
jacobian: &Jacobian<Real>,
|
jacobian: &Jacobian<Real>,
|
||||||
desired_movement: &SpacialVector<Real>,
|
desired_movement: &SpacialVector<Real>,
|
||||||
@@ -88,6 +89,7 @@ impl Multibody {
|
|||||||
/// can be moved through the inverse-kinematics process. Any joint for which `joint_can_move`
|
/// can be moved through the inverse-kinematics process. Any joint for which `joint_can_move`
|
||||||
/// returns `false` will have its corresponding displacement constrained to 0.
|
/// returns `false` will have its corresponding displacement constrained to 0.
|
||||||
/// Set the closure to `|_| true` if all the joints are free to move.
|
/// Set the closure to `|_| true` if all the joints are free to move.
|
||||||
|
#[profiling::function]
|
||||||
pub fn inverse_kinematics(
|
pub fn inverse_kinematics(
|
||||||
&self,
|
&self,
|
||||||
bodies: &RigidBodySet,
|
bodies: &RigidBodySet,
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ impl MultibodyJoint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Integrate the position of this multibody_joint.
|
/// Integrate the position of this multibody_joint.
|
||||||
|
#[profiling::function]
|
||||||
pub fn integrate(&mut self, dt: Real, vels: &[Real]) {
|
pub fn integrate(&mut self, dt: Real, vels: &[Real]) {
|
||||||
let locked_bits = self.data.locked_axes.bits();
|
let locked_bits = self.data.locked_axes.bits();
|
||||||
let mut curr_free_dof = 0;
|
let mut curr_free_dof = 0;
|
||||||
|
|||||||
@@ -153,6 +153,7 @@ impl MultibodyJointSet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Inserts a new multibody_joint into this set.
|
/// Inserts a new multibody_joint into this set.
|
||||||
|
#[profiling::function]
|
||||||
fn do_insert(
|
fn do_insert(
|
||||||
&mut self,
|
&mut self,
|
||||||
body1: RigidBodyHandle,
|
body1: RigidBodyHandle,
|
||||||
@@ -213,6 +214,7 @@ impl MultibodyJointSet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Removes a multibody_joint from this set.
|
/// Removes a multibody_joint from this set.
|
||||||
|
#[profiling::function]
|
||||||
pub fn remove(&mut self, handle: MultibodyJointHandle, wake_up: bool) {
|
pub fn remove(&mut self, handle: MultibodyJointHandle, wake_up: bool) {
|
||||||
if let Some(removed) = self.rb2mb.get(handle.0).copied() {
|
if let Some(removed) = self.rb2mb.get(handle.0).copied() {
|
||||||
let multibody = self.multibodies.remove(removed.multibody.0).unwrap();
|
let multibody = self.multibodies.remove(removed.multibody.0).unwrap();
|
||||||
@@ -259,6 +261,7 @@ impl MultibodyJointSet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Removes all the multibody_joints from the multibody the given rigid-body is part of.
|
/// Removes all the multibody_joints from the multibody the given rigid-body is part of.
|
||||||
|
#[profiling::function]
|
||||||
pub fn remove_multibody_articulations(&mut self, handle: RigidBodyHandle, wake_up: bool) {
|
pub fn remove_multibody_articulations(&mut self, handle: RigidBodyHandle, wake_up: bool) {
|
||||||
if let Some(removed) = self.rb2mb.get(handle.0).copied() {
|
if let Some(removed) = self.rb2mb.get(handle.0).copied() {
|
||||||
// Remove the multibody.
|
// Remove the multibody.
|
||||||
@@ -281,6 +284,7 @@ impl MultibodyJointSet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Removes all the multibody joints attached to a rigid-body.
|
/// Removes all the multibody joints attached to a rigid-body.
|
||||||
|
#[profiling::function]
|
||||||
pub fn remove_joints_attached_to_rigid_body(&mut self, rb_to_remove: RigidBodyHandle) {
|
pub fn remove_joints_attached_to_rigid_body(&mut self, rb_to_remove: RigidBodyHandle) {
|
||||||
// TODO: optimize this.
|
// TODO: optimize this.
|
||||||
if let Some(link_to_remove) = self.rb2mb.get(rb_to_remove.0).copied() {
|
if let Some(link_to_remove) = self.rb2mb.get(rb_to_remove.0).copied() {
|
||||||
@@ -412,6 +416,7 @@ impl MultibodyJointSet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Iterates through all the joints attached to the given rigid-body.
|
/// Iterates through all the joints attached to the given rigid-body.
|
||||||
|
#[profiling::function]
|
||||||
pub fn attached_joints(
|
pub fn attached_joints(
|
||||||
&self,
|
&self,
|
||||||
rb: RigidBodyHandle,
|
rb: RigidBodyHandle,
|
||||||
@@ -441,6 +446,7 @@ impl MultibodyJointSet {
|
|||||||
|
|
||||||
/// Iterate through the handles of all the rigid-bodies attached to this rigid-body
|
/// Iterate through the handles of all the rigid-bodies attached to this rigid-body
|
||||||
/// by an enabled multibody_joint.
|
/// by an enabled multibody_joint.
|
||||||
|
#[profiling::function]
|
||||||
pub fn bodies_attached_with_enabled_joint(
|
pub fn bodies_attached_with_enabled_joint(
|
||||||
&self,
|
&self,
|
||||||
body: RigidBodyHandle,
|
body: RigidBodyHandle,
|
||||||
|
|||||||
@@ -1016,6 +1016,7 @@ impl RigidBody {
|
|||||||
/// Applies an impulse at the center-of-mass of this rigid-body.
|
/// Applies an impulse at the center-of-mass of this rigid-body.
|
||||||
/// The impulse is applied right away, changing the linear velocity.
|
/// The impulse is applied right away, changing the linear velocity.
|
||||||
/// This does nothing on non-dynamic bodies.
|
/// This does nothing on non-dynamic bodies.
|
||||||
|
#[profiling::function]
|
||||||
pub fn apply_impulse(&mut self, impulse: Vector<Real>, wake_up: bool) {
|
pub fn apply_impulse(&mut self, impulse: Vector<Real>, wake_up: bool) {
|
||||||
if !impulse.is_zero() && self.body_type == RigidBodyType::Dynamic {
|
if !impulse.is_zero() && self.body_type == RigidBodyType::Dynamic {
|
||||||
self.vels.linvel += impulse.component_mul(&self.mprops.effective_inv_mass);
|
self.vels.linvel += impulse.component_mul(&self.mprops.effective_inv_mass);
|
||||||
@@ -1030,6 +1031,7 @@ impl RigidBody {
|
|||||||
/// The impulse is applied right away, changing the angular velocity.
|
/// The impulse is applied right away, changing the angular velocity.
|
||||||
/// This does nothing on non-dynamic bodies.
|
/// This does nothing on non-dynamic bodies.
|
||||||
#[cfg(feature = "dim2")]
|
#[cfg(feature = "dim2")]
|
||||||
|
#[profiling::function]
|
||||||
pub fn apply_torque_impulse(&mut self, torque_impulse: Real, wake_up: bool) {
|
pub fn apply_torque_impulse(&mut self, torque_impulse: Real, wake_up: bool) {
|
||||||
if !torque_impulse.is_zero() && self.body_type == RigidBodyType::Dynamic {
|
if !torque_impulse.is_zero() && self.body_type == RigidBodyType::Dynamic {
|
||||||
self.vels.angvel += self.mprops.effective_world_inv_inertia_sqrt
|
self.vels.angvel += self.mprops.effective_world_inv_inertia_sqrt
|
||||||
@@ -1045,6 +1047,7 @@ impl RigidBody {
|
|||||||
/// The impulse is applied right away, changing the angular velocity.
|
/// The impulse is applied right away, changing the angular velocity.
|
||||||
/// This does nothing on non-dynamic bodies.
|
/// This does nothing on non-dynamic bodies.
|
||||||
#[cfg(feature = "dim3")]
|
#[cfg(feature = "dim3")]
|
||||||
|
#[profiling::function]
|
||||||
pub fn apply_torque_impulse(&mut self, torque_impulse: Vector<Real>, wake_up: bool) {
|
pub fn apply_torque_impulse(&mut self, torque_impulse: Vector<Real>, wake_up: bool) {
|
||||||
if !torque_impulse.is_zero() && self.body_type == RigidBodyType::Dynamic {
|
if !torque_impulse.is_zero() && self.body_type == RigidBodyType::Dynamic {
|
||||||
self.vels.angvel += self.mprops.effective_world_inv_inertia_sqrt
|
self.vels.angvel += self.mprops.effective_world_inv_inertia_sqrt
|
||||||
|
|||||||
@@ -624,6 +624,7 @@ impl RigidBodyVelocity {
|
|||||||
|
|
||||||
/// The kinetic energy of this rigid-body.
|
/// The kinetic energy of this rigid-body.
|
||||||
#[must_use]
|
#[must_use]
|
||||||
|
#[profiling::function]
|
||||||
pub fn kinetic_energy(&self, rb_mprops: &RigidBodyMassProps) -> Real {
|
pub fn kinetic_energy(&self, rb_mprops: &RigidBodyMassProps) -> Real {
|
||||||
let mut energy = (rb_mprops.mass() * self.linvel.norm_squared()) / 2.0;
|
let mut energy = (rb_mprops.mass() * self.linvel.norm_squared()) / 2.0;
|
||||||
|
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ impl RigidBodySet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Removes a rigid-body, and all its attached colliders and impulse_joints, from these sets.
|
/// Removes a rigid-body, and all its attached colliders and impulse_joints, from these sets.
|
||||||
|
#[profiling::function]
|
||||||
pub fn remove(
|
pub fn remove(
|
||||||
&mut self,
|
&mut self,
|
||||||
handle: RigidBodyHandle,
|
handle: RigidBodyHandle,
|
||||||
|
|||||||
@@ -454,6 +454,7 @@ impl ContactConstraintsSet {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn solve_restitution(
|
pub fn solve_restitution(
|
||||||
&mut self,
|
&mut self,
|
||||||
solver_vels: &mut [SolverVel<Real>],
|
solver_vels: &mut [SolverVel<Real>],
|
||||||
@@ -465,6 +466,7 @@ impl ContactConstraintsSet {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn solve_restitution_wo_bias(
|
pub fn solve_restitution_wo_bias(
|
||||||
&mut self,
|
&mut self,
|
||||||
solver_vels: &mut [SolverVel<Real>],
|
solver_vels: &mut [SolverVel<Real>],
|
||||||
@@ -477,6 +479,7 @@ impl ContactConstraintsSet {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn solve_friction(
|
pub fn solve_friction(
|
||||||
&mut self,
|
&mut self,
|
||||||
solver_vels: &mut [SolverVel<Real>],
|
solver_vels: &mut [SolverVel<Real>],
|
||||||
@@ -495,6 +498,7 @@ impl ContactConstraintsSet {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn update(
|
pub fn update(
|
||||||
&mut self,
|
&mut self,
|
||||||
params: &IntegrationParameters,
|
params: &IntegrationParameters,
|
||||||
|
|||||||
@@ -272,6 +272,7 @@ impl GenericOneBodyConstraint {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn solve(
|
pub fn solve(
|
||||||
&mut self,
|
&mut self,
|
||||||
jacobians: &DVector<Real>,
|
jacobians: &DVector<Real>,
|
||||||
|
|||||||
@@ -218,6 +218,7 @@ impl InteractionGroups {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "simd-is-enabled")]
|
#[cfg(feature = "simd-is-enabled")]
|
||||||
|
#[profiling::function]
|
||||||
pub fn group_joints(
|
pub fn group_joints(
|
||||||
&mut self,
|
&mut self,
|
||||||
island_id: usize,
|
island_id: usize,
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ impl IslandSolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn init_and_solve(
|
pub fn init_and_solve(
|
||||||
&mut self,
|
&mut self,
|
||||||
island_id: usize,
|
island_id: usize,
|
||||||
|
|||||||
@@ -361,6 +361,7 @@ impl JointConstraintsSet {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn solve(
|
pub fn solve(
|
||||||
&mut self,
|
&mut self,
|
||||||
solver_vels: &mut [SolverVel<Real>],
|
solver_vels: &mut [SolverVel<Real>],
|
||||||
@@ -391,6 +392,7 @@ impl JointConstraintsSet {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn update(
|
pub fn update(
|
||||||
&mut self,
|
&mut self,
|
||||||
params: &IntegrationParameters,
|
params: &IntegrationParameters,
|
||||||
|
|||||||
@@ -110,6 +110,7 @@ pub struct JointTwoBodyConstraint<N: SimdRealCopy, const LANES: usize> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<N: SimdRealCopy, const LANES: usize> JointTwoBodyConstraint<N, LANES> {
|
impl<N: SimdRealCopy, const LANES: usize> JointTwoBodyConstraint<N, LANES> {
|
||||||
|
#[profiling::function]
|
||||||
pub fn solve_generic(
|
pub fn solve_generic(
|
||||||
&mut self,
|
&mut self,
|
||||||
solver_vel1: &mut SolverVel<N>,
|
solver_vel1: &mut SolverVel<N>,
|
||||||
|
|||||||
@@ -160,6 +160,7 @@ impl ParallelIslandSolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn init_and_solve<'s>(
|
pub fn init_and_solve<'s>(
|
||||||
&'s mut self,
|
&'s mut self,
|
||||||
scope: &Scope<'s>,
|
scope: &Scope<'s>,
|
||||||
|
|||||||
@@ -149,6 +149,7 @@ impl VelocitySolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn solve_constraints(
|
pub fn solve_constraints(
|
||||||
&mut self,
|
&mut self,
|
||||||
params: &IntegrationParameters,
|
params: &IntegrationParameters,
|
||||||
@@ -221,6 +222,7 @@ impl VelocitySolver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn integrate_positions(
|
pub fn integrate_positions(
|
||||||
&mut self,
|
&mut self,
|
||||||
params: &IntegrationParameters,
|
params: &IntegrationParameters,
|
||||||
|
|||||||
@@ -254,6 +254,7 @@ impl BroadPhaseMultiSap {
|
|||||||
/// This will:
|
/// This will:
|
||||||
/// - Remove all the subregion proxies from the larger layer.
|
/// - Remove all the subregion proxies from the larger layer.
|
||||||
/// - Pre-insert all the smaller layer's region proxies into this layer.
|
/// - Pre-insert all the smaller layer's region proxies into this layer.
|
||||||
|
#[profiling::function]
|
||||||
fn finalize_layer_insertion(&mut self, layer_id: u8) {
|
fn finalize_layer_insertion(&mut self, layer_id: u8) {
|
||||||
// Remove all the region endpoints from the larger layer.
|
// Remove all the region endpoints from the larger layer.
|
||||||
// They will be automatically replaced by the new layer's regions.
|
// They will be automatically replaced by the new layer's regions.
|
||||||
@@ -289,6 +290,7 @@ impl BroadPhaseMultiSap {
|
|||||||
/// the `update` function.
|
/// the `update` function.
|
||||||
/// 4. All the regions from the smaller layer are added to that new
|
/// 4. All the regions from the smaller layer are added to that new
|
||||||
/// layer.
|
/// layer.
|
||||||
|
#[profiling::function]
|
||||||
fn ensure_layer_exists(&mut self, new_depth: i8) -> u8 {
|
fn ensure_layer_exists(&mut self, new_depth: i8) -> u8 {
|
||||||
// Special case: we don't have any layers yet.
|
// Special case: we don't have any layers yet.
|
||||||
if self.layers.is_empty() {
|
if self.layers.is_empty() {
|
||||||
@@ -473,6 +475,7 @@ impl BroadPhaseMultiSap {
|
|||||||
/// added to its larger layer so we can detect when an object
|
/// added to its larger layer so we can detect when an object
|
||||||
/// in a larger layer may start interacting with objects in a smaller
|
/// in a larger layer may start interacting with objects in a smaller
|
||||||
/// layer.
|
/// layer.
|
||||||
|
#[profiling::function]
|
||||||
fn propagate_created_regions(&mut self) {
|
fn propagate_created_regions(&mut self) {
|
||||||
let mut curr_layer = Some(self.smallest_layer);
|
let mut curr_layer = Some(self.smallest_layer);
|
||||||
|
|
||||||
@@ -502,6 +505,7 @@ impl BroadPhaseMultiSap {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
fn update_layers_and_find_pairs(&mut self, out_events: &mut Vec<BroadPhasePairEvent>) {
|
fn update_layers_and_find_pairs(&mut self, out_events: &mut Vec<BroadPhasePairEvent>) {
|
||||||
if self.layers.is_empty() {
|
if self.layers.is_empty() {
|
||||||
return;
|
return;
|
||||||
@@ -579,6 +583,7 @@ impl BroadPhaseMultiSap {
|
|||||||
|
|
||||||
impl BroadPhase for BroadPhaseMultiSap {
|
impl BroadPhase for BroadPhaseMultiSap {
|
||||||
/// Updates the broad-phase, taking into account the new collider positions.
|
/// Updates the broad-phase, taking into account the new collider positions.
|
||||||
|
#[profiling::function]
|
||||||
fn update(
|
fn update(
|
||||||
&mut self,
|
&mut self,
|
||||||
dt: Real,
|
dt: Real,
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ impl SAPAxis {
|
|||||||
self.endpoints.push(SAPEndpoint::end_sentinel());
|
self.endpoints.push(SAPEndpoint::end_sentinel());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn batch_insert(
|
pub fn batch_insert(
|
||||||
&mut self,
|
&mut self,
|
||||||
dim: usize,
|
dim: usize,
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ impl SAPLayer {
|
|||||||
/// Deletes from all the regions of this layer, all the endpoints corresponding
|
/// Deletes from all the regions of this layer, all the endpoints corresponding
|
||||||
/// to subregions. Clears the arrays of subregions indices from all the regions of
|
/// to subregions. Clears the arrays of subregions indices from all the regions of
|
||||||
/// this layer.
|
/// this layer.
|
||||||
|
#[profiling::function]
|
||||||
pub fn unregister_all_subregions(&mut self, proxies: &mut SAPProxies) {
|
pub fn unregister_all_subregions(&mut self, proxies: &mut SAPProxies) {
|
||||||
for region_id in self.regions.values() {
|
for region_id in self.regions.values() {
|
||||||
// Extract the region to make the borrow-checker happy.
|
// Extract the region to make the borrow-checker happy.
|
||||||
@@ -108,6 +109,7 @@ impl SAPLayer {
|
|||||||
/// that subregion center. Because the hierarchical grid cells have aligned boundaries
|
/// that subregion center. Because the hierarchical grid cells have aligned boundaries
|
||||||
/// at each depth, we have the guarantee that a given subregion will only be part of
|
/// at each depth, we have the guarantee that a given subregion will only be part of
|
||||||
/// one region on its parent "larger" layer.
|
/// one region on its parent "larger" layer.
|
||||||
|
#[profiling::function]
|
||||||
fn register_subregion(
|
fn register_subregion(
|
||||||
&mut self,
|
&mut self,
|
||||||
proxy_id: BroadPhaseProxyIndex,
|
proxy_id: BroadPhaseProxyIndex,
|
||||||
@@ -145,6 +147,7 @@ impl SAPLayer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
fn unregister_subregion(
|
fn unregister_subregion(
|
||||||
&mut self,
|
&mut self,
|
||||||
proxy_id: BroadPhaseProxyIndex,
|
proxy_id: BroadPhaseProxyIndex,
|
||||||
@@ -273,6 +276,7 @@ impl SAPLayer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn predelete_proxy(&mut self, proxies: &mut SAPProxies, proxy_index: BroadPhaseProxyIndex) {
|
pub fn predelete_proxy(&mut self, proxies: &mut SAPProxies, proxy_index: BroadPhaseProxyIndex) {
|
||||||
// Discretize the Aabb to find the regions that need to be invalidated.
|
// Discretize the Aabb to find the regions that need to be invalidated.
|
||||||
let proxy_aabb = &mut proxies[proxy_index].aabb;
|
let proxy_aabb = &mut proxies[proxy_index].aabb;
|
||||||
|
|||||||
@@ -214,6 +214,7 @@ impl SAPRegion {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn update(
|
pub fn update(
|
||||||
&mut self,
|
&mut self,
|
||||||
proxies: &SAPProxies,
|
proxies: &SAPProxies,
|
||||||
|
|||||||
@@ -186,6 +186,7 @@ impl ContactPair {
|
|||||||
///
|
///
|
||||||
/// Returns a reference to the contact, as well as the contact manifold
|
/// Returns a reference to the contact, as well as the contact manifold
|
||||||
/// it is part of.
|
/// it is part of.
|
||||||
|
#[profiling::function]
|
||||||
pub fn find_deepest_contact(&self) -> Option<(&ContactManifold, &Contact)> {
|
pub fn find_deepest_contact(&self) -> Option<(&ContactManifold, &Contact)> {
|
||||||
let mut deepest = None;
|
let mut deepest = None;
|
||||||
|
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ impl<N: Copy, E> InteractionGraph<N, E> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// The interaction between the two collision objects identified by their graph index.
|
/// The interaction between the two collision objects identified by their graph index.
|
||||||
|
#[profiling::function]
|
||||||
pub fn interaction_pair(
|
pub fn interaction_pair(
|
||||||
&self,
|
&self,
|
||||||
id1: ColliderGraphIndex,
|
id1: ColliderGraphIndex,
|
||||||
@@ -111,6 +112,7 @@ impl<N: Copy, E> InteractionGraph<N, E> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// The interaction between the two collision objects identified by their graph index.
|
/// The interaction between the two collision objects identified by their graph index.
|
||||||
|
#[profiling::function]
|
||||||
pub fn interaction_pair_mut(
|
pub fn interaction_pair_mut(
|
||||||
&mut self,
|
&mut self,
|
||||||
id1: ColliderGraphIndex,
|
id1: ColliderGraphIndex,
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ pub enum MeshConverter {
|
|||||||
impl MeshConverter {
|
impl MeshConverter {
|
||||||
/// Applies the conversion rule described by this [`MeshConverter`] to build a shape from
|
/// Applies the conversion rule described by this [`MeshConverter`] to build a shape from
|
||||||
/// the given vertex and index buffers.
|
/// the given vertex and index buffers.
|
||||||
|
#[profiling::function]
|
||||||
pub fn convert(
|
pub fn convert(
|
||||||
&self,
|
&self,
|
||||||
vertices: Vec<Point<Real>>,
|
vertices: Vec<Point<Real>>,
|
||||||
|
|||||||
@@ -268,6 +268,7 @@ impl NarrowPhase {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
/// Maintain the narrow-phase internal state by taking collider removal into account.
|
/// Maintain the narrow-phase internal state by taking collider removal into account.
|
||||||
|
#[profiling::function]
|
||||||
pub fn handle_user_changes(
|
pub fn handle_user_changes(
|
||||||
&mut self,
|
&mut self,
|
||||||
mut islands: Option<&mut IslandManager>,
|
mut islands: Option<&mut IslandManager>,
|
||||||
@@ -321,6 +322,7 @@ impl NarrowPhase {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub(crate) fn remove_collider(
|
pub(crate) fn remove_collider(
|
||||||
&mut self,
|
&mut self,
|
||||||
intersection_graph_id: ColliderGraphIndex,
|
intersection_graph_id: ColliderGraphIndex,
|
||||||
@@ -412,6 +414,7 @@ impl NarrowPhase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub(crate) fn handle_user_changes_on_colliders(
|
pub(crate) fn handle_user_changes_on_colliders(
|
||||||
&mut self,
|
&mut self,
|
||||||
mut islands: Option<&mut IslandManager>,
|
mut islands: Option<&mut IslandManager>,
|
||||||
@@ -513,6 +516,7 @@ impl NarrowPhase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
fn remove_pair(
|
fn remove_pair(
|
||||||
&mut self,
|
&mut self,
|
||||||
islands: Option<&mut IslandManager>,
|
islands: Option<&mut IslandManager>,
|
||||||
@@ -584,6 +588,7 @@ impl NarrowPhase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
fn add_pair(&mut self, colliders: &ColliderSet, pair: &ColliderPair) {
|
fn add_pair(&mut self, colliders: &ColliderSet, pair: &ColliderPair) {
|
||||||
if let (Some(co1), Some(co2)) =
|
if let (Some(co1), Some(co2)) =
|
||||||
(colliders.get(pair.collider1), colliders.get(pair.collider2))
|
(colliders.get(pair.collider1), colliders.get(pair.collider2))
|
||||||
@@ -687,6 +692,7 @@ impl NarrowPhase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub(crate) fn compute_intersections(
|
pub(crate) fn compute_intersections(
|
||||||
&mut self,
|
&mut self,
|
||||||
bodies: &RigidBodySet,
|
bodies: &RigidBodySet,
|
||||||
@@ -785,6 +791,7 @@ impl NarrowPhase {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub(crate) fn compute_contacts(
|
pub(crate) fn compute_contacts(
|
||||||
&mut self,
|
&mut self,
|
||||||
prediction_distance: Real,
|
prediction_distance: Real,
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ impl DebugRenderPipeline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Render the scene.
|
/// Render the scene.
|
||||||
|
#[profiling::function]
|
||||||
pub fn render(
|
pub fn render(
|
||||||
&mut self,
|
&mut self,
|
||||||
backend: &mut impl DebugRenderBackend,
|
backend: &mut impl DebugRenderBackend,
|
||||||
@@ -101,6 +102,7 @@ impl DebugRenderPipeline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Render contact.
|
/// Render contact.
|
||||||
|
#[profiling::function]
|
||||||
pub fn render_contacts(
|
pub fn render_contacts(
|
||||||
&mut self,
|
&mut self,
|
||||||
backend: &mut impl DebugRenderBackend,
|
backend: &mut impl DebugRenderBackend,
|
||||||
@@ -167,6 +169,7 @@ impl DebugRenderPipeline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Render only the joints from the scene.
|
/// Render only the joints from the scene.
|
||||||
|
#[profiling::function]
|
||||||
pub fn render_joints(
|
pub fn render_joints(
|
||||||
&mut self,
|
&mut self,
|
||||||
backend: &mut impl DebugRenderBackend,
|
backend: &mut impl DebugRenderBackend,
|
||||||
@@ -249,6 +252,7 @@ impl DebugRenderPipeline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Render only the rigid-bodies from the scene.
|
/// Render only the rigid-bodies from the scene.
|
||||||
|
#[profiling::function]
|
||||||
pub fn render_rigid_bodies(
|
pub fn render_rigid_bodies(
|
||||||
&mut self,
|
&mut self,
|
||||||
backend: &mut impl DebugRenderBackend,
|
backend: &mut impl DebugRenderBackend,
|
||||||
@@ -288,6 +292,7 @@ impl DebugRenderPipeline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Render only the colliders from the scene.
|
/// Render only the colliders from the scene.
|
||||||
|
#[profiling::function]
|
||||||
pub fn render_colliders(
|
pub fn render_colliders(
|
||||||
&mut self,
|
&mut self,
|
||||||
backend: &mut impl DebugRenderBackend,
|
backend: &mut impl DebugRenderBackend,
|
||||||
@@ -351,6 +356,7 @@ impl DebugRenderPipeline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "dim2")]
|
#[cfg(feature = "dim2")]
|
||||||
|
#[profiling::function]
|
||||||
fn render_shape(
|
fn render_shape(
|
||||||
&mut self,
|
&mut self,
|
||||||
object: DebugRenderObject,
|
object: DebugRenderObject,
|
||||||
@@ -458,6 +464,7 @@ impl DebugRenderPipeline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "dim3")]
|
#[cfg(feature = "dim3")]
|
||||||
|
#[profiling::function]
|
||||||
fn render_shape(
|
fn render_shape(
|
||||||
&mut self,
|
&mut self,
|
||||||
object: DebugRenderObject,
|
object: DebugRenderObject,
|
||||||
|
|||||||
@@ -312,6 +312,7 @@ impl QueryPipeline {
|
|||||||
|
|
||||||
/// Update the query pipeline incrementally, avoiding a complete rebuild of its
|
/// Update the query pipeline incrementally, avoiding a complete rebuild of its
|
||||||
/// internal data-structure.
|
/// internal data-structure.
|
||||||
|
#[profiling::function]
|
||||||
pub fn update_incremental(
|
pub fn update_incremental(
|
||||||
&mut self,
|
&mut self,
|
||||||
colliders: &ColliderSet,
|
colliders: &ColliderSet,
|
||||||
@@ -353,6 +354,7 @@ impl QueryPipeline {
|
|||||||
/// volume generator.
|
/// volume generator.
|
||||||
///
|
///
|
||||||
/// See [`generators`] for available generators.
|
/// See [`generators`] for available generators.
|
||||||
|
#[profiling::function]
|
||||||
pub fn update_with_generator(&mut self, mode: impl QbvhDataGenerator<ColliderHandle>) {
|
pub fn update_with_generator(&mut self, mode: impl QbvhDataGenerator<ColliderHandle>) {
|
||||||
self.qbvh.clear_and_rebuild(mode, self.dilation_factor);
|
self.qbvh.clear_and_rebuild(mode, self.dilation_factor);
|
||||||
}
|
}
|
||||||
@@ -368,6 +370,7 @@ impl QueryPipeline {
|
|||||||
/// it starts inside of a shape. If this `false` then the ray will hit the shape's boundary
|
/// it starts inside of a shape. If this `false` then the ray will hit the shape's boundary
|
||||||
/// even if its starts inside of it.
|
/// even if its starts inside of it.
|
||||||
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
||||||
|
#[profiling::function]
|
||||||
pub fn cast_ray(
|
pub fn cast_ray(
|
||||||
&self,
|
&self,
|
||||||
bodies: &RigidBodySet,
|
bodies: &RigidBodySet,
|
||||||
@@ -395,6 +398,7 @@ impl QueryPipeline {
|
|||||||
/// it starts inside of a shape. If this `false` then the ray will hit the shape's boundary
|
/// it starts inside of a shape. If this `false` then the ray will hit the shape's boundary
|
||||||
/// even if its starts inside of it.
|
/// even if its starts inside of it.
|
||||||
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
||||||
|
#[profiling::function]
|
||||||
pub fn cast_ray_and_get_normal(
|
pub fn cast_ray_and_get_normal(
|
||||||
&self,
|
&self,
|
||||||
bodies: &RigidBodySet,
|
bodies: &RigidBodySet,
|
||||||
@@ -429,6 +433,7 @@ impl QueryPipeline {
|
|||||||
/// * `callback`: function executed on each collider for which a ray intersection has been found.
|
/// * `callback`: function executed on each collider for which a ray intersection has been found.
|
||||||
/// There is no guarantees on the order the results will be yielded. If this callback returns `false`,
|
/// There is no guarantees on the order the results will be yielded. If this callback returns `false`,
|
||||||
/// this method will exit early, ignore any further raycast.
|
/// this method will exit early, ignore any further raycast.
|
||||||
|
#[profiling::function]
|
||||||
pub fn intersections_with_ray<'a>(
|
pub fn intersections_with_ray<'a>(
|
||||||
&self,
|
&self,
|
||||||
bodies: &'a RigidBodySet,
|
bodies: &'a RigidBodySet,
|
||||||
@@ -465,6 +470,7 @@ impl QueryPipeline {
|
|||||||
/// * `shape_pos` - The position of the shape used for the intersection test.
|
/// * `shape_pos` - The position of the shape used for the intersection test.
|
||||||
/// * `shape` - The shape used for the intersection test.
|
/// * `shape` - The shape used for the intersection test.
|
||||||
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
||||||
|
#[profiling::function]
|
||||||
pub fn intersection_with_shape(
|
pub fn intersection_with_shape(
|
||||||
&self,
|
&self,
|
||||||
bodies: &RigidBodySet,
|
bodies: &RigidBodySet,
|
||||||
@@ -501,6 +507,7 @@ impl QueryPipeline {
|
|||||||
/// (if the point is located inside of an hollow shape, it is projected on the shape's
|
/// (if the point is located inside of an hollow shape, it is projected on the shape's
|
||||||
/// boundary).
|
/// boundary).
|
||||||
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
||||||
|
#[profiling::function]
|
||||||
pub fn project_point(
|
pub fn project_point(
|
||||||
&self,
|
&self,
|
||||||
bodies: &RigidBodySet,
|
bodies: &RigidBodySet,
|
||||||
@@ -526,6 +533,7 @@ impl QueryPipeline {
|
|||||||
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
||||||
/// * `callback` - A function called with each collider with a shape
|
/// * `callback` - A function called with each collider with a shape
|
||||||
/// containing the `point`.
|
/// containing the `point`.
|
||||||
|
#[profiling::function]
|
||||||
pub fn intersections_with_point(
|
pub fn intersections_with_point(
|
||||||
&self,
|
&self,
|
||||||
bodies: &RigidBodySet,
|
bodies: &RigidBodySet,
|
||||||
@@ -562,6 +570,7 @@ impl QueryPipeline {
|
|||||||
/// (if the point is located inside of an hollow shape, it is projected on the shape's
|
/// (if the point is located inside of an hollow shape, it is projected on the shape's
|
||||||
/// boundary).
|
/// boundary).
|
||||||
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
||||||
|
#[profiling::function]
|
||||||
pub fn project_point_and_get_feature(
|
pub fn project_point_and_get_feature(
|
||||||
&self,
|
&self,
|
||||||
bodies: &RigidBodySet,
|
bodies: &RigidBodySet,
|
||||||
@@ -578,6 +587,7 @@ impl QueryPipeline {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Finds all handles of all the colliders with an [`Aabb`] intersecting the given [`Aabb`].
|
/// Finds all handles of all the colliders with an [`Aabb`] intersecting the given [`Aabb`].
|
||||||
|
#[profiling::function]
|
||||||
pub fn colliders_with_aabb_intersecting_aabb(
|
pub fn colliders_with_aabb_intersecting_aabb(
|
||||||
&self,
|
&self,
|
||||||
aabb: &Aabb,
|
aabb: &Aabb,
|
||||||
@@ -604,6 +614,7 @@ impl QueryPipeline {
|
|||||||
/// the shape is penetrating another shape at its starting point **and** its trajectory is such
|
/// the shape is penetrating another shape at its starting point **and** its trajectory is such
|
||||||
/// that it’s on a path to exit that penetration state.
|
/// that it’s on a path to exit that penetration state.
|
||||||
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
||||||
|
#[profiling::function]
|
||||||
pub fn cast_shape(
|
pub fn cast_shape(
|
||||||
&self,
|
&self,
|
||||||
bodies: &RigidBodySet,
|
bodies: &RigidBodySet,
|
||||||
@@ -645,6 +656,7 @@ impl QueryPipeline {
|
|||||||
/// that normal) then the nonlinear shape-casting will attempt to find another impact,
|
/// that normal) then the nonlinear shape-casting will attempt to find another impact,
|
||||||
/// at a time `> start_time` that could result in tunnelling.
|
/// at a time `> start_time` that could result in tunnelling.
|
||||||
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
||||||
|
#[profiling::function]
|
||||||
pub fn nonlinear_cast_shape(
|
pub fn nonlinear_cast_shape(
|
||||||
&self,
|
&self,
|
||||||
bodies: &RigidBodySet,
|
bodies: &RigidBodySet,
|
||||||
@@ -680,6 +692,7 @@ impl QueryPipeline {
|
|||||||
/// * `shape` - The shape to test.
|
/// * `shape` - The shape to test.
|
||||||
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
/// * `filter`: set of rules used to determine which collider is taken into account by this scene query.
|
||||||
/// * `callback` - A function called with the handles of each collider intersecting the `shape`.
|
/// * `callback` - A function called with the handles of each collider intersecting the `shape`.
|
||||||
|
#[profiling::function]
|
||||||
pub fn intersections_with_shape(
|
pub fn intersections_with_shape(
|
||||||
&self,
|
&self,
|
||||||
bodies: &RigidBodySet,
|
bodies: &RigidBodySet,
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ pub struct Box2dWorld {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Box2dWorld {
|
impl Box2dWorld {
|
||||||
|
#[profiling::function]
|
||||||
pub fn from_rapier(
|
pub fn from_rapier(
|
||||||
gravity: Vector2<f32>,
|
gravity: Vector2<f32>,
|
||||||
bodies: &RigidBodySet,
|
bodies: &RigidBodySet,
|
||||||
@@ -221,6 +222,7 @@ impl Box2dWorld {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn step(&mut self, counters: &mut Counters, params: &IntegrationParameters) {
|
pub fn step(&mut self, counters: &mut Counters, params: &IntegrationParameters) {
|
||||||
counters.step_started();
|
counters.step_started();
|
||||||
self.world
|
self.world
|
||||||
@@ -228,6 +230,7 @@ impl Box2dWorld {
|
|||||||
counters.step_completed();
|
counters.step_completed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn sync(&self, bodies: &mut RigidBodySet, colliders: &mut ColliderSet) {
|
pub fn sync(&self, bodies: &mut RigidBodySet, colliders: &mut ColliderSet) {
|
||||||
for (handle, body) in bodies.iter_mut() {
|
for (handle, body) in bodies.iter_mut() {
|
||||||
if let Some(pb2_handle) = self.rapier2box2d.get(&handle) {
|
if let Some(pb2_handle) = self.rapier2box2d.get(&handle) {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ use rand_pcg::Pcg32;
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
#[cfg(feature = "dim2")]
|
#[cfg(feature = "dim2")]
|
||||||
pub type BevyMaterial = ColorMaterial;
|
pub type BevyMaterial = bevy_sprite::ColorMaterial;
|
||||||
#[cfg(feature = "dim3")]
|
#[cfg(feature = "dim3")]
|
||||||
pub type BevyMaterial = StandardMaterial;
|
pub type BevyMaterial = StandardMaterial;
|
||||||
|
|
||||||
|
|||||||
@@ -206,6 +206,7 @@ impl Harness {
|
|||||||
self.step_with_graphics(None);
|
self.step_with_graphics(None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn step_with_graphics(&mut self, mut graphics: Option<&mut TestbedGraphics>) {
|
pub fn step_with_graphics(&mut self, mut graphics: Option<&mut TestbedGraphics>) {
|
||||||
#[cfg(feature = "parallel")]
|
#[cfg(feature = "parallel")]
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ impl EntityWithGraphics {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "dim2")]
|
#[cfg(feature = "dim2")]
|
||||||
let selection_material = ColorMaterial {
|
let selection_material = bevy_sprite::ColorMaterial {
|
||||||
color: Color::from(Srgba::rgb(1.0, 0.0, 0.0)),
|
color: Color::from(Srgba::rgb(1.0, 0.0, 0.0)),
|
||||||
texture: None,
|
texture: None,
|
||||||
};
|
};
|
||||||
@@ -109,7 +109,7 @@ impl EntityWithGraphics {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "dim2")]
|
#[cfg(feature = "dim2")]
|
||||||
let material = ColorMaterial {
|
let material = bevy_sprite::ColorMaterial {
|
||||||
color: bevy_color,
|
color: bevy_color,
|
||||||
texture: None,
|
texture: None,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ impl PhysicsSnapshot {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[profiling::function]
|
||||||
pub fn restore(&self) -> bincode::Result<DeserializedPhysicsSnapshot> {
|
pub fn restore(&self) -> bincode::Result<DeserializedPhysicsSnapshot> {
|
||||||
Ok(DeserializedPhysicsSnapshot {
|
Ok(DeserializedPhysicsSnapshot {
|
||||||
timestep_id: self.timestep_id,
|
timestep_id: self.timestep_id,
|
||||||
|
|||||||
@@ -147,6 +147,7 @@ impl Drop for PhysxWorld {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl PhysxWorld {
|
impl PhysxWorld {
|
||||||
|
#[profiling::function]
|
||||||
pub fn from_rapier(
|
pub fn from_rapier(
|
||||||
gravity: Vector3<f32>,
|
gravity: Vector3<f32>,
|
||||||
integration_parameters: &IntegrationParameters,
|
integration_parameters: &IntegrationParameters,
|
||||||
|
|||||||
@@ -249,6 +249,9 @@ impl TestbedApp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn run_with_init(mut self, mut init: impl FnMut(&mut App)) {
|
pub fn run_with_init(mut self, mut init: impl FnMut(&mut App)) {
|
||||||
|
#[cfg(feature = "profiling")]
|
||||||
|
puffin_egui::puffin::set_scopes_on(true);
|
||||||
|
|
||||||
let mut args = env::args();
|
let mut args = env::args();
|
||||||
let mut benchmark_mode = false;
|
let mut benchmark_mode = false;
|
||||||
|
|
||||||
@@ -885,6 +888,10 @@ impl<'a, 'b, 'c, 'd, 'e, 'f> Testbed<'a, 'b, 'c, 'd, 'e, 'f> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn handle_common_events(&mut self, events: &ButtonInput<KeyCode>) {
|
fn handle_common_events(&mut self, events: &ButtonInput<KeyCode>) {
|
||||||
|
// C can be used to write within profiling filter.
|
||||||
|
if events.pressed(KeyCode::ControlLeft) || events.pressed(KeyCode::ControlRight) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
for key in events.get_just_released() {
|
for key in events.get_just_released() {
|
||||||
match *key {
|
match *key {
|
||||||
KeyCode::KeyT => {
|
KeyCode::KeyT => {
|
||||||
@@ -1184,6 +1191,8 @@ fn update_testbed(
|
|||||||
),
|
),
|
||||||
keys: Res<ButtonInput<KeyCode>>,
|
keys: Res<ButtonInput<KeyCode>>,
|
||||||
) {
|
) {
|
||||||
|
profiling::finish_frame!();
|
||||||
|
|
||||||
let meshes = &mut *meshes;
|
let meshes = &mut *meshes;
|
||||||
let materials = &mut *materials;
|
let materials = &mut *materials;
|
||||||
|
|
||||||
@@ -1210,7 +1219,9 @@ fn update_testbed(
|
|||||||
plugins: &mut plugins,
|
plugins: &mut plugins,
|
||||||
};
|
};
|
||||||
|
|
||||||
testbed.handle_common_events(&keys);
|
if !ui_context.ctx_mut().wants_keyboard_input() {
|
||||||
|
testbed.handle_common_events(&keys);
|
||||||
|
}
|
||||||
testbed.update_character_controller(&keys);
|
testbed.update_character_controller(&keys);
|
||||||
#[cfg(feature = "dim3")]
|
#[cfg(feature = "dim3")]
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -21,6 +21,41 @@ pub fn update_ui(
|
|||||||
harness: &mut Harness,
|
harness: &mut Harness,
|
||||||
debug_render: &mut DebugRenderPipelineResource,
|
debug_render: &mut DebugRenderPipelineResource,
|
||||||
) {
|
) {
|
||||||
|
#[cfg(feature = "profiling")]
|
||||||
|
{
|
||||||
|
let window = egui::Window::new("Profiling");
|
||||||
|
let window = window.default_open(false);
|
||||||
|
|
||||||
|
#[cfg(feature = "unstable-puffin-pr-235")]
|
||||||
|
{
|
||||||
|
use std::sync::Once;
|
||||||
|
static START: Once = Once::new();
|
||||||
|
|
||||||
|
fn set_default_rapier_filter() {
|
||||||
|
let mut profile_ui = puffin_egui::PROFILE_UI.lock();
|
||||||
|
profile_ui
|
||||||
|
.profiler_ui
|
||||||
|
.flamegraph_options
|
||||||
|
.scope_name_filter
|
||||||
|
.set_filter("Harness::step_with_graphics".to_string());
|
||||||
|
}
|
||||||
|
START.call_once(|| {
|
||||||
|
set_default_rapier_filter();
|
||||||
|
});
|
||||||
|
window.show(ui_context.ctx_mut(), |ui| {
|
||||||
|
if ui.button("🔍 Rapier filter").clicked() {
|
||||||
|
set_default_rapier_filter();
|
||||||
|
}
|
||||||
|
puffin_egui::profiler_ui(ui);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(feature = "unstable-puffin-pr-235"))]
|
||||||
|
window.show(ui_context.ctx_mut(), |ui| {
|
||||||
|
puffin_egui::profiler_ui(ui);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
egui::Window::new("Parameters").show(ui_context.ctx_mut(), |ui| {
|
egui::Window::new("Parameters").show(ui_context.ctx_mut(), |ui| {
|
||||||
if state.backend_names.len() > 1 && !state.example_names.is_empty() {
|
if state.backend_names.len() > 1 && !state.example_names.is_empty() {
|
||||||
let mut changed = false;
|
let mut changed = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user