|
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