|
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