diff --git a/extensions/community/Collision3D.json b/extensions/community/Collision3D.json index c9a09c1e..faf8d179 100644 --- a/extensions/community/Collision3D.json +++ b/extensions/community/Collision3D.json @@ -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", @@ -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;", "};", "", @@ -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)", " );", "};", "", @@ -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} objectsLists1", + " * @param {Hashtable} 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} objectsLists", " * @param {number} x", " * @param {number} y", " * @param {number} z", @@ -190,8 +227,8 @@ "}", "", "/**", - " * @param {gdjs.ObjectList} objectsLists", - " * @param {gdjs.ObjectList} objectsLists2", + " * @param {Hashtable} objectsLists1", + " * @param {Hashtable} objectsLists2", " * @param {boolean} inverted", " * @return {boolean}", " */", @@ -205,6 +242,7 @@ " objectsLists1,", " objectsLists2,", " inverted,", + " false", " );", "}", "", @@ -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: [],", @@ -477,6 +515,7 @@ " eventsFunctionContext.getObjectsLists(\"Object\"),\r", " eventsFunctionContext.getObjectsLists(\"OtherObject\"),\r", " eventsFunctionContext.getArgument(\"Distance\"),\r", + " eventsFunctionContext.getArgument(\"ShouldUseCustomCenter\"),\r", " inverted\r", ");\r", "" @@ -501,6 +540,13 @@ "description": "Distance", "name": "Distance", "type": "expression" + }, + { + "defaultValue": "yes", + "description": "Use custom center", + "name": "ShouldUseCustomCenter", + "optional": true, + "type": "yesorno" } ], "objectGroups": []