123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527 |
- var BABYLON;
- (function (BABYLON) {
- /**
- * ActionEvent is the event beint sent when an action is triggered.
- */
- var ActionEvent = (function () {
- /**
- * @constructor
- * @param source The mesh or sprite that triggered the action.
- * @param pointerX The X mouse cursor position at the time of the event
- * @param pointerY The Y mouse cursor position at the time of the event
- * @param meshUnderPointer The mesh that is currently pointed at (can be null)
- * @param sourceEvent the original (browser) event that triggered the ActionEvent
- */
- function ActionEvent(source, pointerX, pointerY, meshUnderPointer, sourceEvent, additionalData) {
- this.source = source;
- this.pointerX = pointerX;
- this.pointerY = pointerY;
- this.meshUnderPointer = meshUnderPointer;
- this.sourceEvent = sourceEvent;
- this.additionalData = additionalData;
- }
- /**
- * Helper function to auto-create an ActionEvent from a source mesh.
- * @param source The source mesh that triggered the event
- * @param evt {Event} The original (browser) event
- */
- ActionEvent.CreateNew = function (source, evt, additionalData) {
- var scene = source.getScene();
- return new ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer, evt, additionalData);
- };
- /**
- * Helper function to auto-create an ActionEvent from a source mesh.
- * @param source The source sprite that triggered the event
- * @param scene Scene associated with the sprite
- * @param evt {Event} The original (browser) event
- */
- ActionEvent.CreateNewFromSprite = function (source, scene, evt, additionalData) {
- return new ActionEvent(source, scene.pointerX, scene.pointerY, scene.meshUnderPointer, evt, additionalData);
- };
- /**
- * Helper function to auto-create an ActionEvent from a scene. If triggered by a mesh use ActionEvent.CreateNew
- * @param scene the scene where the event occurred
- * @param evt {Event} The original (browser) event
- */
- ActionEvent.CreateNewFromScene = function (scene, evt) {
- return new ActionEvent(null, scene.pointerX, scene.pointerY, scene.meshUnderPointer, evt);
- };
- ActionEvent.CreateNewFromPrimitive = function (prim, pointerPos, evt, additionalData) {
- return new ActionEvent(prim, pointerPos.x, pointerPos.y, null, evt, additionalData);
- };
- return ActionEvent;
- })();
- BABYLON.ActionEvent = ActionEvent;
- /**
- * Action Manager manages all events to be triggered on a given mesh or the global scene.
- * A single scene can have many Action Managers to handle predefined actions on specific meshes.
- */
- var ActionManager = (function () {
- function ActionManager(scene) {
- // Members
- this.actions = new Array();
- this._scene = scene;
- scene._actionManagers.push(this);
- }
- Object.defineProperty(ActionManager, "NothingTrigger", {
- get: function () {
- return ActionManager._NothingTrigger;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager, "OnPickTrigger", {
- get: function () {
- return ActionManager._OnPickTrigger;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager, "OnLeftPickTrigger", {
- get: function () {
- return ActionManager._OnLeftPickTrigger;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager, "OnRightPickTrigger", {
- get: function () {
- return ActionManager._OnRightPickTrigger;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager, "OnCenterPickTrigger", {
- get: function () {
- return ActionManager._OnCenterPickTrigger;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager, "OnPickDownTrigger", {
- get: function () {
- return ActionManager._OnPickDownTrigger;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager, "OnPickUpTrigger", {
- get: function () {
- return ActionManager._OnPickUpTrigger;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager, "OnPickOutTrigger", {
- /// This trigger will only be raised if you also declared a OnPickDown
- get: function () {
- return ActionManager._OnPickOutTrigger;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager, "OnLongPressTrigger", {
- get: function () {
- return ActionManager._OnLongPressTrigger;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager, "OnPointerOverTrigger", {
- get: function () {
- return ActionManager._OnPointerOverTrigger;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager, "OnPointerOutTrigger", {
- get: function () {
- return ActionManager._OnPointerOutTrigger;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager, "OnEveryFrameTrigger", {
- get: function () {
- return ActionManager._OnEveryFrameTrigger;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager, "OnIntersectionEnterTrigger", {
- get: function () {
- return ActionManager._OnIntersectionEnterTrigger;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager, "OnIntersectionExitTrigger", {
- get: function () {
- return ActionManager._OnIntersectionExitTrigger;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager, "OnKeyDownTrigger", {
- get: function () {
- return ActionManager._OnKeyDownTrigger;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager, "OnKeyUpTrigger", {
- get: function () {
- return ActionManager._OnKeyUpTrigger;
- },
- enumerable: true,
- configurable: true
- });
- // Methods
- ActionManager.prototype.dispose = function () {
- var index = this._scene._actionManagers.indexOf(this);
- if (index > -1) {
- this._scene._actionManagers.splice(index, 1);
- }
- };
- ActionManager.prototype.getScene = function () {
- return this._scene;
- };
- /**
- * Does this action manager handles actions of any of the given triggers
- * @param {number[]} triggers - the triggers to be tested
- * @return {boolean} whether one (or more) of the triggers is handeled
- */
- ActionManager.prototype.hasSpecificTriggers = function (triggers) {
- for (var index = 0; index < this.actions.length; index++) {
- var action = this.actions[index];
- if (triggers.indexOf(action.trigger) > -1) {
- return true;
- }
- }
- return false;
- };
- /**
- * Does this action manager handles actions of a given trigger
- * @param {number} trigger - the trigger to be tested
- * @return {boolean} whether the trigger is handeled
- */
- ActionManager.prototype.hasSpecificTrigger = function (trigger) {
- for (var index = 0; index < this.actions.length; index++) {
- var action = this.actions[index];
- if (action.trigger === trigger) {
- return true;
- }
- }
- return false;
- };
- Object.defineProperty(ActionManager.prototype, "hasPointerTriggers", {
- /**
- * Does this action manager has pointer triggers
- * @return {boolean} whether or not it has pointer triggers
- */
- get: function () {
- for (var index = 0; index < this.actions.length; index++) {
- var action = this.actions[index];
- if (action.trigger >= ActionManager._OnPickTrigger && action.trigger <= ActionManager._OnPointerOutTrigger) {
- return true;
- }
- }
- return false;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(ActionManager.prototype, "hasPickTriggers", {
- /**
- * Does this action manager has pick triggers
- * @return {boolean} whether or not it has pick triggers
- */
- get: function () {
- for (var index = 0; index < this.actions.length; index++) {
- var action = this.actions[index];
- if (action.trigger >= ActionManager._OnPickTrigger && action.trigger <= ActionManager._OnPickUpTrigger) {
- return true;
- }
- }
- return false;
- },
- enumerable: true,
- configurable: true
- });
- /**
- * Registers an action to this action manager
- * @param {BABYLON.Action} action - the action to be registered
- * @return {BABYLON.Action} the action amended (prepared) after registration
- */
- ActionManager.prototype.registerAction = function (action) {
- if (action.trigger === ActionManager.OnEveryFrameTrigger) {
- if (this.getScene().actionManager !== this) {
- BABYLON.Tools.Warn("OnEveryFrameTrigger can only be used with scene.actionManager");
- return null;
- }
- }
- this.actions.push(action);
- action._actionManager = this;
- action._prepare();
- return action;
- };
- /**
- * Process a specific trigger
- * @param {number} trigger - the trigger to process
- * @param evt {BABYLON.ActionEvent} the event details to be processed
- */
- ActionManager.prototype.processTrigger = function (trigger, evt) {
- for (var index = 0; index < this.actions.length; index++) {
- var action = this.actions[index];
- if (action.trigger === trigger) {
- if (trigger === ActionManager.OnKeyUpTrigger
- || trigger === ActionManager.OnKeyDownTrigger) {
- var parameter = action.getTriggerParameter();
- if (parameter) {
- var unicode = evt.sourceEvent.charCode ? evt.sourceEvent.charCode : evt.sourceEvent.keyCode;
- var actualkey = String.fromCharCode(unicode).toLowerCase();
- if (actualkey !== parameter.toLowerCase()) {
- continue;
- }
- }
- }
- action._executeCurrent(evt);
- }
- }
- };
- ActionManager.prototype._getEffectiveTarget = function (target, propertyPath) {
- var properties = propertyPath.split(".");
- for (var index = 0; index < properties.length - 1; index++) {
- target = target[properties[index]];
- }
- return target;
- };
- ActionManager.prototype._getProperty = function (propertyPath) {
- var properties = propertyPath.split(".");
- return properties[properties.length - 1];
- };
- ActionManager.prototype.serialize = function (name) {
- var root = {
- children: [],
- name: name,
- type: 3,
- properties: [] // Empty for root but required
- };
- for (var i = 0; i < this.actions.length; i++) {
- var triggerObject = {
- type: 0,
- children: [],
- name: ActionManager.GetTriggerName(this.actions[i].trigger),
- properties: []
- };
- var triggerOptions = this.actions[i].triggerOptions;
- if (triggerOptions && typeof triggerOptions !== "number") {
- if (triggerOptions.parameter instanceof BABYLON.Node) {
- triggerObject.properties.push(BABYLON.Action._GetTargetProperty(triggerOptions.parameter));
- }
- else {
- triggerObject.properties.push({ name: "parameter", targetType: null, value: triggerOptions.parameter });
- }
- }
- // Serialize child action, recursively
- this.actions[i].serialize(triggerObject);
- // Add serialized trigger
- root.children.push(triggerObject);
- }
- return root;
- };
- ActionManager.Parse = function (parsedActions, object, scene) {
- var actionManager = new BABYLON.ActionManager(scene);
- if (object === null)
- scene.actionManager = actionManager;
- else
- object.actionManager = actionManager;
- // instanciate a new object
- var instanciate = function (name, params) {
- var newInstance = Object.create(BABYLON[name].prototype);
- newInstance.constructor.apply(newInstance, params);
- return newInstance;
- };
- var parseParameter = function (name, value, target, propertyPath) {
- if (propertyPath === null) {
- // String, boolean or float
- var floatValue = parseFloat(value);
- if (value === "true" || value === "false")
- return value === "true";
- else
- return isNaN(floatValue) ? value : floatValue;
- }
- var effectiveTarget = propertyPath.split(".");
- var values = value.split(",");
- // Get effective Target
- for (var i = 0; i < effectiveTarget.length; i++) {
- target = target[effectiveTarget[i]];
- }
- // Return appropriate value with its type
- if (typeof (target) === "boolean")
- return values[0] === "true";
- if (typeof (target) === "string")
- return values[0];
- // Parameters with multiple values such as Vector3 etc.
- var split = new Array();
- for (var i = 0; i < values.length; i++)
- split.push(parseFloat(values[i]));
- if (target instanceof BABYLON.Vector3)
- return BABYLON.Vector3.FromArray(split);
- if (target instanceof BABYLON.Vector4)
- return BABYLON.Vector4.FromArray(split);
- if (target instanceof BABYLON.Color3)
- return BABYLON.Color3.FromArray(split);
- if (target instanceof BABYLON.Color4)
- return BABYLON.Color4.FromArray(split);
- return parseFloat(values[0]);
- };
- // traverse graph per trigger
- var traverse = function (parsedAction, trigger, condition, action, combineArray) {
- if (combineArray === void 0) { combineArray = null; }
- if (parsedAction.detached)
- return;
- var parameters = new Array();
- var target = null;
- var propertyPath = null;
- var combine = parsedAction.combine && parsedAction.combine.length > 0;
- // Parameters
- if (parsedAction.type === 2)
- parameters.push(actionManager);
- else
- parameters.push(trigger);
- if (combine) {
- var actions = new Array();
- for (var j = 0; j < parsedAction.combine.length; j++) {
- traverse(parsedAction.combine[j], ActionManager.NothingTrigger, condition, action, actions);
- }
- parameters.push(actions);
- }
- else {
- for (var i = 0; i < parsedAction.properties.length; i++) {
- var value = parsedAction.properties[i].value;
- var name = parsedAction.properties[i].name;
- var targetType = parsedAction.properties[i].targetType;
- if (name === "target")
- if (targetType !== null && targetType === "SceneProperties")
- value = target = scene;
- else
- value = target = scene.getNodeByName(value);
- else if (name === "parent")
- value = scene.getNodeByName(value);
- else if (name === "sound")
- value = scene.getSoundByName(value);
- else if (name !== "propertyPath") {
- if (parsedAction.type === 2 && name === "operator")
- value = BABYLON.ValueCondition[value];
- else
- value = parseParameter(name, value, target, name === "value" ? propertyPath : null);
- }
- else {
- propertyPath = value;
- }
- parameters.push(value);
- }
- }
- if (combineArray === null) {
- parameters.push(condition);
- }
- else {
- parameters.push(null);
- }
- // If interpolate value action
- if (parsedAction.name === "InterpolateValueAction") {
- var param = parameters[parameters.length - 2];
- parameters[parameters.length - 1] = param;
- parameters[parameters.length - 2] = condition;
- }
- // Action or condition(s) and not CombineAction
- var newAction = instanciate(parsedAction.name, parameters);
- if (newAction instanceof BABYLON.Condition && condition !== null) {
- var nothing = new BABYLON.DoNothingAction(trigger, condition);
- if (action)
- action.then(nothing);
- else
- actionManager.registerAction(nothing);
- action = nothing;
- }
- if (combineArray === null) {
- if (newAction instanceof BABYLON.Condition) {
- condition = newAction;
- newAction = action;
- }
- else {
- condition = null;
- if (action)
- action.then(newAction);
- else
- actionManager.registerAction(newAction);
- }
- }
- else {
- combineArray.push(newAction);
- }
- for (var i = 0; i < parsedAction.children.length; i++)
- traverse(parsedAction.children[i], trigger, condition, newAction, null);
- };
- // triggers
- for (var i = 0; i < parsedActions.children.length; i++) {
- var triggerParams;
- var trigger = parsedActions.children[i];
- if (trigger.properties.length > 0) {
- var param = trigger.properties[0].value;
- var value = trigger.properties[0].targetType === null ? param : scene.getMeshByName(param);
- triggerParams = { trigger: BABYLON.ActionManager[trigger.name], parameter: value };
- }
- else
- triggerParams = BABYLON.ActionManager[trigger.name];
- for (var j = 0; j < trigger.children.length; j++) {
- if (!trigger.detached)
- traverse(trigger.children[j], triggerParams, null, null);
- }
- }
- };
- ActionManager.GetTriggerName = function (trigger) {
- switch (trigger) {
- case 0: return "NothingTrigger";
- case 1: return "OnPickTrigger";
- case 2: return "OnLeftPickTrigger";
- case 3: return "OnRightPickTrigger";
- case 4: return "OnCenterPickTrigger";
- case 5: return "OnPickDownTrigger";
- case 6: return "OnPickUpTrigger";
- case 7: return "OnLongPressTrigger";
- case 8: return "OnPointerOverTrigger";
- case 9: return "OnPointerOutTrigger";
- case 10: return "OnEveryFrameTrigger";
- case 11: return "OnIntersectionEnterTrigger";
- case 12: return "OnIntersectionExitTrigger";
- case 13: return "OnKeyDownTrigger";
- case 14: return "OnKeyUpTrigger";
- case 15: return "OnPickOutTrigger";
- default: return "";
- }
- };
- // Statics
- ActionManager._NothingTrigger = 0;
- ActionManager._OnPickTrigger = 1;
- ActionManager._OnLeftPickTrigger = 2;
- ActionManager._OnRightPickTrigger = 3;
- ActionManager._OnCenterPickTrigger = 4;
- ActionManager._OnPickDownTrigger = 5;
- ActionManager._OnPickUpTrigger = 6;
- ActionManager._OnLongPressTrigger = 7;
- ActionManager._OnPointerOverTrigger = 8;
- ActionManager._OnPointerOutTrigger = 9;
- ActionManager._OnEveryFrameTrigger = 10;
- ActionManager._OnIntersectionEnterTrigger = 11;
- ActionManager._OnIntersectionExitTrigger = 12;
- ActionManager._OnKeyDownTrigger = 13;
- ActionManager._OnKeyUpTrigger = 14;
- ActionManager._OnPickOutTrigger = 15;
- ActionManager.DragMovementThreshold = 10; // in pixels
- ActionManager.LongPressDelay = 500; // in milliseconds
- return ActionManager;
- })();
- BABYLON.ActionManager = ActionManager;
- })(BABYLON || (BABYLON = {}));
|