Skip to content

Commit

Permalink
[Collision 3D] Add a parameter to ignore object custom centers
Browse files Browse the repository at this point in the history
  • Loading branch information
D8H committed Dec 19, 2024
1 parent 0e07387 commit b0389ed
Showing 1 changed file with 68 additions and 22 deletions.
90 changes: 68 additions & 22 deletions extensions/community/Collision3D.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"name": "Collision3D",
"previewIconUrl": "https://asset-resources.gdevelop.io/public-resources/Icons/7a5696a515bf40813692e118147568392a854f65f5b50750c9b9aaa967aba7df_vector-intersection.svg",
"shortDescription": "Check collision and distance between 3D objects.",
"version": "0.1.1",
"version": "0.2.0",
"description": "Check collision and distance between 3D objects and separate them from each other.",
"origin": {
"identifier": "Collision3D",
Expand Down Expand Up @@ -43,15 +43,47 @@
"",
"/**",
" * @param {gdjs.RuntimeObject} object",
" * @param {boolean} shouldUseCustomCenter",
" * @return {number}",
" */",
"const getCenterX = (object, shouldUseCustomCenter) =>",
" shouldUseCustomCenter ?",
" object.getCenterXInScene() :",
" object.getDrawableX() + object.getWidth() / 2",
"",
"/**",
" * @param {gdjs.RuntimeObject} object",
" * @param {boolean} shouldUseCustomCenter",
" * @return {number}",
" */",
"const getCenterY = (object, shouldUseCustomCenter) =>",
" shouldUseCustomCenter ?",
" object.getCenterYInScene() :",
" object.getDrawableY() + object.getHeight() / 2",
"",
"/**",
" * @param {gdjs.RuntimeObject3D} object",
" * @param {boolean} shouldUseCustomCenter",
" * @return {number}",
" */",
"const getCenterZ = (object, shouldUseCustomCenter) =>",
" !object.getCenterZInScene ? 0 :",
" shouldUseCustomCenter ?",
" object.getCenterZInScene() :",
" object.getDrawableZ() + object.getDepth() / 2",
"",
"/**",
" * @param {gdjs.RuntimeObject} object",
" * @param {float} x",
" * @param {float} y",
" * @param {float} z",
" * @param {boolean} shouldUseCustomCenter",
" * @return {number}",
" */",
"const getSqDistanceToPosition = (object, x, y, z) => {",
" const deltaX = object.getCenterXInScene() - x;",
" const deltaY = object.getCenterYInScene() - y;",
" const deltaZ = (object.getCenterZInScene ? object.getCenterZInScene() : 0) - z;",
"const getSqDistanceToPosition = (object, x, y, z, shouldUseCustomCenter = true) => {",
" const deltaX = getCenterX(object, shouldUseCustomCenter) - x;",
" const deltaY = getCenterY(object, shouldUseCustomCenter) - y;",
" const deltaZ = getCenterZ(object, shouldUseCustomCenter) - z;",
" return deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ;",
"};",
"",
Expand All @@ -67,14 +99,15 @@
"/**",
" * @param {gdjs.RuntimeObject} object",
" * @param {gdjs.RuntimeObject} otherObject",
" * @param {boolean} shouldUseCustomCenter",
" * @return {number}",
" */",
"const getSqDistanceToObject = (object, otherObject) => {",
"const getSqDistanceToObject = (object, otherObject, shouldUseCustomCenter = true) => {",
" return getSqDistanceToPosition(",
" object,",
" otherObject.getCenterXInScene(),",
" otherObject.getCenterYInScene(),",
" otherObject.getCenterZInScene ? otherObject.getCenterZInScene() : 0",
" getCenterX(otherObject, shouldUseCustomCenter),",
" getCenterY(otherObject, shouldUseCustomCenter),",
" getCenterZ(otherObject, shouldUseCustomCenter)",
" );",
"};",
"",
Expand All @@ -88,34 +121,38 @@
"/**",
" * @param {gdjs.RuntimeObject} object",
" * @param {gdjs.RuntimeObject} otherObject",
" * @param {number} distanceSq",
" * @param {{distanceSq: number, shouldUseCustomCenter: boolean}} distanceSettings",
" * @return {boolean}",
" */",
"const areObjectsWithinDistance = (object, otherObject, distanceSq) => {",
" return getSqDistanceToObject(object, otherObject) <= distanceSq;",
"const areObjectsWithinDistance = (object, otherObject, distanceSettings) => {",
" return getSqDistanceToObject(",
" object, otherObject, distanceSettings.shouldUseCustomCenter) <= distanceSettings.distanceSq;",
"};",
"",
"const distanceSettings = {distanceSq: 0, shouldUseCustomCenter: true};",
"",
"/**",
" * @param {gdjs.ObjectList} objectsLists1",
" * @param {gdjs.ObjectList} objectsLists2",
" * @param {Hashtable<gdjs.RuntimeObject[]>} objectsLists1",
" * @param {Hashtable<gdjs.RuntimeObject[]>} objectsLists2",
" * @param {number} distance",
" * @param {boolean} shouldUseCustomCenter",
" * @param {boolean} inverted",
" * @return {boolean}",
" */",
"const pickObjectsWithinDistance = (objectsLists1, objectsLists2, distance, inverted) => {",
" const distanceSq = distance * distance;",
"const pickObjectsWithinDistance = (objectsLists1, objectsLists2, distance, shouldUseCustomCenter, inverted) => {",
" distanceSettings.distanceSq = distance * distance;",
" distanceSettings.shouldUseCustomCenter = shouldUseCustomCenter;",
" return gdjs.evtTools.object.twoListsTest(",
" areObjectsWithinDistance,",
" objectsLists1,",
" objectsLists2,",
" inverted,",
" distance * distance",
" distanceSettings",
" );",
"}",
"",
"/**",
" * @param {gdjs.ObjectList} objectsLists",
" * @param {gdjs.ObjectList} objectsLists2",
" * @param {Hashtable<gdjs.RuntimeObject[]>} objectsLists",
" * @param {number} x",
" * @param {number} y",
" * @param {number} z",
Expand Down Expand Up @@ -190,8 +227,8 @@
"}",
"",
"/**",
" * @param {gdjs.ObjectList} objectsLists",
" * @param {gdjs.ObjectList} objectsLists2",
" * @param {Hashtable<gdjs.RuntimeObject[]>} objectsLists1",
" * @param {Hashtable<gdjs.RuntimeObject[]>} objectsLists2",
" * @param {boolean} inverted",
" * @return {boolean}",
" */",
Expand All @@ -205,6 +242,7 @@
" objectsLists1,",
" objectsLists2,",
" inverted,",
" false",
" );",
"}",
"",
Expand Down Expand Up @@ -326,7 +364,7 @@
"/**",
" * Arrays and data structure that are (re)used by",
" * {@link separateFromObjects} to avoid any allocation.",
" * @type {moveXArray: float[], moveYArray: float[], moveZArray: float[]}",
" * @type {{moveXArray: float[], moveYArray: float[], moveZArray: float[]}}",
" */",
"const separateFromObjectsStatics = {",
" moveXArray: [],",
Expand Down Expand Up @@ -477,6 +515,7 @@
" eventsFunctionContext.getObjectsLists(\"Object\"),\r",
" eventsFunctionContext.getObjectsLists(\"OtherObject\"),\r",
" eventsFunctionContext.getArgument(\"Distance\"),\r",
" eventsFunctionContext.getArgument(\"ShouldUseCustomCenter\"),\r",
" inverted\r",
");\r",
""
Expand All @@ -501,6 +540,13 @@
"description": "Distance",
"name": "Distance",
"type": "expression"
},
{
"defaultValue": "yes",
"description": "Use custom center",
"name": "ShouldUseCustomCenter",
"optional": true,
"type": "yesorno"
}
],
"objectGroups": []
Expand Down

0 comments on commit b0389ed

Please sign in to comment.