|
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 | },
|
|
1104 | 1112 | " runtimeScene.__collisionDetectorExtension.solidManager || new gdjs.__collisionDetectorExtension.SolidManager();\r",
|
1105 | 1113 | "const manager = runtimeScene.__collisionDetectorExtension.solidManager;\r",
|
1106 | 1114 | "\r",
|
1107 |
| - "const objectsLists = eventsFunctionContext.getObjectsLists(\"Object\");\r", |
| 1115 | + "const solidObjectsLists = eventsFunctionContext.getObjectsLists(\"Object\");\r", |
1108 | 1116 | "\r",
|
1109 | 1117 | "const left = eventsFunctionContext.getArgument(\"Left\");\r",
|
1110 | 1118 | "const top = eventsFunctionContext.getArgument(\"Top\");\r",
|
1111 | 1119 | "const right = eventsFunctionContext.getArgument(\"Right\");\r",
|
1112 | 1120 | "const bottom = eventsFunctionContext.getArgument(\"Bottom\");\r",
|
1113 | 1121 | "\r",
|
1114 |
| - "for (const objectName in objectsLists.items) {\r", |
1115 |
| - " const objects = objectsLists.items[objectName];\r", |
1116 |
| - " manager.getAllInstancesInRectangle(objectName, left, top, right, bottom, objects);\r", |
| 1122 | + "for (const solidObjectName in solidObjectsLists.items) {\r", |
| 1123 | + " const pickedObjects = solidObjectsLists.items[solidObjectName];\r", |
| 1124 | + " if (pickedObjects.length === runtimeScene.getInstancesCountOnScene(solidObjectName)) {\r", |
| 1125 | + " manager.getAllInstancesInRectangle(solidObjectName, left, top, right, bottom, pickedObjects);\r", |
| 1126 | + " }\r", |
| 1127 | + " else {\r", |
| 1128 | + " // TODO avoid alloction\r", |
| 1129 | + " const objects = [...pickedObjects];\r", |
| 1130 | + " pickedObjects.length = 0;\r", |
| 1131 | + " objects.forEach(pickedObject => {\r", |
| 1132 | + " const aabb = pickedObject.getAABB();\r", |
| 1133 | + " if (left < aabb.max[0] && aabb.min[0] < right\r", |
| 1134 | + " && top < aabb.max[1] && aabb.min[1] < bottom) {\r", |
| 1135 | + " pickedObjects.push(pickedObject);\r", |
| 1136 | + " }\r", |
| 1137 | + " });\r", |
| 1138 | + " }\r", |
1117 | 1139 | "}\r",
|
1118 | 1140 | "eventsFunctionContext.returnValue = true;"
|
1119 | 1141 | ],
|
|
1182 | 1204 | " const top = object.getAABBTop();\r",
|
1183 | 1205 | " const right = object.getAABBRight();\r",
|
1184 | 1206 | " 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", |
| 1207 | + " for (const solidObjectName in solidObjectLists.items) {\r", |
| 1208 | + " const pickedObjects = solidObjectLists.items[solidObjectName];\r", |
| 1209 | + " if (pickedObjects.length === runtimeScene.getInstancesCountOnScene(solidObjectName)) {\r", |
| 1210 | + " nearObjects.length = 0;\r", |
| 1211 | + " manager.getAllInstancesInRectangle(solidObjectName, left, top, right, bottom, nearObjects);\r", |
| 1212 | + " object.separateFromObjects(nearObjects);\r", |
| 1213 | + " }\r", |
| 1214 | + " else {\r", |
| 1215 | + " // Avoid to do intersection between pickedObjects and nearObjects\r", |
| 1216 | + " // as it is O(n²) and the naive collision is O(n).\r", |
| 1217 | + " object.separateFromObjects(pickedObjects);\r", |
| 1218 | + " }\r", |
1190 | 1219 | " }\r",
|
1191 | 1220 | "}"
|
1192 | 1221 | ],
|
|
0 commit comments