|
491 | 491 | { |
492 | 492 | "name": "Obstacle", |
493 | 493 | "type": "CollisionDetector::Solid" |
| 494 | + }, |
| 495 | + { |
| 496 | + "name": "Physics2", |
| 497 | + "type": "Physics2::Physics2Behavior", |
| 498 | + "gravityX": 0, |
| 499 | + "gravityY": 9.8, |
| 500 | + "scaleX": 100, |
| 501 | + "scaleY": 100 |
494 | 502 | } |
495 | 503 | ] |
496 | 504 | }, |
|
1182 | 1190 | " const top = object.getAABBTop();\r", |
1183 | 1191 | " const right = object.getAABBRight();\r", |
1184 | 1192 | " const bottom = object.getAABBBottom();\r", |
1185 | | - " for (const objectName in solidObjectLists.items) {\r", |
1186 | | - " // Solid picking is ignored all solid are considered.\r", |
1187 | | - " nearObjects.length = 0;\r", |
1188 | | - " manager.getAllInstancesInRectangle(objectName, left, top, right, bottom, nearObjects);\r", |
1189 | | - " object.separateFromObjects(nearObjects);\r", |
| 1193 | + " for (const solidObjectName in solidObjectLists.items) {\r", |
| 1194 | + " const pickedObjects = solidObjectLists.items[solidObjectName];\r", |
| 1195 | + " if (pickedObjects.length === runtimeScene.getInstancesCountOnScene(solidObjectName)) {\r", |
| 1196 | + " nearObjects.length = 0;\r", |
| 1197 | + " manager.getAllInstancesInRectangle(solidObjectName, left, top, right, bottom, nearObjects);\r", |
| 1198 | + " object.separateFromObjects(nearObjects);\r", |
| 1199 | + " }\r", |
| 1200 | + " else {\r", |
| 1201 | + " // Avoid to do intersection between pickedObjects and nearObjects\r", |
| 1202 | + " // as it is O(n²) and the naive collision is O(n).\r", |
| 1203 | + " object.separateFromObjects(pickedObjects);\r", |
| 1204 | + " }\r", |
1190 | 1205 | " }\r", |
1191 | 1206 | "}" |
1192 | 1207 | ], |
|
0 commit comments