Skip to content

Commit e859a59

Browse files
committed
Handle pre picking.
1 parent 66f6785 commit e859a59

File tree

1 file changed

+38
-9
lines changed

1 file changed

+38
-9
lines changed

examples/rtree/game.json

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,14 @@
491491
{
492492
"name": "Obstacle",
493493
"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
494502
}
495503
]
496504
},
@@ -1104,16 +1112,30 @@
11041112
" runtimeScene.__collisionDetectorExtension.solidManager || new gdjs.__collisionDetectorExtension.SolidManager();\r",
11051113
"const manager = runtimeScene.__collisionDetectorExtension.solidManager;\r",
11061114
"\r",
1107-
"const objectsLists = eventsFunctionContext.getObjectsLists(\"Object\");\r",
1115+
"const solidObjectsLists = eventsFunctionContext.getObjectsLists(\"Object\");\r",
11081116
"\r",
11091117
"const left = eventsFunctionContext.getArgument(\"Left\");\r",
11101118
"const top = eventsFunctionContext.getArgument(\"Top\");\r",
11111119
"const right = eventsFunctionContext.getArgument(\"Right\");\r",
11121120
"const bottom = eventsFunctionContext.getArgument(\"Bottom\");\r",
11131121
"\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",
11171139
"}\r",
11181140
"eventsFunctionContext.returnValue = true;"
11191141
],
@@ -1182,11 +1204,18 @@
11821204
" const top = object.getAABBTop();\r",
11831205
" const right = object.getAABBRight();\r",
11841206
" 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",
11901219
" }\r",
11911220
"}"
11921221
],

0 commit comments

Comments
 (0)