From 3835bbe9fae5f3374bde66fe0c50c8dde22fd8f9 Mon Sep 17 00:00:00 2001 From: "Theunis J. Botha" Date: Sun, 4 Jul 2021 20:32:41 +0200 Subject: [PATCH] generate indexes + r3-r3.js --- dist/r3.js | 3479 ++++++++++++++++++++++++++------ package.json | 3 +- src/r3/index.js | 19 +- src/r3/r3-component/index.js | 3 + src/r3/r3-r3.js | 13 +- src/r3/r3-system/index.js | 3 + src/templates/index.template | 3 + src/templates/r3-base.template | 7 +- src/templates/token.db | 2 + update_templates.php | 51 + version | 1 + 11 files changed, 2938 insertions(+), 646 deletions(-) create mode 100644 version diff --git a/dist/r3.js b/dist/r3.js index c34c9e6..d1c3333 100644 --- a/dist/r3.js +++ b/dist/r3.js @@ -1,290 +1,439 @@ -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = "./src/r3/index.js"); -/******/ }) -/************************************************************************/ -/******/ ({ +const Event = require('.././r3-event'); +const Utils = require('.././r3-utils'); -/***/ "./src/r3/index.js": -/*!*************************!*\ - !*** ./src/r3/index.js ***! - \*************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var R3 = __webpack_require__(/*! ./r3.js */ "./src/r3/r3.js"); - -R3.System.Linking.start(); -R3.System.Socket.start(); -module.exports = R3; - -/***/ }), - -/***/ "./src/r3/r3-event.js": -/*!****************************!*\ - !*** ./src/r3/r3-event.js ***! - \****************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -var Utils = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'r3-utils'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); /** - OPTIONS_START - OPTIONS_END + CUSTOM_OPTIONS_START + started=false + CUSTOM_OPTIONS_END + + CUSTOM_METHODS_START + start(options) - Just calls System.Start(options) + stop(options) - Just calls System.Stop(options) + CUSTOM_METHODS_END + + CUSTOM_STATIC_METHODS_START + Start(options) - Starts the system by registering subscriptions to events + Stop(options) - Stops the system by removing these subscriptions to events + CUSTOM_STATIC_METHODS_END **/ +class System { -var Event = /*#__PURE__*/function () { - //CONSTRUCTOR_TEMPLATE_START - function Event(options) { - _classCallCheck(this, Event); + //GENERATE_CONSTRUCTOR_START + constructor(options) { - Event.Emit(Event.OBJECT_CREATED, this); //OPTIONS_INIT_START + Event.Emit(Event.OBJECT_CREATED, this); + //GENERATE_OPTIONS_INIT_START if (typeof options === 'undefined') { options = {}; - } //OPTIONS_INIT_END + } + if (Utils.UndefinedOrNull(options.started)) { + options.started = false; + } + //GENERATE_OPTIONS_INIT_END + //CUSTOM_OPTIONS_INIT_START //CUSTOM_OPTIONS_INIT_END + Object.assign(this, options); - Object.assign(this, options); //CUSTOM_BEFORE_INIT_START + //CUSTOM_BEFORE_INIT_START //CUSTOM_BEFORE_INIT_END Event.Emit(Event.OBJECT_INITIALIZED, this); - } //CONSTRUCTOR_TEMPLATE_END + + //CUSTOM_AFTER_INIT_START + //CUSTOM_AFTER_INIT_END + } + //GENERATE_CONSTRUCTOR_END + //CUSTOM_IMPLEMENTATION_START + //CUSTOM_IMPLEMENTATION_END + + //GENERATE_METHODS_START /** - * Some nice Events handling - * @type {{}} + * start() + * - Just calls System.Start(options) + * @param options */ + start(options) { + //GENERATE_START_METHOD_START + //GENERATE_START_METHOD_END + + //CUSTOM_START_METHOD_START + System.Start(options); - _createClass(Event, [{ - key: "subscribe", - value: /** - * Subscribe to some events - * @param eventName - * @param callback - */ - function subscribe(eventName, callback) { - return Event.Subscribe(eventName, callback.bind(this)); - } - }, { - key: "emit", - value: function emit(eventName, data, clientCallback, clientErrorCallback) { - return Event.Emit(eventName, data, clientCallback, clientErrorCallback); - } - /** - * Execute the functions which subscribe to this event, but don't process the client callback - the subscription function - * should execute the client callback - * @param eventId - * @param data - * @param clientCallback - * @param clientErrorCallback - * @returns {number} - * @constructor + * Now do something else */ - }], [{ - key: "Subscribe", - value: function Subscribe(eventName, fn) { - /** - * Todo - maybe eventually store a boolean which indicates if the function has been executed - */ - var subscriptionId = Utils.RandomId(10); + console.log('something else'); + //CUSTOM_START_METHOD_END - if (Event.Subscriptions.hasOwnProperty(eventName)) { - if (Event.Subscriptions[eventName][subscriptionId]) { - throw new Error('A component can only subscribe to a particular event ID once'); - } + } - Event.Subscriptions[eventName][subscriptionId] = fn; - } else { - Event.Subscriptions[eventName] = {}; - Event.Subscriptions[eventName][subscriptionId] = fn; - } - /** - * Return a handle to the caller to allow us to unsubscribe to this event - */ + /** + * stop() + * - Just calls System.Stop(options) + * @param options + */ + stop(options) { + //GENERATE_STOP_METHOD_START + //GENERATE_STOP_METHOD_END - return { - fn: fn, - remove: function (eventId, subscriptionId) { - return function () { - /** - * Stop listening for this event from this component - */ - delete Event.Subscriptions[eventId][subscriptionId]; - /** - * If the length of listeners is 0, stop referencing this event - * @type {string[]} - */ + //CUSTOM_STOP_METHOD_START + System.Stop(options); + //CUSTOM_STOP_METHOD_END - var listeners = Object.keys(Event.Subscriptions[eventId]); + } + //GENERATE_METHODS_END - if (listeners.length === 0) { - delete Event.Subscriptions[eventId]; - } - }; - }(eventName, subscriptionId), - subscriptionId: subscriptionId - }; - } - }, { - key: "Emit", - value: - /** - * Static Synchronous Event - Calls clientCallback directly after the event result is obtained - * @param eventId - * @param data - * @param clientCallback is executed ideally when the event completed - * @param clientErrorCallback - * @returns {number} of callbacks executed - * @constructor - */ - function Emit(eventId, data, clientCallback, clientErrorCallback) { - if (Event.Subscriptions.hasOwnProperty(eventId)) { - var subscriptionIds = Object.keys(Event.Subscriptions[eventId]); - subscriptionIds.map(function (subscriptionId) { - try { - var result = Event.Subscriptions[eventId][subscriptionId](data); + //GENERATE_STATIC_METHODS_START - if (clientCallback) { - clientCallback(result); - } - } catch (error) { - if (clientErrorCallback) { - clientErrorCallback(error); - } else { - console.error(error); - throw error; - } - } - }); - } - } - }, { - key: "Async", - value: function Async(eventId, data, clientCallback, clientErrorCallback) { - if (Event.Subscriptions.hasOwnProperty(eventId)) { - var subscriptionIds = Object.keys(Event.Subscriptions[eventId]); - subscriptionIds.map(function (subscriptionId) { - try { - Event.Subscriptions[eventId][subscriptionId](data, clientCallback, clientErrorCallback); - } catch (error) { - if (clientErrorCallback) { - clientErrorCallback(error); - } else { - console.error(error); - throw error; - } - } - }); - } - } - }]); + /** + * Start() + * - Starts the system by registering subscriptions to events + * @param options + */ + static Start(options) { - return Event; -}(); + //GENERATE_STATIC_START_METHOD_START + //GENERATE_STATIC_START_METHOD_END -_defineProperty(Event, "Subscriptions", {}); + //CUSTOM_STATIC_START_METHOD_START + console.log('Starting system X'); + //CUSTOM_STATIC_START_METHOD_END + + } + + /** + * Stop() + * - Stops the system by removing these subscriptions to events + * @param options + */ + static Stop(options) { + + //GENERATE_STATIC_STOP_METHOD_START + //GENERATE_STATIC_STOP_METHOD_END + + //CUSTOM_STATIC_STOP_METHOD_START + console.log('Stopping system X'); + //CUSTOM_STATIC_STOP_METHOD_END + + } + //GENERATE_STATIC_METHODS_END + +} //CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_START +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_END + +module.exports = System;const Utils = require('./r3-utils'); + +/** + + GENERATE_INHERITED_START + + GENERATE_INHERITED_END + + CUSTOM_OPTIONS_START + CUSTOM_OPTIONS_END + + CUSTOM_METHODS_START + async(eventId, data, clientCallback, clientErrorCallback) - Simply calls 'Async()' passing it the arguments + emit(eventId, data, clientCallback, clientErrorCallback) - Simply calls 'Emit()' passing it the arguments + subscribe(eventId, callback) - Simply calls 'Subscribe()' passing it the arguments + CUSTOM_METHODS_END + + CUSTOM_STATIC_METHODS_START + Async(eventId, data, clientCallback, clientErrorCallback) - Calls all subscription functions registered to eventId with data, clientCallback and clientErrorCallback as arguments. If an error occurs during clientCallback it additionally will execute clientErrorCallback with the error as argument. + Emit(eventId, data, clientCallback, clientErrorCallback) - Calls all subscription functions registered to eventId with data as arg. Calls clientCallback directly after the event result is obtained, passing it the result. If an exception occurs during execution, the clientErrorCallback is called with the error as argument. + Subscribe(eventId, callback) - Subscribes to 'eventName', ex. Event.BEFORE_RENDER and executes 'callback()' when eventName is raised @return {Object} - A handle to the subscription which can be removed by calling handle.remove() + CUSTOM_STATIC_METHODS_END + + **/ + +class Event { + + //GENERATE_CONSTRUCTOR_START + constructor(options) { + + Event.Emit(Event.OBJECT_CREATED, this); + + //GENERATE_OPTIONS_INIT_START + //GENERATE_OPTIONS_INIT_END + + //CUSTOM_OPTIONS_INIT_START + //CUSTOM_OPTIONS_INIT_END + + Object.assign(this, options); + + //CUSTOM_BEFORE_INIT_START + //CUSTOM_BEFORE_INIT_END + + Event.Emit(Event.OBJECT_INITIALIZED, this); + + //CUSTOM_AFTER_INIT_START + //CUSTOM_AFTER_INIT_END + } + //GENERATE_CONSTRUCTOR_END + + //CUSTOM_IMPLEMENTATION_START + + /** + * Some nice Events handling + * @type {{}} + */ + static Subscriptions = {}; + + //CUSTOM_IMPLEMENTATION_END + + //GENERATE_METHODS_START + + /** + * async() + * - Simply calls 'Async()' passing it the arguments + * @param eventId + * @param data + * @param clientCallback + * @param clientErrorCallback + */ + async( + eventId, + data, + clientCallback, + clientErrorCallback + ) { + + //GENERATE_ASYNC_METHOD_START + //GENERATE_ASYNC_METHOD_END + + //CUSTOM_ASYNC_METHOD_START + return Event.Async( + eventId, + data, + clientCallback, + clientErrorCallback + ); + //CUSTOM_ASYNC_METHOD_END + + } + + /** + * emit() + * - Simply calls 'Emit()' passing it the arguments + * @param eventId + * @param data + * @param clientCallback + * @param clientErrorCallback + */ + emit( + eventId, + data, + clientCallback, + clientErrorCallback + ) { + + //GENERATE_EMIT_METHOD_START + //GENERATE_EMIT_METHOD_END + + //CUSTOM_EMIT_METHOD_START + return Event.Emit( + eventId, + data, + clientCallback, + clientErrorCallback + ); + //CUSTOM_EMIT_METHOD_END + + } + + /** + * subscribe() + * - Simply calls 'Subscribe()' passing it the arguments + * @param eventId + * @param callback + */ + subscribe( + eventId, + callback + ) { + + //GENERATE_SUBSCRIBE_METHOD_START + //GENERATE_SUBSCRIBE_METHOD_END + + //CUSTOM_SUBSCRIBE_METHOD_START + return Event.Subscribe(eventId, callback.bind(this)); + //CUSTOM_SUBSCRIBE_METHOD_END + + } + //GENERATE_METHODS_END + + //GENERATE_STATIC_METHODS_START + + /** + * Async() + * - Calls all subscription functions registered to eventId with data, clientCallback and clientErrorCallback as + * arguments. If an error occurs during clientCallback it additionally will execute clientErrorCallback with the + * error as argument. + * @param eventId + * @param data + * @param clientCallback + * @param clientErrorCallback + */ + static Async( + eventId, + data, + clientCallback, + clientErrorCallback + ) { + + //GENERATE_STATIC_ASYNC_METHOD_START + //GENERATE_STATIC_ASYNC_METHOD_END + + //CUSTOM_STATIC_ASYNC_METHOD_START + if (Event.Subscriptions.hasOwnProperty(eventId)) { + + let subscriptionIds = Object.keys(Event.Subscriptions[eventId]); + + subscriptionIds.map( + function(subscriptionId) { + try { + Event.Subscriptions[eventId][subscriptionId](data, clientCallback, clientErrorCallback); + } catch (error) { + if (clientErrorCallback) { + clientErrorCallback(error); + } else { + console.error(error); + throw error; + } + } + } + ) + } + //CUSTOM_STATIC_ASYNC_METHOD_END + + } + + /** + * Emit() + * - Calls all subscription functions registered to eventId with data as arg. Calls clientCallback directly after + * the event result is obtained, passing it the result. If an exception occurs during execution, the + * clientErrorCallback is called with the error as argument. + * @param eventId + * @param data + * @param clientCallback + * @param clientErrorCallback + */ + static Emit( + eventId, + data, + clientCallback, + clientErrorCallback + ) { + + //GENERATE_STATIC_EMIT_METHOD_START + //GENERATE_STATIC_EMIT_METHOD_END + + //CUSTOM_STATIC_EMIT_METHOD_START + if (Event.Subscriptions.hasOwnProperty(eventId)) { + + let subscriptionIds = Object.keys(Event.Subscriptions[eventId]); + + subscriptionIds.map( + function(subscriptionId) { + try { + let result = Event.Subscriptions[eventId][subscriptionId](data); + + if (clientCallback) { + clientCallback(result); + } + } catch (error) { + if (clientErrorCallback) { + clientErrorCallback(error); + } else { + console.error(error); + throw error; + } + } + } + ) + } + //CUSTOM_STATIC_EMIT_METHOD_END + + } + + /** + * Subscribe() + * - Subscribes to 'eventName', ex. Event.BEFORE_RENDER and executes 'callback()' when eventName is raised + * @param eventId + * @param callback \n * @returns {Object} - A handle to the subscription which can be removed by calling handle.remove() + */ + static Subscribe( + eventId, + callback + ) { + + //GENERATE_STATIC_SUBSCRIBE_METHOD_START + //GENERATE_STATIC_SUBSCRIBE_METHOD_END + + //CUSTOM_STATIC_SUBSCRIBE_METHOD_START + let subscriptionId = Utils.RandomId(10); + + if (Event.Subscriptions.hasOwnProperty(eventId)) { + + if (Event.Subscriptions[eventId][subscriptionId]) { + throw new Error('A component can only subscribe to a particular event ID once'); + } + + Event.Subscriptions[eventId][subscriptionId] = callback; + } else { + Event.Subscriptions[eventId] = {}; + Event.Subscriptions[eventId][subscriptionId] = callback; + } + + /** + * Return a handle to the caller to allow us to unsubscribe to this event + */ + return { + fn: callback, + remove: function (eventId, subscriptionId) { + + return function () { + + /** + * Stop listening for this event from this component + */ + delete Event.Subscriptions[eventId][subscriptionId]; + + /** + * If the length of listeners is 0, stop referencing this event + * @type {string[]} + */ + let listeners = Object.keys(Event.Subscriptions[eventId]); + if (listeners.length === 0) { + delete Event.Subscriptions[eventId]; + } + } + + }(eventId, subscriptionId), + subscriptionId : subscriptionId + }; + //CUSTOM_STATIC_SUBSCRIBE_METHOD_END + + } + //GENERATE_STATIC_METHODS_END + +} + +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_START + //EVENT_GENERATED_START Event.COMPONENT_INITIALIZED = 0x1; Event.CREATE_INSTANCE_BEFORE = 0x2; @@ -305,491 +454,2561 @@ Event.UPDATE_INSTANCE_AFTER = 0x10; Event.UPDATE_INSTANCE_BEFORE = 0x11; Event.MAX_EVENTS = 0x12; -Event.GetEventName = function (eventId) { - switch (eventId) { - case 0x1: - return 'component_initialized'; +Event.GetEventName = function(eventId) { - case 0x2: - return 'create_instance_before'; + switch(eventId) { + case 0x1 : return 'component_initialized'; + case 0x2 : return 'create_instance_before'; + case 0x3 : return 'dispose_instance'; + case 0x4 : return 'dispose_object'; + case 0x5 : return 'get_runtime'; + case 0x6 : return 'get_window_size'; + case 0x7 : return 'instance_created'; + case 0x8 : return 'instance_disposed'; + case 0x9 : return 'object_created'; + case 0xa : return 'object_initialized'; + case 0xb : return 'pause'; + case 0xc : return 'restart'; + case 0xd : return 'start'; + case 0xe : return 'update_from_instance_after'; + case 0xf : return 'update_from_instance_before'; + case 0x10 : return 'update_instance_after'; + case 0x11 : return 'update_instance_before'; + default : + throw new Error('Event type not defined : ' + eventId); + } - case 0x3: - return 'dispose_instance'; +}; +//EVENT_GENERATED_END - case 0x4: - return 'dispose_object'; - - case 0x5: - return 'get_runtime'; - - case 0x6: - return 'get_window_size'; - - case 0x7: - return 'instance_created'; - - case 0x8: - return 'instance_disposed'; - - case 0x9: - return 'object_created'; - - case 0xa: - return 'object_initialized'; - - case 0xb: - return 'pause'; - - case 0xc: - return 'restart'; - - case 0xd: - return 'start'; - - case 0xe: - return 'update_from_instance_after'; - - case 0xf: - return 'update_from_instance_before'; - - case 0x10: - return 'update_instance_after'; - - case 0x11: - return 'update_instance_before'; - - default: - throw new Error('Event type not defined : ' + eventId); - } -}; //EVENT_GENERATED_END //CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_END +module.exports = Event;const Event = require('./r3-event'); -module.exports = Event; - -/***/ }), - -/***/ "./src/r3/r3-r3-object.js": -/*!********************************!*\ - !*** ./src/r3/r3-r3-object.js ***! - \********************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } - -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } - -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } - -function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } - -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } - -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } - -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } - -var Utils = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'r3-utils'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); - -var Event = __webpack_require__(!(function webpackMissingModule() { var e = new Error("Cannot find module 'r3-event.js'"); e.code = 'MODULE_NOT_FOUND'; throw e; }())); /** - OPTIONS_START - id=Utils.RandomId(10) - name=this.constructor.name + '(' + options.id + ')' - register=true - OPTIONS_END + GENERATE_INHERITED_START - INSTANCE_OPTIONS_MAPPING_START - INSTANCE_OPTIONS_MAPPING_END + GENERATE_INHERITED_END - LINKED_OBJECTS_START - LINKED_OBJECTS_END + CUSTOM_OPTIONS_START + CUSTOM_OPTIONS_END - EXCLUDED_FROM_INSTANCE_OPTIONS_START - id - name - register - EXCLUDED_FROM_INSTANCE_OPTIONS_END + CUSTOM_METHODS_START + CUSTOM_METHODS_END + + CUSTOM_STATIC_METHODS_START + CUSTOM_STATIC_METHODS_END **/ +class Utils { -var R3Object = /*#__PURE__*/function (_Event) { - _inherits(R3Object, _Event); + //GENERATE_CONSTRUCTOR_START + constructor(options) { - var _super = _createSuper(R3Object); + Event.Emit(Event.OBJECT_CREATED, this); - //CONSTRUCTOR_EXTENDS_TEMPLATE_START - function R3Object(options) { - var _this; + //GENERATE_OPTIONS_INIT_START + //GENERATE_OPTIONS_INIT_END - _classCallCheck(this, R3Object); + //CUSTOM_OPTIONS_INIT_START + //CUSTOM_OPTIONS_INIT_END + + Object.assign(this, options); + + //CUSTOM_BEFORE_INIT_START + //CUSTOM_BEFORE_INIT_END + + Event.Emit(Event.OBJECT_INITIALIZED, this); + + //CUSTOM_AFTER_INIT_START + //CUSTOM_AFTER_INIT_END + } + //GENERATE_CONSTRUCTOR_END + + //CUSTOM_IMPLEMENTATION_START + static GetFirstParent(object, constructor) { + + if (Utils.UndefinedOrNull(constructor)) { + throw new Error('You need to specify a constructor'); + } + + if (object.parent === null) { + return null; + } + + if (object.parent instanceof constructor) { + return object.parent; + } else { + return Utils.GetFirstParent(object.parent, constructor); + } + + }; + + static SyntaxHighlight(json) { + if (typeof json != 'string') { + json = JSON.stringify(json, undefined, 2); + } + json = json.replace(/&/g, '&').replace(//g, '>'); + return json.replace(/("(\u[a-zA-Z0-9]{4}|\[^u]|[^\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) { + let cls = 'number'; + if (/^"/.test(match)) { + if (/:$/.test(match)) { + cls = 'key'; + } else { + cls = 'string'; + } + } else if (/true|false/.test(match)) { + cls = 'boolean'; + } else if (/null/.test(match)) { + cls = 'null'; + } + return '' + match + ''; + }); + }; + + static GetParentProject(component) { + + if (Utils.UndefinedOrNull(component.parent)) { + throw new Error('Parent not found'); + } + + if (component.parent instanceof R3.Project) { + return component.parent; + } + + return Utils.GetParentProject(component.parent); + }; + + static GetParents(component, parents) { + + if (Utils.UndefinedOrNull(parents)) { + parents = []; + } + + if (Utils.UndefinedOrNull(component.parent)) { + return parents; + } + + parents.push(component.parent); + + return Utils.GetParents(component.parent, parents); + + }; + + /** + * @return {boolean} + */ + static Instance(component) { + return Utils.Defined(component) && Utils.Defined(component.instance); + }; + + /** + * Utils.RemoveFromSelect + * @param select + * @param id + * @returns {boolean} + * @constructor + */ + static RemoveFromSelect(select, id) { + + let i; + + for (i = 0; i < select.options.length; i++) { + if (select.options[i].value === id) { + select.remove(i); + return true; + } + } + return false; + }; + + /** + * Utils.GetSelectIndex + * + * Get the select index of given id + * + * @param select + * @param id + * @returns boolean true if successful + * + * @constructor + */ + static SetSelectIndex(select, id) { + for (let i = 0; i < select.options.length; i++) { + if (select.options[i].value === id) { + select.selectedIndex = i; + return true; + } + } + return false; + }; + + static SortSelect(select) { + + let tmp = []; + let i; + + for (i = 1; i < select.options.length; i++) { + tmp[i-1] = []; + tmp[i-1][0] = select.options[i].text; + tmp[i-1][1] = select.options[i].value; + } + + tmp.sort(); + + select.options = [select.options[0]]; + + for (i = 0; i < tmp.length; i++) { + select.options[i+1] = new Option(tmp[i][0], tmp[i][1]); + } + + return; + }; + + /** + * Gets the parent of object whith property of optional type constructor. If index is specified, get the parent of the + * object with property[index] - which means the property should be an array + * @param object + * @param property + * @param index + * @param constructor + * @returns {*} + * @constructor + */ + static GetParent(object, property, index, constructor) { + + if (Utils.UndefinedOrNull(constructor)) { + constructor = null; + } + + if (Utils.UndefinedOrNull(index)) { + index = null; + } + + if (object.parent) { + /** + * Parent defined + */ + if (object.parent.hasOwnProperty(property)) { + + if (constructor) { + + if (index) { + + if (object.parent[property][index] instanceof constructor) { + return object.parent[property][index]; + } else { + + if (typeof object.parent.getParent === 'function') { + return object.parent.getParent(property, index, constructor); + } else { + console.warn('getParent not defined on API object : ' + object.parent + ' - you should avoid having these messsages'); + return null; + } + } + + } else { + if (object.parent[property] instanceof constructor) { + return object.parent[property]; + } else { + + if (typeof object.parent.getParent === 'function') { + return object.parent.getParent(property, index, constructor); + } else { + console.warn('getParent not defined on API object : ' + object.parent + ' - you should avoid having these messsages'); + return null; + } + + } + } + + } else { + + if (index) { + return object.parent[property][index]; + } else { + return object.parent[property]; + } + + } + } else { + + /** + * This parent does not have the property - go a level higher + */ + if (typeof object.parent.getParent === 'function') { + return object.parent.getParent(property, index, constructor); + } else { + console.warn('getParent not defined on API object : ' + object.parent + ' - you should avoid having these messsages'); + return null; + } + } + + } else { + /** + * No parent defined + */ + console.warn('property : ' + property + ' of type ' + constructor + ' was not found in the parent chain'); + return null; + } + + }; + + + /** + * Strips image extension from given path + * @param imagePath + * @constructor + */ + static StripImageExtension(imagePath) { + return imagePath.replace(/(\.png$|\.gif$|\.jpeg$|\.jpg$)/,'') + }; + + /** + * Returns true if unloaded + * @param component + * @returns {boolean} + * @constructor + */ + static Unloaded(component) { + if ( + Utils.UndefinedOrNull(component) || + Utils.UndefinedOrNull(component.instance) + ) { + return true; + } + + return false; + }; + + /** + * + * @param component + * @returns {boolean} + * @constructor + */ + static Loaded(component) { + if (component && component.instance) { + return true; + } + + return false; + }; + + static BuildVectorSource(result, name, dimension) { + + if (dimension === 2) { + result[name] = {}; + result[name].x = false; + result[name].y = false; + return; + } + + if (dimension === 3) { + result[name] = {}; + result[name].x = false; + result[name].y = false; + result[name].y = false; + return; + } + + if (dimension === 4) { + result[name] = {}; + result[name].x = false; + result[name].y = false; + result[name].z = false; + result[name].w = false; + return; + } + + console.warn('unknown dimension : ' + dimension); + }; + + /** + * Returns all 'instances' of the array, or null if an 'instance' is undefined + * @constructor + * @param array + */ + static GetArrayInstances(array) { + return array.reduce( + function(result, object) { + + if (result === null) { + return result; + } + + if (Utils.UndefinedOrNull(object.instance)) { + result = null; + } else { + result.push(object.instance); + } + + return result; + }, + [] + ); + }; + + static SortFacesByMaterialIndex(faces) { + + /** + * Sorts faces according to material index because later we will create + * groups for each vertice group + */ + faces.sort(function(a, b) { + + if (a.materialIndex < b.materialIndex) { + return -1; + } + + if (a.materialIndex > b.materialIndex) { + return 1; + } + + return 0; + }); + + return faces; + }; + + static BuildQuaternionSource(result, name) { + result[name] = {}; + result[name].axis = {}; + result[name].axis.x = false; + result[name].axis.y = false; + result[name].axis.z = false; + result[name].angle = false; + result[name].x = false; + result[name].y = false; + result[name].z = false; + result[name].w = false; + }; + + static ObjectPropertiesAsBoolean(object) { + return Object.keys(object).reduce( + function(result, propertyId) { + + if (typeof object[propertyId] === 'function') { + return result; + } + + result[propertyId] = false; + + // if (object[propertyId] instanceof R3.Vector2) { + // Utils.BuildVectorSource(result, propertyId, 2); + // } + // + // if (object[propertyId] instanceof R3.Vector3) { + // Utils.BuildVectorSource(result, propertyId, 3); + // } + // + // if (object[propertyId] instanceof R3.Vector4) { + // Utils.BuildVectorSource(result, propertyId, 4); + // } + // + // if (object[propertyId] instanceof R3.Quaternion) { + // Utils.BuildQuaternionSource(result, propertyId); + // } + + return result; + + }.bind(this), + {} + ); + }; + + static GetRuntime() { + + let result = null; + + R3.Event.Emit( + R3.Event.GET_RUNTIME, + null, + function(runtime) { + result = runtime; + } + ); + + return result; + }; + + /** + * Returns the window size or null + * @returns {*} + * @constructor + */ + static GetWindowSize() { + + let size = null; + + R3.Event.Emit( + R3.Event.GET_WINDOW_SIZE, + null, + function(data) { + size = data; + }.bind(this) + ); + + return size; + + }; + + /** + * Convenience function to update object width and height members with window size + * @param object + * @constructor + */ + static UpdateWindowSize(object) { + let size = Utils.GetWindowSize(); + object.width = size.width; + object.height = size.height; + }; + + + /** + * Returns id of object with the name if it exists in the array, otherwise null + * @param name + * @param array + * @returns {*} + * @constructor + */ + static ObjectIdWithNameInArray(name, array) { + + return array.reduce( + function(result, object) { + + if (result) { + return result; + } + + if (name === object.name) { + return object.id; + } + + return null; + }, + null + ); + }; + + static LoadIdsFromArrayToIdObject(array, idToObject) { + + }; + + static LoadIdsFromObjectToIdObject(object, idToObject) { + + + }; + + /** + * Gets random int exclusive of maximum but inclusive of minimum + * @param min + * @param max + * @returns {*} + * @constructor + */ + static GetRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive + }; + + /** + * Gets random int inclusive of minimum and maximum + * @param min + * @param max + * @returns {*} + * @constructor + */ + static GetRandomIntInclusive(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1)) + min; //The maximum is inclusive and the minimum is inclusive + }; + + static InterpolateArray(data, fitCount) { + + let linearInterpolate = function(before, after, atPoint) { + return before + (after - before) * atPoint; + }; + + let newData = []; + + let springFactor = Number((data.length - 1) / (fitCount - 1)); + + newData[0] = data[0]; // for new allocation + + for ( let i = 1; i < fitCount - 1; i++) { + let tmp = i * springFactor; + let before = Number(Math.floor(tmp)).toFixed(); + let after = Number(Math.ceil(tmp)).toFixed(); + let atPoint = tmp - before; + newData[i] = linearInterpolate(data[before], data[after], atPoint); + } + + newData[fitCount - 1] = data[data.length - 1]; // for new allocation + + return newData; + }; + + /** + * Undefined or null check + * @param variable + * @returns {boolean} + * @constructor + */ + static UndefinedOrNull( + variable + ) { + return typeof variable === 'undefined' || variable === null; + }; + + /** + * The variable is not undefined and not null + * @param variable + * @returns {boolean} + * @constructor + */ + static Defined( + variable + ) { + return typeof variable !== 'undefined' && variable !== null; + }; + + /** + * Gets function parameters + * @param fn + * @constructor + */ + static GetParameters(fn) { + + let FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; + let FN_ARG_SPLIT = /,/; + let FN_ARG = /^\s*(_?)(.+?)\s*$/; + let STRIP_COMMENTS = /(\/\/.*$)|(\/\*[\s\S]*?\*\/)|(\s*=[^,\)]*(('(?:\'|[^'\r\n])*')|("(?:\"|[^"\r\n])*"))|(\s*=[^,\)]*))/mg; + + let parameters, + fnText, + argDecl; + + if (typeof fn !== 'function') { + parameters = []; + fnText = fn.toString().replace(STRIP_COMMENTS, ''); + argDecl = fnText.match(FN_ARGS); + argDecl[1].split(FN_ARG_SPLIT).forEach(function(arg) { + arg.replace(FN_ARG, function(all, underscore, name) { + parameters.push(name); + }); + }); + } else { + throw Error("not a function") + } + + return parameters; + }; + + /** + * Returns either an ID of the object or Null + * @param object + * @returns {null} + * @constructor + */ + static IdOrNull(object) { + if (Utils.UndefinedOrNull(object)) { + return null; + } else { + if (Utils.UndefinedOrNull(object.id)) { + console.warn('saving an object reference with no ID : ', object); + return null; + } + return object.id; + } + }; + + /** + * Limit a property to values between -pi and +pi + * @param property + * @param objectProperty + * @returns {{configurable?: boolean, enumerable?: boolean, value?, writable?: boolean, get?: Function, set?: Function}} + * @constructor + */ + static LimitToPI(property, objectProperty) { + + let store = objectProperty; + + return { + get : function() { + return store; + }, + set : function(value) { + while (value > Math.PI) { + value -= (Math.PI * 2); + } + + while (value < -(Math.PI)) { + value += (Math.PI * 2); + } + + store = value; + } + }; + }; + + /** + * Returns an array of IDs representing the objects + * @param array + * @returns [] + * @constructor + */ + static IdArrayOrEmptyArray(array) { + if (Utils.UndefinedOrNull(array)) { + return []; + } else { + + return array.map(function(item) { + + if (Utils.UndefinedOrNull(item.id)) { + throw new Error('No ID found while trying to store IDs to array'); + } + + return item.id + }); + } + }; + + /** + * Links an object to its parent through idToObject array + * @param propertyString + * @param idToObject + * @param parentObject + * @param id + * @constructor + */ + static Link(propertyString, idToObject, parentObject, id) { + + if (!Utils.UndefinedOrNull(parentObject[propertyString])) { + + if (!idToObject.hasOwnProperty(id)) { + console.warn('Linking failed for object:' + parentObject.name); + } + + parentObject[propertyString] = idToObject[id]; + } + }; + + /** + * Generates a random ID + * @returns {string} + * @constructor + */ + static RandomId(length) { + + if (Utils.UndefinedOrNull(length)) { + length = 10; + } + + return Math.random().toString(36).substr(2, length); + }; + + static InvertWindingOrder(triangles) { + + for (let i = 0; i < triangles.length; i++) { + let v1 = triangles[i].v1; + triangles[i].v1 = triangles[i].v2; + triangles[i].v2 = v1; + + let backupUV = triangles[i].triangle.v1uv; + triangles[i].triangle.v1uv = triangles[i].triangle.v2uv; + triangles[i].triangle.v2uv = backupUV; + } + + return triangles; + }; + + /** + * Inverts a mesh winding order (and its instance) + * @param mesh R3.D3.Mesh + * @returns {*} + * @constructor + */ + static InvertMeshWindingOrder(mesh) { + + mesh.faces.forEach( + function(face) { + + let tmpV1 = face.v1; + face.v1 = face.v2; + face.v2 = tmpV1; + + let tmpV1uv = face.v1uv; + face.v1uv = face.v2uv; + face.v2uv = tmpV1uv; + + }.bind(this) + ); + + //mesh.computeNormals = true; + //mesh.createInstance(); + }; + + /** + * This function resets a the winding order of a mesh from a reference point V (the average center of the mesh) + */ + static ResetWindingOrder(faces, vertices) { + + let vertexList = new R3.API.Vector3.Points(); + + for (let v = 0; v < vertices.length; v++) { + vertexList.add(new R3.API.Vector3( + vertices[v].position.x, + vertices[v].position.y, + vertices[v].position.z + )); + } + + let V = vertexList.average(); + + let triangles = []; + + for (let s = 0; s < faces.length; s += 3) { + + let v0 = faces[s]; + let v1 = faces[s+1]; + let v2 = faces[s+2]; + + triangles.push( + { + v0 : v0, + v1 : v1, + v2 : v2, + edges : [ + {v0: v0, v1: v1}, + {v0: v1, v1: v2}, + {v0: v2, v1: v0} + ], + winding : 0, + edgeIndex : -1, + processed : false + } + ); + } + + for (let i = 0; i < triangles.length; i++) { + if ( + R3.API.Vector3.clockwise( + vertices[triangles[i].v0].position, + vertices[triangles[i].v1].position, + vertices[triangles[i].v2].position, + V + ) + ) { + console.log('clockwise'); + let bv1 = triangles[i].v1; + triangles[i].v1 = triangles[i].v2; + triangles[i].v2 = bv1; + } else { + console.log('not clockwise'); + } + } + + return triangles; + }; + + /** + * This function resets the winding order for triangles in faces, given an initial triangle and orientation edge + * used pseudocode from + * http://stackoverflow.com/questions/17036970/how-to-correct-winding-of-triangles-to-counter-clockwise-direction-of-a-3d-mesh + * We need to use a graph traversal algorithm, + * lets assume we have method that returns neighbor of triangle on given edge + * + * neighbor_on_egde( next_tria, edge ) + * + * to_process = set of pairs triangle and orientation edge, initial state is one good oriented triangle with any edge on it + * processed = set of processed triangles; initial empty + * + * while to_process is not empty: + * next_tria, orientation_edge = to_process.pop() + * add next_tria in processed + * if next_tria is not opposite oriented than orientation_edge: + * change next_tria (ABC) orientation (B<->C) + * for each edge (AB) in next_tria: + * neighbor_tria = neighbor_on_egde( next_tria, edge ) + * if neighbor_tria exists and neighbor_tria not in processed: + * to_process add (neighbor_tria, edge opposite oriented (BA)) + * @param faces R3.D3.Face[] + * @param orientationEdge R3.API.Vector2 + * @returns {Array} + */ + static FixWindingOrder(faces, orientationEdge) { + + /** + * Checks if a Face belonging to a TriangleEdge has already been processed + * @param processed TriangleEdge[] + * @param triangle Face + * @returns {boolean} + */ + function inProcessed(processed, triangle) { + + for (let i = 0; i < processed.length; i++) { + if (processed[i].triangle.equals(triangle)) { + return true; + } + } + + return false; + } + + /** + * Returns a neighbouring triangle on a specific edge - preserving the edge orientation + * @param edge R3.API.Vector2 + * @param faces R3.D3.Face[] + * @param currentTriangle + * @returns {*} + */ + function neighbourOnEdge(edge, faces, currentTriangle) { + + for (let i = 0; i < faces.length; i++) { + if ( + (faces[i].v0 === edge.x && faces[i].v1 === edge.y) || + (faces[i].v1 === edge.x && faces[i].v2 === edge.y) || + (faces[i].v2 === edge.x && faces[i].v0 === edge.y) || + (faces[i].v0 === edge.y && faces[i].v1 === edge.x) || + (faces[i].v1 === edge.y && faces[i].v2 === edge.x) || + (faces[i].v2 === edge.y && faces[i].v0 === edge.x) + ) { + + let triangle = new R3.D3.API.Face( + null, + null, + faces[i].v0index, + faces[i].v1index, + faces[i].v2index, + faces[i].materialIndex, + faces[i].uvs + ); + + if (triangle.equals(currentTriangle)) { + continue; + } + + return new R3.D3.TriangleEdge( + triangle, + edge + ); + } + } + + return null; + } + + let toProcess = [ + new R3.D3.TriangleEdge( + new R3.D3.API.Face( + null, + null, + faces[0].v0index, + faces[0].v1index, + faces[0].v2index, + faces[0].materialIndex, + faces[0].uvs + ), + orientationEdge + ) + ]; + + let processed = []; + + while (toProcess.length > 0) { + + let triangleEdge = toProcess.pop(); + + /** + * If edge is the same orientation (i.e. the edge order is the same as the given triangle edge) it needs to be reversed + * to have the same winding order) + */ + if ( + (triangleEdge.triangle.v0index === triangleEdge.edge.x && + triangleEdge.triangle.v1index === triangleEdge.edge.y) || + (triangleEdge.triangle.v1index === triangleEdge.edge.x && + triangleEdge.triangle.v2index === triangleEdge.edge.y) || + (triangleEdge.triangle.v2index === triangleEdge.edge.x && + triangleEdge.triangle.v0index === triangleEdge.edge.y) + ) { + let backupV = triangleEdge.triangle.v1index; + triangleEdge.triangle.v1index = triangleEdge.triangle.v2index; + triangleEdge.triangle.v2index = backupV; + + // let backupUV = triangleEdge.triangle.v1uv; + // triangleEdge.triangle.v1uv = triangleEdge.triangle.v2uv; + // triangleEdge.triangle.v2uv = backupUV; + // + let backupUV = triangleEdge.triangle.uvs[0][1]; + triangleEdge.triangle.uvs[0][1] = triangleEdge.triangle.uvs[0][2]; + triangleEdge.triangle.uvs[0][2] = backupUV; + } + + processed.push(triangleEdge); + + let edges = [ + new R3.API.Vector2( + triangleEdge.triangle.v0index, + triangleEdge.triangle.v1index + ), + new R3.API.Vector2( + triangleEdge.triangle.v1index, + triangleEdge.triangle.v2index + ), + new R3.API.Vector2( + triangleEdge.triangle.v2index, + triangleEdge.triangle.v0index + ) + ]; + + for (let j = 0; j < edges.length; j++) { + let neighbour = neighbourOnEdge(edges[j], faces, triangleEdge.triangle); + if (neighbour && !inProcessed(processed, neighbour.triangle)) { + toProcess.push(neighbour); + } + } + } + + /** + * In processed - we will have some duplicates - only add the unique ones + * @type {Array} + */ + let triangles = []; + for (let i = 0; i < processed.length; i++) { + let found = false; + for (let k = 0; k < triangles.length; k++) { + if (triangles[k].equals(processed[i].triangle)){ + found = true; + break; + } + } + if (!found) { + triangles.push(processed[i].triangle); + } + } + + return triangles; + }; + + /** + * This is a work-around function to fix polys which don't triangulate because + * they could lie on Z-plane (XZ or YZ)) - we translate the poly to the origin, systematically rotate the poly around + * Z then Y axis + * @param verticesFlat [] + * @param grain is the amount to systematically rotate the poly by - a finer grain means a more accurate maximum XY + * @return [] + */ + static FixPolyZPlane(verticesFlat, grain) { + + if ((verticesFlat.length % 3) !== 0 && !(verticesFlat.length > 9)) { + console.log("The vertices are not in the right length : " + verticesFlat.length); + } + + let vertices = []; + + let points = new R3.API.Quaternion.Points(); + + for (let i = 0; i < verticesFlat.length; i += 3) { + points.add(new R3.API.Vector3( + verticesFlat[i], + verticesFlat[i + 1], + verticesFlat[i + 2] + )); + } + + points.toOrigin(); + + points.maximizeXDistance(grain); + + points.maximizeYDistance(grain); + + for (i = 0; i < points.vectors.length; i++) { + vertices.push( + [ + points.vectors[i].x, + points.vectors[i].y + ] + ); + } + + return vertices; + }; + + static MovingAverage(period) { + let nums = []; + return function(num) { + nums.push(num); + if (nums.length > period) + nums.splice(0,1); // remove the first element of the array + let sum = 0; + for (let i in nums) + sum += nums[i]; + let n = period; + if (nums.length < period) + n = nums.length; + return(sum/n); + } + }; + + static Intersect(a, b) { + + let t; + + /** + * Loop over shortest array + */ + if (b.length > a.length) { + t = b; + b = a; + a = t; + } + + return a.filter( + /** + * Check if exists + * @param e + * @returns {boolean} + */ + function(e) { + return (b.indexOf(e) > -1); + } + ).filter( + /** + * Remove Duplicates + * @param e + * @param i + * @param c + * @returns {boolean} + */ + function(e, i, c) { + return c.indexOf(e) === i; + } + ); + }; + + static Difference(a, b) { + + let t; + + /** + * Loop over shortest array + */ + if (b.length > a.length) { + t = b; + b = a; + a = t; + } + + return a.filter( + /** + * Check if exists + * @param e + * @returns {boolean} + */ + function(e) { + return (b.indexOf(e) === -1); + } + ).filter( + /** + * Remove Duplicates + * @param e + * @param i + * @param c + * @returns {boolean} + */ + function(e, i, c) { + return c.indexOf(e) === i; + } + ); + }; + + /** + * Push only if not in there already + * @param array + * @param object + * @constructor + */ + static PushUnique(array, object) { + + if (array.indexOf(object) === -1) { + array.push(object); + } + }; + + /** + * Checks whether or not the object is empty + * @param obj + * @returns {boolean} + * @constructor + */ + static IsEmpty(obj) { + return (Object.keys(obj).length === 0 && obj.constructor === Object); + }; + + static IsString(member) { + return (typeof member === 'string'); + }; + + static IsBoolean(member) { + return (member === true || member === false); + }; + + static IsColor(member) { + return (member instanceof R3.Color); + }; + + static IsNumber(member) { + return (typeof member === 'number'); + }; + + static IsVector2(member) { + return ( + member instanceof R3.API.Vector2 || + member instanceof R3.Vector2 + ); + }; + + static IsVector3(member) { + return ( + member instanceof R3.API.Vector3 || + member instanceof R3.Vector3 + ); + }; + + static IsVector4(member) { + return ( + member instanceof R3.API.Vector4 || + member instanceof R3.Vector4 || + member instanceof R3.API.Quaternion || + member instanceof R3.Quaternion + ); + }; + + static IsObject(member) { + let type = typeof member; + return type === 'function' || type === 'object' && !!member; + }; + + /** + * @return {string} + */ + static LowerUnderscore(name) { + let string = name.toLowerCase().replace(/\s+/g, '_'); + string = string.replace(/-/g, '_'); + string = string.replace(/\_+/g, '_'); + return string; + }; + + static UpperCaseWordsSpaces(input) { + + let word = input.replace(/[-_]/g, ' '); + + word = word.replace(/\s+/, ' '); + + let words = word.split(' '); + + return words.reduce( + function(result, word) { + result += word[0].toUpperCase() + word.substr(1); + return result + ' '; + }, + '' + ).trim(); + }; + + /** + * @return {string} + */ + static UpperCaseUnderscore(word) { + + let str = ''; + + word.split('').map( + function(letter){ + if (letter === letter.toUpperCase()) { + str += '_' + letter; + } else { + str += letter.toUpperCase(); + } + }); + + str = str.replace(new RegExp('^_'),''); + + return str; + }; + + /** + * Returns Left Padded Text - ex. length 5, padchar 0, string abc = '00abc' + * @param length + * @param padChar + * @param string + * @returns {string} + * @constructor + */ + static PaddedText(length, padChar, string) { + + let pad = ""; + + for (let x = 0; x < length; x++) { + pad += padChar; + } + + return pad.substring(0, pad.length - string.length) + string; + }; + //CUSTOM_IMPLEMENTATION_END + + //GENERATE_METHODS_START + //GENERATE_METHODS_END + + //GENERATE_STATIC_METHODS_START + //GENERATE_STATIC_METHODS_END + +} + +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_START +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_END + +module.exports = Utils;const Event = require('.././r3-event'); +const Utils = require('.././r3-utils'); +const System = require('./r3-system.js'); + +/** + + GENERATE_INHERITED_START + + [Inherited from System] + + Properties: + + - started (Default value false) + + Methods: + + - start(options) + Just calls System.Start(options) + + - stop(options) + Just calls System.Stop(options) + + Static Methods: + + - Start(options) + Starts the system by registering subscriptions to events + + - Stop(options) + Stops the system by removing these subscriptions to events + + [Belonging to SystemLinking] + + Properties: + + + + Methods: + + + + Static Methods: + + + + GENERATE_INHERITED_END + + CUSTOM_OPTIONS_START + CUSTOM_OPTIONS_END + + CUSTOM_EVENT_LISTENERS_START + CUSTOM_EVENT_LISTENERS_END + + **/ + +class SystemLinking extends System { + + //GENERATE_CONSTRUCTOR_EXTENDS_START + constructor(options) { if (Utils.UndefinedOrNull(options)) { options = {}; } - _this = _super.call(this, options); + super(options); - _this.emit(Event.OBJECT_CREATED, _assertThisInitialized(_this)); //OPTIONS_INIT_START + this.emit(Event.OBJECT_CREATED, this); + //GENERATE_OPTIONS_INIT_START + //GENERATE_OPTIONS_INIT_END - if (typeof options === 'undefined') { - options = {}; - } - - if (Utils.UndefinedOrNull(options.id)) { - options.id = Utils.RandomId(10); - } - - if (Utils.UndefinedOrNull(options.name)) { - options.name = _this.constructor.name + '(' + options.id + ')'; - } - - if (Utils.UndefinedOrNull(options.register)) { - options.register = true; - } //OPTIONS_INIT_END //CUSTOM_OPTIONS_INIT_START //CUSTOM_OPTIONS_INIT_END + Object.assign(this, options); - Object.assign(_assertThisInitialized(_this), options); //CUSTOM_BEFORE_INIT_START + //CUSTOM_BEFORE_INIT_START //CUSTOM_BEFORE_INIT_END - _this.emit(Event.OBJECT_INITIALIZED, _assertThisInitialized(_this)); + this.emit(Event.OBJECT_INITIALIZED, this); - return _this; - } //CONSTRUCTOR_EXTENDS_TEMPLATE_END - //CREATE_INSTANCE_TEMPLATE_START + //CUSTOM_AFTER_INIT_START + //CUSTOM_AFTER_INIT_END + } + //GENERATE_CONSTRUCTOR_EXTENDS_END + //GENERATE_EVENT_LISTENERS_START + //GENERATE_EVENT_LISTENERS_END - _createClass(R3Object, [{ - key: "createInstance", - value: function createInstance() { - //CREATE_INSTANCE_BEFORE_START - this.emit(Event.CREATE_INSTANCE_BEFORE, this); //CREATE_INSTANCE_BEFORE_END - //CUSTOM_CREATE_INSTANCE_START - //CUSTOM_CREATE_INSTANCE_END - //CREATE_INSTANCE_AFTER_START + //CUSTOM_IMPLEMENTATION_START + //CUSTOM_IMPLEMENTATION_END - this[this.runtime].createInstance(this, {//CREATE_INSTANCE_OPTIONS_START - //CREATE_INSTANCE_OPTIONS_END - }); - this.emit(Event.INSTANCE_CREATED, this); //CREATE_INSTANCE_AFTER_END - } //CREATE_INSTANCE_TEMPLATE_END - //UPDATE_INSTANCE_TEMPLATE_START +} - }, { - key: "updateInstance", - value: function updateInstance(property) { - //UPDATE_INSTANCE_BEFORE_START - this.emit(Event.UPDATE_INSTANCE_BEFORE, this); //UPDATE_INSTANCE_BEFORE_END - //UPDATE_INSTANCE_OPTIONS_START - //UPDATE_INSTANCE_OPTIONS_END - //CUSTOM_UPDATE_INSTANCE_START - //CUSTOM_UPDATE_INSTANCE_END - //UPDATE_INSTANCE_AFTER_START +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_START +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_END - this.emit(Event.UPDATE_INSTANCE_AFTER, this); //UPDATE_INSTANCE_AFTER_END - } //UPDATE_INSTANCE_TEMPLATE_END - //UPDATE_FROM_INSTANCE_TEMPLATE_START +module.exports = SystemLinking;const Event = require('.././r3-event'); +const Utils = require('.././r3-utils'); +const System = require('./r3-system.js'); - }, { - key: "updateFromInstance", - value: function updateFromInstance(property) { - //UPDATE_FROM_INSTANCE_BEFORE_START - this.emit(Event.UPDATE_FROM_INSTANCE_BEFORE, this); //UPDATE_FROM_INSTANCE_BEFORE_END - //UPDATE_FROM_INSTANCE_OPTIONS_START - //UPDATE_FROM_INSTANCE_OPTIONS_END - //CUSTOM_UPDATE_FROM_INSTANCE_START - //CUSTOM_UPDATE_FROM_INSTANCE_END - //UPDATE_FROM_INSTANCE_AFTER_START +/** - this.emit(Event.UPDATE_FROM_INSTANCE_AFTER, this); //UPDATE_FROM_INSTANCE_AFTER_END - } //UPDATE_FROM_INSTANCE_TEMPLATE_END - //DISPOSE_TEMPLATE_START + GENERATE_INHERITED_START - }, { - key: "dispose", - value: function dispose() { - //DISPOSE_BEFORE_START - this.subscribe(Event.INSTANCE_DISPOSED, function (object) { + [Inherited from System] + + Properties: + + - started (Default value false) + + Methods: + + - start(options) + Just calls System.Start(options) + + - stop(options) + Just calls System.Stop(options) + + Static Methods: + + - Start(options) + Starts the system by registering subscriptions to events + + - Stop(options) + Stops the system by removing these subscriptions to events + + [Belonging to SystemSocket] + + Properties: + + + + Methods: + + + + Static Methods: + + + + GENERATE_INHERITED_END + + CUSTOM_OPTIONS_START + CUSTOM_OPTIONS_END + + CUSTOM_EVENT_LISTENERS_START + CUSTOM_EVENT_LISTENERS_END + + **/ + +class SystemSocket extends System { + + //GENERATE_CONSTRUCTOR_EXTENDS_START + constructor(options) { + + if (Utils.UndefinedOrNull(options)) { + options = {}; + } + + super(options); + + this.emit(Event.OBJECT_CREATED, this); + + //GENERATE_OPTIONS_INIT_START + //GENERATE_OPTIONS_INIT_END + + //CUSTOM_OPTIONS_INIT_START + //CUSTOM_OPTIONS_INIT_END + + Object.assign(this, options); + + //CUSTOM_BEFORE_INIT_START + //CUSTOM_BEFORE_INIT_END + + this.emit(Event.OBJECT_INITIALIZED, this); + + //CUSTOM_AFTER_INIT_START + //CUSTOM_AFTER_INIT_END + } + //GENERATE_CONSTRUCTOR_EXTENDS_END + + //GENERATE_EVENT_LISTENERS_START + //GENERATE_EVENT_LISTENERS_END + + //CUSTOM_IMPLEMENTATION_START + //CUSTOM_IMPLEMENTATION_END + +} + +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_START +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_END + +module.exports = SystemSocket;const Event = require('.././r3-event'); +const Utils = require('.././r3-utils'); +const System = require('./r3-system.js'); + +/** + + GENERATE_INHERITED_START + + [Inherited from System] + + Properties: + + - started (Default value false) + + Methods: + + - start(options) + Just calls System.Start(options) + + - stop(options) + Just calls System.Stop(options) + + Static Methods: + + - Start(options) + Starts the system by registering subscriptions to events + + - Stop(options) + Stops the system by removing these subscriptions to events + + [Belonging to SystemTest] + + Properties: + + + + Methods: + + + + Static Methods: + + + + GENERATE_INHERITED_END + + CUSTOM_OPTIONS_START + CUSTOM_OPTIONS_END + + CUSTOM_EVENT_LISTENERS_START + CUSTOM_EVENT_LISTENERS_END + + **/ + +class SystemTest extends System { + + //GENERATE_CONSTRUCTOR_EXTENDS_START + constructor(options) { + + if (Utils.UndefinedOrNull(options)) { + options = {}; + } + + super(options); + + this.emit(Event.OBJECT_CREATED, this); + + //GENERATE_OPTIONS_INIT_START + //GENERATE_OPTIONS_INIT_END + + //CUSTOM_OPTIONS_INIT_START + //CUSTOM_OPTIONS_INIT_END + + Object.assign(this, options); + + //CUSTOM_BEFORE_INIT_START + //CUSTOM_BEFORE_INIT_END + + this.emit(Event.OBJECT_INITIALIZED, this); + + //CUSTOM_AFTER_INIT_START + //CUSTOM_AFTER_INIT_END + } + //GENERATE_CONSTRUCTOR_EXTENDS_END + + //GENERATE_EVENT_LISTENERS_START + //GENERATE_EVENT_LISTENERS_END + + //CUSTOM_IMPLEMENTATION_START + //CUSTOM_IMPLEMENTATION_END + +} + +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_START +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_END + +module.exports = SystemTest;const Utils = require('./r3-utils'); +const Event = require('./r3-event.js'); + +/** + + GENERATE_INHERITED_START + + [Inherited from Event] + + Properties: + + + + Methods: + + - async(eventId, data, clientCallback, clientErrorCallback) + Simply calls 'Async()' passing it the arguments + + - emit(eventId, data, clientCallback, clientErrorCallback) + Simply calls 'Emit()' passing it the arguments + + - subscribe(eventId, callback) + Simply calls 'Subscribe()' passing it the arguments + + Static Methods: + + - Async(eventId, data, clientCallback, clientErrorCallback) + Calls all subscription functions registered to eventId with data, clientCallback and clientErrorCallback as + arguments. If an error occurs during clientCallback it additionally will execute clientErrorCallback with the + error as argument. + + - Emit(eventId, data, clientCallback, clientErrorCallback) + Calls all subscription functions registered to eventId with data as arg. Calls clientCallback directly after + the event result is obtained, passing it the result. If an exception occurs during execution, the + clientErrorCallback is called with the error as argument. + + - Subscribe(eventId, callback) + Subscribes to 'eventName', ex. Event.BEFORE_RENDER and executes 'callback()' when eventName is raised + + [Belonging to R3Object] + + Properties: + + - register (Default value true) + + Methods: + + + + Static Methods: + + + + GENERATE_INHERITED_END + + Of the form x= + CUSTOM_OPTIONS_START + register=true + CUSTOM_OPTIONS_END + + Of the form x= + CUSTOM_INSTANCE_OPTIONS_MAPPING_START + CUSTOM_INSTANCE_OPTIONS_MAPPING_END + + CUSTOM_LINKED_OBJECTS_START + CUSTOM_LINKED_OBJECTS_END + + CUSTOM_EXCLUDED_FROM_INSTANCE_OPTIONS_START + CUSTOM_EXCLUDED_FROM_INSTANCE_OPTIONS_END + + CUSTOM_METHODS_START + CUSTOM_METHODS_END + + CUSTOM_STATIC_METHODS_START + CUSTOM_STATIC_METHODS_END + + **/ + +class R3Object extends Event { + + //GENERATE_CONSTRUCTOR_EXTENDS_START + constructor(options) { + + if (Utils.UndefinedOrNull(options)) { + options = {}; + } + + super(options); + + this.emit(Event.OBJECT_CREATED, this); + + //GENERATE_OPTIONS_INIT_START + if (typeof options === 'undefined') { + options = {}; + } + if (Utils.UndefinedOrNull(options.register)) { + options.register = true; + } + //GENERATE_OPTIONS_INIT_END + + //CUSTOM_OPTIONS_INIT_START + //CUSTOM_OPTIONS_INIT_END + + Object.assign(this, options); + + //CUSTOM_BEFORE_INIT_START + //CUSTOM_BEFORE_INIT_END + + this.emit(Event.OBJECT_INITIALIZED, this); + + //CUSTOM_AFTER_INIT_START + //CUSTOM_AFTER_INIT_END + } + //GENERATE_CONSTRUCTOR_EXTENDS_END + + //GENERATE_METHODS_START + //GENERATE_METHODS_END + + //GENERATE_STATIC_METHODS_START + //GENERATE_STATIC_METHODS_END + + //CUSTOM_IMPLEMENTATION_START + //CUSTOM_IMPLEMENTATION_END +} + +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_START +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_END + +module.exports = R3Object;const Event = require('.././r3-event'); +const Utils = require('.././r3-utils'); +const R3Object = require('.././r3-r3-object.js'); + +/** + + GENERATE_INHERITED_START + + [Inherited from Event] + + Properties: + + + + Methods: + + - async(eventId, data, clientCallback, clientErrorCallback) + Simply calls 'Async()' passing it the arguments + + - emit(eventId, data, clientCallback, clientErrorCallback) + Simply calls 'Emit()' passing it the arguments + + - subscribe(eventId, callback) + Simply calls 'Subscribe()' passing it the arguments + + Static Methods: + + - Async(eventId, data, clientCallback, clientErrorCallback) + Calls all subscription functions registered to eventId with data, clientCallback and clientErrorCallback as + arguments. If an error occurs during clientCallback it additionally will execute clientErrorCallback with the + error as argument. + + - Emit(eventId, data, clientCallback, clientErrorCallback) + Calls all subscription functions registered to eventId with data as arg. Calls clientCallback directly after + the event result is obtained, passing it the result. If an exception occurs during execution, the + clientErrorCallback is called with the error as argument. + + - Subscribe(eventId, callback) + Subscribes to 'eventName', ex. Event.BEFORE_RENDER and executes 'callback()' when eventName is raised + + [Inherited from R3Object] + + Properties: + + - register (Default value true) + + Methods: + + + + Static Methods: + + + + [Belonging to Component] + + Properties: + + - x (Default value 0) + - y (Default value 0) + - z (Default value 0) + + Methods: + + - createInstance() + Creates an instance of this object based on the runtime. + + - updateInstance(property) + Updates the instance property, ex. 'x', or specify 'all' to update all properties based on the current object + property(ies) + + - updateFromInstance(property) + Updates the object property, ex. 'x', or specify 'all' to update all properties of this object based on the + value of the instance property(ies) + + - dispose() + Sends out a notification that this object wants to be deleted. It will first send out a message to delete it's + instance, because an object instance should not exist without an object parent (except maybe for particles) + + - disposeInstance() + This will signal all systems that an instance wants to be deleted. Once it has been deleted, another event + will be triggered to notify listeners of the deletion of this instance. This can give 'dispose()' a chance to + dispose the object parent this instance. + + - toApiObject() + Transforms the current object into JSON ready to be stored to the back-end. + + Static Methods: + + + + GENERATE_INHERITED_END + + Of the form x= + CUSTOM_OPTIONS_START + x=0 + y=0 + z=0 + CUSTOM_OPTIONS_END + + Of the form x= + CUSTOM_INSTANCE_OPTIONS_MAPPING_START + CUSTOM_INSTANCE_OPTIONS_MAPPING_END + + CUSTOM_LINKED_OBJECTS_START + CUSTOM_LINKED_OBJECTS_END + + CUSTOM_EXCLUDED_FROM_INSTANCE_OPTIONS_START + CUSTOM_EXCLUDED_FROM_INSTANCE_OPTIONS_END + + CUSTOM_METHODS_START + createInstance() - Creates an instance of this object based on the runtime. + updateInstance(property) - Updates the instance property, ex. 'x', or specify 'all' to update all properties based on the current object property(ies) + updateFromInstance(property) - Updates the object property, ex. 'x', or specify 'all' to update all properties of this object based on the value of the instance property(ies) + dispose() - Sends out a notification that this object wants to be deleted. It will first send out a message to delete it's instance, because an object instance should not exist without an object parent (except maybe for particles) + disposeInstance() - This will signal all systems that an instance wants to be deleted. Once it has been deleted, another event will be triggered to notify listeners of the deletion of this instance. This can give 'dispose()' a chance to dispose the object parent this instance. + toApiObject() - Transforms the current object into JSON ready to be stored to the back-end. @returns JSON + CUSTOM_METHODS_END + + CUSTOM_STATIC_METHODS_START + CUSTOM_STATIC_METHODS_END + + **/ + +class Component extends R3Object { + + //GENERATE_CONSTRUCTOR_EXTENDS_START + constructor(options) { + + if (Utils.UndefinedOrNull(options)) { + options = {}; + } + + super(options); + + this.emit(Event.OBJECT_CREATED, this); + + //GENERATE_OPTIONS_INIT_START + if (typeof options === 'undefined') { + options = {}; + } + if (Utils.UndefinedOrNull(options.x)) { + options.x = 0; + } + if (Utils.UndefinedOrNull(options.y)) { + options.y = 0; + } + if (Utils.UndefinedOrNull(options.z)) { + options.z = 0; + } + //GENERATE_OPTIONS_INIT_END + + //CUSTOM_OPTIONS_INIT_START + //CUSTOM_OPTIONS_INIT_END + + Object.assign(this, options); + + //CUSTOM_BEFORE_INIT_START + //CUSTOM_BEFORE_INIT_END + + this.emit(Event.OBJECT_INITIALIZED, this); + + //CUSTOM_AFTER_INIT_START + //CUSTOM_AFTER_INIT_END + } + //GENERATE_CONSTRUCTOR_EXTENDS_END + + //GENERATE_METHODS_START + + /** + * createInstance() + * - Creates an instance of this object based on the runtime. + */ + createInstance() { + + //GENERATE_CREATE_INSTANCE_METHOD_START + this.emit(Event.CREATE_INSTANCE_BEFORE, this); + + this[this.runtime].createInstance( + this, + { + //GENERATE_CREATE_INSTANCE_OPTIONS_START + 'x': this.x, + 'y': this.y, + 'z': this.z + //GENERATE_CREATE_INSTANCE_OPTIONS_END + } + ) + this.emit(Event.INSTANCE_CREATED, this); + //GENERATE_CREATE_INSTANCE_METHOD_END + + //CUSTOM_CREATE_INSTANCE_METHOD_START + //CUSTOM_CREATE_INSTANCE_METHOD_END + + } + + /** + * updateInstance() + * - Updates the instance property, ex. 'x', or specify 'all' to update all properties based on the current object + * property(ies) + * @param property + */ + updateInstance(property) { + + //GENERATE_UPDATE_INSTANCE_METHOD_START + this.emit(Event.UPDATE_INSTANCE_BEFORE, this); + + //GENERATE_UPDATE_INSTANCE_OPTIONS_START + if (property === 'x') { + this.instance.x = this.x; + if (property !== 'all') { + this.emit(Event.UPDATE_INSTANCE_AFTER, this); + return; + } + } + if (property === 'y') { + this.instance.y = this.y; + if (property !== 'all') { + this.emit(Event.UPDATE_INSTANCE_AFTER, this); + return; + } + } + if (property === 'z') { + this.instance.z = this.z; + if (property !== 'all') { + this.emit(Event.UPDATE_INSTANCE_AFTER, this); + return; + } + } + //GENERATE_UPDATE_INSTANCE_OPTIONS_END + + this.emit(Event.UPDATE_INSTANCE_AFTER, this); + //GENERATE_UPDATE_INSTANCE_METHOD_END + + //CUSTOM_UPDATE_INSTANCE_METHOD_START + //CUSTOM_UPDATE_INSTANCE_METHOD_END + + } + + /** + * updateFromInstance() + * - Updates the object property, ex. 'x', or specify 'all' to update all properties of this object based on the + * value of the instance property(ies) + * @param property + */ + updateFromInstance(property) { + + //GENERATE_UPDATE_FROM_INSTANCE_METHOD_START + this.emit(Event.UPDATE_FROM_INSTANCE_BEFORE, this); + + //GENERATE_UPDATE_FROM_INSTANCE_OPTIONS_START + if (property === 'x' || property === 'all') { + this.x = this.instance.x; + if (property !== 'all') { + this.emit(Event.UPDATE_FROM_INSTANCE_AFTER, this); + return; + } + } + if (property === 'y' || property === 'all') { + this.y = this.instance.y; + if (property !== 'all') { + this.emit(Event.UPDATE_FROM_INSTANCE_AFTER, this); + return; + } + } + if (property === 'z' || property === 'all') { + this.z = this.instance.z; + if (property !== 'all') { + this.emit(Event.UPDATE_FROM_INSTANCE_AFTER, this); + return; + } + } + //GENERATE_UPDATE_FROM_INSTANCE_OPTIONS_END + + this.emit(Event.UPDATE_FROM_INSTANCE_AFTER, this); + + //GENERATE_UPDATE_FROM_INSTANCE_METHOD_END + + //CUSTOM_UPDATE_FROM_INSTANCE_METHOD_START + //CUSTOM_UPDATE_FROM_INSTANCE_METHOD_END + + } + + /** + * dispose() + * - Sends out a notification that this object wants to be deleted. It will first send out a message to delete it's + * instance, because an object instance should not exist without an object parent (except maybe for particles) + */ + dispose() { + + //GENERATE_DISPOSE_METHOD_START + this.subscribe( + Event.INSTANCE_DISPOSED, + function(object) { if (object === this) { this.emit(Event.DISPOSE_OBJECT, this); } - }); //DISPOSE_BEFORE_END - //CUSTOM_DISPOSE_START - //CUSTOM_DISPOSE_END - //DISPOSE_AFTER_START + } + ); - this.disposeInstance(); //DISPOSE_AFTER_END - } //DISPOSE_TEMPLATE_END - //DISPOSE_INSTANCE_TEMPLATE_START + this.disposeInstance(); + //GENERATE_DISPOSE_METHOD_END - }, { - key: "disposeInstance", - value: function disposeInstance() { - //DISPOSE_INSTANCE_BEFORE_START - console.log('Disposing instance of ' + this.name); //DISPOSE_INSTANCE_BEFORE_END - //CUSTOM_DISPOSE_INSTANCE_START - //CUSTOM_DISPOSE_INSTANCE_END - //DISPOSE_INSTANCE_AFTER_START + //CUSTOM_DISPOSE_METHOD_START + //CUSTOM_DISPOSE_METHOD_END - this.emit(Event.DISPOSE_INSTANCE, this); //DISPOSE_INSTANCE_AFTER_END - } //DISPOSE_INSTANCE_TEMPLATE_END - //CUSTOM_IMPLEMENTATION_START - //CUSTOM_IMPLEMENTATION_END + } - }]); + /** + * disposeInstance() + * - This will signal all systems that an instance wants to be deleted. Once it has been deleted, another event + * will be triggered to notify listeners of the deletion of this instance. This can give 'dispose()' a chance to + * dispose the object parent this instance. + */ + disposeInstance() { - return R3Object; -}(Event); //CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_START + //GENERATE_DISPOSE_INSTANCE_METHOD_START + console.log('Disposing instance of ' + this.name); + this.emit(Event.DISPOSE_INSTANCE, this); + //GENERATE_DISPOSE_INSTANCE_METHOD_END + + //CUSTOM_DISPOSE_INSTANCE_METHOD_START + //CUSTOM_DISPOSE_INSTANCE_METHOD_END + + } + + /** + * toApiObject() + * - Transforms the current object into JSON ready to be stored to the back-end. \n * @returns JSON + */ + toApiObject() { + + //GENERATE_TO_API_OBJECT_METHOD_START + //GENERATE_TO_API_OBJECT_METHOD_END + + //CUSTOM_TO_API_OBJECT_METHOD_START + //CUSTOM_TO_API_OBJECT_METHOD_END + + } + //GENERATE_METHODS_END + + //GENERATE_STATIC_METHODS_START + //GENERATE_STATIC_METHODS_END + + //CUSTOM_IMPLEMENTATION_START + //CUSTOM_IMPLEMENTATION_END +} + +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_START //CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_END +module.exports = Component;const Event = require('./r3-event'); +const Utils = require('./r3-utils'); +const R3Object = require('./r3-r3-object.js'); -module.exports = R3Object; +/** -/***/ }), + GENERATE_INHERITED_START -/***/ "./src/r3/r3-system/index.js": -/*!***********************************!*\ - !*** ./src/r3/r3-system/index.js ***! - \***********************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { + [Inherited from Event] -var System = __webpack_require__(/*! ./r3-system.js */ "./src/r3/r3-system/r3-system.js"); + Properties: -var SystemLinking = __webpack_require__(/*! ./r3-system-linking.js */ "./src/r3/r3-system/r3-system-linking.js"); + -var SystemSocket = __webpack_require__(/*! ./r3-system-socket.js */ "./src/r3/r3-system/r3-system-socket.js"); + Methods: -module.exports = { - System: System, - SystemLinking: SystemLinking, - SystemSocket: SystemSocket -}; + - async(eventId, data, clientCallback, clientErrorCallback) + Simply calls 'Async()' passing it the arguments -/***/ }), + - emit(eventId, data, clientCallback, clientErrorCallback) + Simply calls 'Emit()' passing it the arguments -/***/ "./src/r3/r3-system/r3-system-linking.js": -/*!***********************************************!*\ - !*** ./src/r3/r3-system/r3-system-linking.js ***! - \***********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { + - subscribe(eventId, callback) + Simply calls 'Subscribe()' passing it the arguments -function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } + Static Methods: -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + - Async(eventId, data, clientCallback, clientErrorCallback) + Calls all subscription functions registered to eventId with data, clientCallback and clientErrorCallback as + arguments. If an error occurs during clientCallback it additionally will execute clientErrorCallback with the + error as argument. -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } + - Emit(eventId, data, clientCallback, clientErrorCallback) + Calls all subscription functions registered to eventId with data as arg. Calls clientCallback directly after + the event result is obtained, passing it the result. If an exception occurs during execution, the + clientErrorCallback is called with the error as argument. -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } + - Subscribe(eventId, callback) + Subscribes to 'eventName', ex. Event.BEFORE_RENDER and executes 'callback()' when eventName is raised -function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } + [Inherited from R3Object] -function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } + Properties: -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } + - register (Default value true) -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } + Methods: -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } + -function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } + Static Methods: -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } + -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } + [Belonging to Project] -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } + Properties: -var System = __webpack_require__(/*! ./r3-system */ "./src/r3/r3-system/r3-system.js"); + -var R3Object = __webpack_require__(/*! ../r3-r3-object */ "./src/r3/r3-r3-object.js"); + Methods: -var Event = __webpack_require__(/*! ../r3-event */ "./src/r3/r3-event.js"); + -var LinkingSystem = /*#__PURE__*/function (_System) { - _inherits(LinkingSystem, _System); + Static Methods: - var _super = _createSuper(LinkingSystem); + - function LinkingSystem() { - _classCallCheck(this, LinkingSystem); + GENERATE_INHERITED_END + + Of the form x= + CUSTOM_OPTIONS_START + CUSTOM_OPTIONS_END + + Of the form x= + CUSTOM_INSTANCE_OPTIONS_MAPPING_START + CUSTOM_INSTANCE_OPTIONS_MAPPING_END + + CUSTOM_LINKED_OBJECTS_START + CUSTOM_LINKED_OBJECTS_END + + CUSTOM_EXCLUDED_FROM_INSTANCE_OPTIONS_START + CUSTOM_EXCLUDED_FROM_INSTANCE_OPTIONS_END + + CUSTOM_METHODS_START + CUSTOM_METHODS_END + + CUSTOM_STATIC_METHODS_START + CUSTOM_STATIC_METHODS_END + + **/ + +class Project extends R3Object { + + //GENERATE_CONSTRUCTOR_EXTENDS_START + constructor(options) { + + if (Utils.UndefinedOrNull(options)) { + options = {}; + } + + super(options); + + this.emit(Event.OBJECT_CREATED, this); + + //GENERATE_OPTIONS_INIT_START + //GENERATE_OPTIONS_INIT_END + + //CUSTOM_OPTIONS_INIT_START + //CUSTOM_OPTIONS_INIT_END + + Object.assign(this, options); + + //CUSTOM_BEFORE_INIT_START + //CUSTOM_BEFORE_INIT_END + + this.emit(Event.OBJECT_INITIALIZED, this); + + //CUSTOM_AFTER_INIT_START + //CUSTOM_AFTER_INIT_END + } + //GENERATE_CONSTRUCTOR_EXTENDS_END + + //GENERATE_METHODS_START + //GENERATE_METHODS_END + + //GENERATE_STATIC_METHODS_START + //GENERATE_STATIC_METHODS_END + + //CUSTOM_IMPLEMENTATION_START + //CUSTOM_IMPLEMENTATION_END +} + +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_START +Project.CAMERA_INDEX_EDIT = 0x0; +Project.CAMERA_INDEX_RUN = 0x1; + +Project.APPLICATION_MODE_EDIT = Project.CAMERA_INDEX_EDIT; +Project.APPLICATION_MODE_RUN = Project.CAMERA_INDEX_RUN; + +Project.RENDERER_INDEX_MAIN = 0x0; + +Project.RENDER_TARGET_INDEX_NONE = -0x1; +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_END + +module.exports = Project;const Event = require('.././r3-event'); +const Utils = require('.././r3-utils'); +const Component = require('.././r3-component.js'); + +/** + + GENERATE_INHERITED_START + + [Inherited from Event] + + Properties: + + + + Methods: + + - async(eventId, data, clientCallback, clientErrorCallback) + Simply calls 'Async()' passing it the arguments + + - emit(eventId, data, clientCallback, clientErrorCallback) + Simply calls 'Emit()' passing it the arguments + + - subscribe(eventId, callback) + Simply calls 'Subscribe()' passing it the arguments + + Static Methods: + + - Async(eventId, data, clientCallback, clientErrorCallback) + Calls all subscription functions registered to eventId with data, clientCallback and clientErrorCallback as + arguments. If an error occurs during clientCallback it additionally will execute clientErrorCallback with the + error as argument. + + - Emit(eventId, data, clientCallback, clientErrorCallback) + Calls all subscription functions registered to eventId with data as arg. Calls clientCallback directly after + the event result is obtained, passing it the result. If an exception occurs during execution, the + clientErrorCallback is called with the error as argument. + + - Subscribe(eventId, callback) + Subscribes to 'eventName', ex. Event.BEFORE_RENDER and executes 'callback()' when eventName is raised + + [Inherited from R3Object] + + Properties: + + - register (Default value true) + + Methods: + + + + Static Methods: + + + + [Inherited from Component] + + Properties: + + - x (Default value 0) + - y (Default value 0) + - z (Default value 0) + + Methods: + + - createInstance() + Creates an instance of this object based on the runtime. + + - updateInstance(property) + Updates the instance property, ex. 'x', or specify 'all' to update all properties based on the current object + property(ies) + + - updateFromInstance(property) + Updates the object property, ex. 'x', or specify 'all' to update all properties of this object based on the + value of the instance property(ies) + + - dispose() + Sends out a notification that this object wants to be deleted. It will first send out a message to delete it's + instance, because an object instance should not exist without an object parent (except maybe for particles) + + - disposeInstance() + This will signal all systems that an instance wants to be deleted. Once it has been deleted, another event + will be triggered to notify listeners of the deletion of this instance. This can give 'dispose()' a chance to + dispose the object parent this instance. + + - toApiObject() + Transforms the current object into JSON ready to be stored to the back-end. + + Static Methods: + + + + [Belonging to Image] + + Properties: + + + + Methods: + + - createInstance() + Creates an instance of this object based on the runtime. + + - updateInstance(property) + Updates the instance property, ex. 'x', or specify 'all' to update all properties based on the current object + property(ies) + + - updateFromInstance(property) + Updates the object property, ex. 'x', or specify 'all' to update all properties of this object based on the + value of the instance property(ies) + + - dispose() + Sends out a notification that this object wants to be deleted. It will first send out a message to delete it's + instance, because an object instance should not exist without an object parent (except maybe for particles) + + - disposeInstance() + This will signal all systems that an instance wants to be deleted. Once it has been deleted, another event + will be triggered to notify listeners of the deletion of this instance. This can give 'dispose()' a chance to + dispose the object parent this instance. + + - toApiObject() + Transforms the current object into JSON ready to be stored to the back-end. + + Static Methods: + + + + GENERATE_INHERITED_END + + Of the form x= + CUSTOM_OPTIONS_START + CUSTOM_OPTIONS_END + + Of the form x= + CUSTOM_INSTANCE_OPTIONS_MAPPING_START + CUSTOM_INSTANCE_OPTIONS_MAPPING_END + + CUSTOM_LINKED_OBJECTS_START + CUSTOM_LINKED_OBJECTS_END + + CUSTOM_EXCLUDED_FROM_INSTANCE_OPTIONS_START + CUSTOM_EXCLUDED_FROM_INSTANCE_OPTIONS_END + + CUSTOM_METHODS_START + createInstance() - Creates an instance of this object based on the runtime. + updateInstance(property) - Updates the instance property, ex. 'x', or specify 'all' to update all properties based on the current object property(ies) + updateFromInstance(property) - Updates the object property, ex. 'x', or specify 'all' to update all properties of this object based on the value of the instance property(ies) + dispose() - Sends out a notification that this object wants to be deleted. It will first send out a message to delete it's instance, because an object instance should not exist without an object parent (except maybe for particles) + disposeInstance() - This will signal all systems that an instance wants to be deleted. Once it has been deleted, another event will be triggered to notify listeners of the deletion of this instance. This can give 'dispose()' a chance to dispose the object parent this instance. + toApiObject() - Transforms the current object into JSON ready to be stored to the back-end. @returns JSON + CUSTOM_METHODS_END + + CUSTOM_STATIC_METHODS_START + CUSTOM_STATIC_METHODS_END + + **/ + +class Image extends Component { + + //GENERATE_CONSTRUCTOR_EXTENDS_START + constructor(options) { + + if (Utils.UndefinedOrNull(options)) { + options = {}; + } + + super(options); + + this.emit(Event.OBJECT_CREATED, this); + + //GENERATE_OPTIONS_INIT_START + //GENERATE_OPTIONS_INIT_END + + //CUSTOM_OPTIONS_INIT_START + //CUSTOM_OPTIONS_INIT_END + + Object.assign(this, options); + + //CUSTOM_BEFORE_INIT_START + //CUSTOM_BEFORE_INIT_END + + this.emit(Event.OBJECT_INITIALIZED, this); + + //CUSTOM_AFTER_INIT_START + //CUSTOM_AFTER_INIT_END + } + //GENERATE_CONSTRUCTOR_EXTENDS_END + + //GENERATE_METHODS_START + + /** + * createInstance() + * - Creates an instance of this object based on the runtime. + */ + createInstance() { + + //GENERATE_CREATE_INSTANCE_METHOD_START + this.emit(Event.CREATE_INSTANCE_BEFORE, this); + + this[this.runtime].createInstance( + this, + { + //GENERATE_CREATE_INSTANCE_OPTIONS_START + //GENERATE_CREATE_INSTANCE_OPTIONS_END + } + ) + this.emit(Event.INSTANCE_CREATED, this); + //GENERATE_CREATE_INSTANCE_METHOD_END + + //CUSTOM_CREATE_INSTANCE_METHOD_START + //CUSTOM_CREATE_INSTANCE_METHOD_END - return _super.apply(this, arguments); } - _createClass(LinkingSystem, null, [{ - key: "start", - value: function start() { - _get(_getPrototypeOf(LinkingSystem), "start", this).call(this); + /** + * updateInstance() + * - Updates the instance property, ex. 'x', or specify 'all' to update all properties based on the current object + * property(ies) + * @param property + */ + updateInstance(property) { - console.log('starting linking system'); - Event.Subscribe(Event.OBJECT_CREATED, function () { - console.log('linking system discovered an object'); - }); - var object = new R3Object(); - return true; - } - }]); + //GENERATE_UPDATE_INSTANCE_METHOD_START + this.emit(Event.UPDATE_INSTANCE_BEFORE, this); - return LinkingSystem; -}(System); + //GENERATE_UPDATE_INSTANCE_OPTIONS_START + //GENERATE_UPDATE_INSTANCE_OPTIONS_END -module.exports = LinkingSystem; + this.emit(Event.UPDATE_INSTANCE_AFTER, this); + //GENERATE_UPDATE_INSTANCE_METHOD_END -/***/ }), + //CUSTOM_UPDATE_INSTANCE_METHOD_START + //CUSTOM_UPDATE_INSTANCE_METHOD_END -/***/ "./src/r3/r3-system/r3-system-socket.js": -/*!**********************************************!*\ - !*** ./src/r3/r3-system/r3-system-socket.js ***! - \**********************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } - -function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } - -function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } - -function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } - -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } - -function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } - -function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } - -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } - -function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } - -var System = __webpack_require__(/*! ./r3-system.js */ "./src/r3/r3-system/r3-system.js"); - -var SocketSystem = /*#__PURE__*/function (_System) { - _inherits(SocketSystem, _System); - - var _super = _createSuper(SocketSystem); - - function SocketSystem() { - _classCallCheck(this, SocketSystem); - - return _super.apply(this, arguments); } - _createClass(SocketSystem, null, [{ - key: "start", - value: function start() { - _get(_getPrototypeOf(SocketSystem), "start", this).call(this); + /** + * updateFromInstance() + * - Updates the object property, ex. 'x', or specify 'all' to update all properties of this object based on the + * value of the instance property(ies) + * @param property + */ + updateFromInstance(property) { - console.log('starting socket system'); - return true; - } - }]); + //GENERATE_UPDATE_FROM_INSTANCE_METHOD_START + this.emit(Event.UPDATE_FROM_INSTANCE_BEFORE, this); - return SocketSystem; -}(System); + //GENERATE_UPDATE_FROM_INSTANCE_OPTIONS_START + //GENERATE_UPDATE_FROM_INSTANCE_OPTIONS_END -module.exports = SocketSystem; + this.emit(Event.UPDATE_FROM_INSTANCE_AFTER, this); -/***/ }), + //GENERATE_UPDATE_FROM_INSTANCE_METHOD_END -/***/ "./src/r3/r3-system/r3-system.js": -/*!***************************************!*\ - !*** ./src/r3/r3-system/r3-system.js ***! - \***************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { + //CUSTOM_UPDATE_FROM_INSTANCE_METHOD_START + //CUSTOM_UPDATE_FROM_INSTANCE_METHOD_END -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -var System = /*#__PURE__*/function () { - function System() { - _classCallCheck(this, System); } - _createClass(System, null, [{ - key: "start", - value: function start() { - console.log('starting a system'); - } - }]); + /** + * dispose() + * - Sends out a notification that this object wants to be deleted. It will first send out a message to delete it's + * instance, because an object instance should not exist without an object parent (except maybe for particles) + */ + dispose() { - return System; -}(); + //GENERATE_DISPOSE_METHOD_START + this.subscribe( + Event.INSTANCE_DISPOSED, + function(object) { + if (object === this) { + this.emit(Event.DISPOSE_OBJECT, this); + } + } + ); -module.exports = System; + this.disposeInstance(); + //GENERATE_DISPOSE_METHOD_END -/***/ }), + //CUSTOM_DISPOSE_METHOD_START + //CUSTOM_DISPOSE_METHOD_END -/***/ "./src/r3/r3.js": -/*!**********************!*\ - !*** ./src/r3/r3.js ***! - \**********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -var _require = __webpack_require__(/*! ./r3-system */ "./src/r3/r3-system/index.js"), - System = _require.System, - SystemLinking = _require.SystemLinking, - SystemSocket = _require.SystemSocket; - -var R3Object = __webpack_require__(/*! ./r3-r3-object */ "./src/r3/r3-r3-object.js"); - -var R3 = /*#__PURE__*/function () { - function R3() { - _classCallCheck(this, R3); } - _createClass(R3, null, [{ - key: "version", - value: function version() { - return 'Sun Jun 20 2021 18:45:42 GMT+0000 (Coordinated Universal Time)'; - } - }]); + /** + * disposeInstance() + * - This will signal all systems that an instance wants to be deleted. Once it has been deleted, another event + * will be triggered to notify listeners of the deletion of this instance. This can give 'dispose()' a chance to + * dispose the object parent this instance. + */ + disposeInstance() { - return R3; -}(); + //GENERATE_DISPOSE_INSTANCE_METHOD_START + console.log('Disposing instance of ' + this.name); + this.emit(Event.DISPOSE_INSTANCE, this); + //GENERATE_DISPOSE_INSTANCE_METHOD_END -R3.R3Object = R3Object; -R3.System = System; -R3.System.Linking = SystemLinking; -R3.System.Socket = SystemSocket; -module.exports = R3; + //CUSTOM_DISPOSE_INSTANCE_METHOD_START + //CUSTOM_DISPOSE_INSTANCE_METHOD_END -/***/ }) + } -/******/ }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL2luZGV4LmpzIiwid2VicGFjazovLy8uL3NyYy9yMy9yMy1ldmVudC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcjMvcjMtcjMtb2JqZWN0LmpzIiwid2VicGFjazovLy8uL3NyYy9yMy9yMy1zeXN0ZW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL3IzLXN5c3RlbS9yMy1zeXN0ZW0tbGlua2luZy5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvcjMvcjMtc3lzdGVtL3IzLXN5c3RlbS1zb2NrZXQuanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL3IzLXN5c3RlbS9yMy1zeXN0ZW0uanMiLCJ3ZWJwYWNrOi8vLy4vc3JjL3IzL3IzLmpzIl0sIm5hbWVzIjpbIlIzIiwicmVxdWlyZSIsIlN5c3RlbSIsIkxpbmtpbmciLCJzdGFydCIsIlNvY2tldCIsIm1vZHVsZSIsImV4cG9ydHMiLCJVdGlscyIsIkV2ZW50Iiwib3B0aW9ucyIsIkVtaXQiLCJPQkpFQ1RfQ1JFQVRFRCIsIk9iamVjdCIsImFzc2lnbiIsIk9CSkVDVF9JTklUSUFMSVpFRCIsImV2ZW50TmFtZSIsImNhbGxiYWNrIiwiU3Vic2NyaWJlIiwiYmluZCIsImRhdGEiLCJjbGllbnRDYWxsYmFjayIsImNsaWVudEVycm9yQ2FsbGJhY2siLCJmbiIsInN1YnNjcmlwdGlvbklkIiwiUmFuZG9tSWQiLCJTdWJzY3JpcHRpb25zIiwiaGFzT3duUHJvcGVydHkiLCJFcnJvciIsInJlbW92ZSIsImV2ZW50SWQiLCJsaXN0ZW5lcnMiLCJrZXlzIiwibGVuZ3RoIiwic3Vic2NyaXB0aW9uSWRzIiwibWFwIiwicmVzdWx0IiwiZXJyb3IiLCJjb25zb2xlIiwiQ09NUE9ORU5UX0lOSVRJQUxJWkVEIiwiQ1JFQVRFX0lOU1RBTkNFX0JFRk9SRSIsIkRJU1BPU0VfSU5TVEFOQ0UiLCJESVNQT1NFX09CSkVDVCIsIkdFVF9SVU5USU1FIiwiR0VUX1dJTkRPV19TSVpFIiwiSU5TVEFOQ0VfQ1JFQVRFRCIsIklOU1RBTkNFX0RJU1BPU0VEIiwiUEFVU0UiLCJSRVNUQVJUIiwiU1RBUlQiLCJVUERBVEVfRlJPTV9JTlNUQU5DRV9BRlRFUiIsIlVQREFURV9GUk9NX0lOU1RBTkNFX0JFRk9SRSIsIlVQREFURV9JTlNUQU5DRV9BRlRFUiIsIlVQREFURV9JTlNUQU5DRV9CRUZPUkUiLCJNQVhfRVZFTlRTIiwiR2V0RXZlbnROYW1lIiwiUjNPYmplY3QiLCJVbmRlZmluZWRPck51bGwiLCJlbWl0IiwiaWQiLCJuYW1lIiwiY29uc3RydWN0b3IiLCJyZWdpc3RlciIsInJ1bnRpbWUiLCJjcmVhdGVJbnN0YW5jZSIsInByb3BlcnR5Iiwic3Vic2NyaWJlIiwib2JqZWN0IiwiZGlzcG9zZUluc3RhbmNlIiwibG9nIiwiU3lzdGVtTGlua2luZyIsIlN5c3RlbVNvY2tldCIsIkxpbmtpbmdTeXN0ZW0iLCJTb2NrZXRTeXN0ZW0iXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFz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Q0FBeEI7O0lBRU1ELEU7QUFFTCxnQkFBYztBQUFBO0FBQ2I7Ozs7V0FFRCxtQkFBaUI7QUFDaEIsYUFBTyxVQUFQO0FBQ0E7Ozs7OztBQUlGQSxFQUFFLENBQUN3RCxRQUFILEdBQWdCQSxRQUFoQjtBQUNBeEQsRUFBRSxDQUFDRSxNQUFILEdBQWVBLE1BQWY7QUFDQUYsRUFBRSxDQUFDRSxNQUFILENBQVVDLE9BQVYsR0FBb0JtRSxhQUFwQjtBQUNBdEUsRUFBRSxDQUFDRSxNQUFILENBQVVHLE1BQVYsR0FBbUJrRSxZQUFuQjtBQUVBakUsTUFBTSxDQUFDQyxPQUFQLEdBQWlCUCxFQUFqQixDIiwiZmlsZSI6InIzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvcjMvaW5kZXguanNcIik7XG4iLCJjb25zdCBSMyA9IHJlcXVpcmUoJy4vcjMuanMnKTtcblxuUjMuU3lzdGVtLkxpbmtpbmcuc3RhcnQoKTtcblIzLlN5c3RlbS5Tb2NrZXQuc3RhcnQoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBSMztcbiIsImNvbnN0IFV0aWxzID0gcmVxdWlyZSgncjMtdXRpbHMnKTtcblxuLyoqXG5cbiBPUFRJT05TX1NUQVJUXG4gT1BUSU9OU19FTkRcblxuICoqL1xuXG5jbGFzcyBFdmVudCB7XG5cbiAgLy9DT05TVFJVQ1RPUl9URU1QTEFURV9TVEFSVFxuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG5cbiAgICBFdmVudC5FbWl0KEV2ZW50Lk9CSkVDVF9DUkVBVEVELCB0aGlzKTtcblxuICAgIC8vT1BUSU9OU19JTklUX1NUQVJUXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXHRcdC8vT1BUSU9OU19JTklUX0VORFxuXG4gICAgLy9DVVNUT01fT1BUSU9OU19JTklUX1NUQVJUXG4gICAgLy9DVVNUT01fT1BUSU9OU19JTklUX0VORFxuXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBvcHRpb25zKTtcblxuICAgIC8vQ1VTVE9NX0JFRk9SRV9JTklUX1NUQVJUXG4gICAgLy9DVVNUT01fQkVGT1JFX0lOSVRfRU5EXG5cbiAgICBFdmVudC5FbWl0KEV2ZW50Lk9CSkVDVF9JTklUSUFMSVpFRCwgdGhpcyk7XG4gIH1cblx0Ly9DT05TVFJVQ1RPUl9URU1QTEFURV9FTkRcblxuICAvL0NVU1RPTV9JTVBMRU1FTlRBVElPTl9TVEFSVFxuXG5cdC8qKlxuXHQgKiBTb21lIG5pY2UgRXZlbnRzIGhhbmRsaW5nXG5cdCAqIEB0eXBlIHt7fX1cblx0ICovXG5cdHN0YXRpYyBTdWJzY3JpcHRpb25zID0ge307XG5cblx0c3RhdGljIFN1YnNjcmliZShcblx0XHRldmVudE5hbWUsXG5cdFx0Zm5cblx0KSB7XG5cdFx0LyoqXG5cdFx0ICogVG9kbyAtIG1heWJlIGV2ZW50dWFsbHkgc3RvcmUgYSBib29sZWFuIHdoaWNoIGluZGljYXRlcyBpZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4gZXhlY3V0ZWRcblx0XHQgKi9cblx0XHRsZXQgc3Vic2NyaXB0aW9uSWQgPSBVdGlscy5SYW5kb21JZCgxMCk7XG5cblx0XHRpZiAoRXZlbnQuU3Vic2NyaXB0aW9ucy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG5cblx0XHRcdGlmIChFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50TmFtZV1bc3Vic2NyaXB0aW9uSWRdKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignQSBjb21wb25lbnQgY2FuIG9ubHkgc3Vic2NyaWJlIHRvIGEgcGFydGljdWxhciBldmVudCBJRCBvbmNlJyk7XG5cdFx0XHR9XG5cblx0XHRcdEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnROYW1lXVtzdWJzY3JpcHRpb25JZF0gPSBmbjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0RXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudE5hbWVdID0ge307XG5cdFx0XHRFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50TmFtZV1bc3Vic2NyaXB0aW9uSWRdID0gZm47XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogUmV0dXJuIGEgaGFuZGxlIHRvIHRoZSBjYWxsZXIgdG8gYWxsb3cgdXMgdG8gdW5zdWJzY3JpYmUgdG8gdGhpcyBldmVudFxuXHRcdCAqL1xuXHRcdHJldHVybiB7XG5cdFx0XHRmbjogZm4sXG5cdFx0XHRyZW1vdmU6IGZ1bmN0aW9uIChldmVudElkLCBzdWJzY3JpcHRpb25JZCkge1xuXG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHQvKipcblx0XHRcdFx0XHQgKiBTdG9wIGxpc3RlbmluZyBmb3IgdGhpcyBldmVudCBmcm9tIHRoaXMgY29tcG9uZW50XG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0ZGVsZXRlIEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnRJZF1bc3Vic2NyaXB0aW9uSWRdO1xuXG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogSWYgdGhlIGxlbmd0aCBvZiBsaXN0ZW5lcnMgaXMgMCwgc3RvcCByZWZlcmVuY2luZyB0aGlzIGV2ZW50XG5cdFx0XHRcdFx0ICogQHR5cGUge3N0cmluZ1tdfVxuXHRcdFx0XHRcdCAqL1xuXHRcdFx0XHRcdGxldCBsaXN0ZW5lcnMgPSBPYmplY3Qua2V5cyhFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50SWRdKTtcblx0XHRcdFx0XHRpZiAobGlzdGVuZXJzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnRJZF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdH0oZXZlbnROYW1lLCBzdWJzY3JpcHRpb25JZCksXG5cdFx0XHRzdWJzY3JpcHRpb25JZCA6IHN1YnNjcmlwdGlvbklkXG5cdFx0fTtcblx0fTtcblxuXHQvKipcblx0ICogU3Vic2NyaWJlIHRvIHNvbWUgZXZlbnRzXG5cdCAqIEBwYXJhbSBldmVudE5hbWVcblx0ICogQHBhcmFtIGNhbGxiYWNrXG5cdCAqL1xuXHRzdWJzY3JpYmUoXG5cdFx0ZXZlbnROYW1lLFxuXHRcdGNhbGxiYWNrXG5cdCkge1xuXHRcdHJldHVybiBFdmVudC5TdWJzY3JpYmUoZXZlbnROYW1lLCBjYWxsYmFjay5iaW5kKHRoaXMpKTtcblx0fTtcblxuXHQvKipcblx0ICogU3RhdGljIFN5bmNocm9ub3VzIEV2ZW50IC0gQ2FsbHMgY2xpZW50Q2FsbGJhY2sgZGlyZWN0bHkgYWZ0ZXIgdGhlIGV2ZW50IHJlc3VsdCBpcyBvYnRhaW5lZFxuXHQgKiBAcGFyYW0gZXZlbnRJZFxuXHQgKiBAcGFyYW0gZGF0YVxuXHQgKiBAcGFyYW0gY2xpZW50Q2FsbGJhY2sgaXMgZXhlY3V0ZWQgaWRlYWxseSB3aGVuIHRoZSBldmVudCBjb21wbGV0ZWRcblx0ICogQHBhcmFtIGNsaWVudEVycm9yQ2FsbGJhY2tcblx0ICogQHJldHVybnMge251bWJlcn0gb2YgY2FsbGJhY2tzIGV4ZWN1dGVkXG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIEVtaXQoXG5cdFx0ZXZlbnRJZCxcblx0XHRkYXRhLFxuXHRcdGNsaWVudENhbGxiYWNrLFxuXHRcdGNsaWVudEVycm9yQ2FsbGJhY2tcblx0KSB7XG5cdFx0aWYgKEV2ZW50LlN1YnNjcmlwdGlvbnMuaGFzT3duUHJvcGVydHkoZXZlbnRJZCkpIHtcblxuXHRcdFx0bGV0IHN1YnNjcmlwdGlvbklkcyA9IE9iamVjdC5rZXlzKEV2ZW50LlN1YnNjcmlwdGlvbnNbZXZlbnRJZF0pO1xuXG5cdFx0XHRzdWJzY3JpcHRpb25JZHMubWFwKFxuXHRcdFx0XHRmdW5jdGlvbihzdWJzY3JpcHRpb25JZCkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRsZXQgcmVzdWx0ID0gRXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudElkXVtzdWJzY3JpcHRpb25JZF0oZGF0YSk7XG5cblx0XHRcdFx0XHRcdGlmIChjbGllbnRDYWxsYmFjaykge1xuXHRcdFx0XHRcdFx0XHRjbGllbnRDYWxsYmFjayhyZXN1bHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRpZiAoY2xpZW50RXJyb3JDYWxsYmFjaykge1xuXHRcdFx0XHRcdFx0XHRjbGllbnRFcnJvckNhbGxiYWNrKGVycm9yKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdClcblx0XHR9XG5cdH1cblxuXHRlbWl0KFxuXHRcdGV2ZW50TmFtZSxcblx0XHRkYXRhLFxuXHRcdGNsaWVudENhbGxiYWNrLFxuXHRcdGNsaWVudEVycm9yQ2FsbGJhY2tcblx0KSB7XG5cdFx0cmV0dXJuIEV2ZW50LkVtaXQoXG5cdFx0XHRldmVudE5hbWUsXG5cdFx0XHRkYXRhLFxuXHRcdFx0Y2xpZW50Q2FsbGJhY2ssXG5cdFx0XHRjbGllbnRFcnJvckNhbGxiYWNrXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFeGVjdXRlIHRoZSBmdW5jdGlvbnMgd2hpY2ggc3Vic2NyaWJlIHRvIHRoaXMgZXZlbnQsIGJ1dCBkb24ndCBwcm9jZXNzIHRoZSBjbGllbnQgY2FsbGJhY2sgLSB0aGUgc3Vic2NyaXB0aW9uIGZ1bmN0aW9uXG5cdCAqIHNob3VsZCBleGVjdXRlIHRoZSBjbGllbnQgY2FsbGJhY2tcblx0ICogQHBhcmFtIGV2ZW50SWRcblx0ICogQHBhcmFtIGRhdGFcblx0ICogQHBhcmFtIGNsaWVudENhbGxiYWNrXG5cdCAqIEBwYXJhbSBjbGllbnRFcnJvckNhbGxiYWNrXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9XG5cdCAqIEBjb25zdHJ1Y3RvclxuXHQgKi9cblx0c3RhdGljIEFzeW5jKFxuXHRcdGV2ZW50SWQsXG5cdFx0ZGF0YSxcblx0XHRjbGllbnRDYWxsYmFjayxcblx0XHRjbGllbnRFcnJvckNhbGxiYWNrXG5cdCkge1xuXHRcdGlmIChFdmVudC5TdWJzY3JpcHRpb25zLmhhc093blByb3BlcnR5KGV2ZW50SWQpKSB7XG5cblx0XHRcdGxldCBzdWJzY3JpcHRpb25JZHMgPSBPYmplY3Qua2V5cyhFdmVudC5TdWJzY3JpcHRpb25zW2V2ZW50SWRdKTtcblxuXHRcdFx0c3Vic2NyaXB0aW9uSWRzLm1hcChcblx0XHRcdFx0ZnVuY3Rpb24oc3Vic2NyaXB0aW9uSWQpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0RXZlbnQuU3Vic2NyaXB0aW9uc1tldmVudElkXVtzdWJzY3JpcHRpb25JZF0oZGF0YSwgY2xpZW50Q2FsbGJhY2ssIGNsaWVudEVycm9yQ2FsbGJhY2spO1xuXHRcdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0XHRpZiAoY2xpZW50RXJyb3JDYWxsYmFjaykge1xuXHRcdFx0XHRcdFx0XHRjbGllbnRFcnJvckNhbGxiYWNrKGVycm9yKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuXHRcdFx0XHRcdFx0XHR0aHJvdyBlcnJvcjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdClcblx0XHR9XG5cdH07XG4gIC8vQ1VTVE9NX0lNUExFTUVOVEFUSU9OX0VORFxuXG59XG5cbi8vQ1VTVE9NX09VVF9PRl9DTEFTU19JTVBMRU1FTlRBVElPTl9TVEFSVFxuXG4vL0VWRU5UX0dFTkVSQVRFRF9TVEFSVFxuRXZlbnQuQ09NUE9ORU5UX0lOSVRJQUxJWkVEID0gMHgxO1xuRXZlbnQuQ1JFQVRFX0lOU1RBTkNFX0JFRk9SRSA9IDB4MjtcbkV2ZW50LkRJU1BPU0VfSU5TVEFOQ0UgPSAweDM7XG5FdmVudC5ESVNQT1NFX09CSkVDVCA9IDB4NDtcbkV2ZW50LkdFVF9SVU5USU1FID0gMHg1O1xuRXZlbnQuR0VUX1dJTkRPV19TSVpFID0gMHg2O1xuRXZlbnQuSU5TVEFOQ0VfQ1JFQVRFRCA9IDB4NztcbkV2ZW50LklOU1RBTkNFX0RJU1BPU0VEID0gMHg4O1xuRXZlbnQuT0JKRUNUX0NSRUFURUQgPSAweDk7XG5FdmVudC5PQkpFQ1RfSU5JVElBTElaRUQgPSAweGE7XG5FdmVudC5QQVVTRSA9IDB4YjtcbkV2ZW50LlJFU1RBUlQgPSAweGM7XG5FdmVudC5TVEFSVCA9IDB4ZDtcbkV2ZW50LlVQREFURV9GUk9NX0lOU1RBTkNFX0FGVEVSID0gMHhlO1xuRXZlbnQuVVBEQVRFX0ZST01fSU5TVEFOQ0VfQkVGT1JFID0gMHhmO1xuRXZlbnQuVVBEQVRFX0lOU1RBTkNFX0FGVEVSID0gMHgxMDtcbkV2ZW50LlVQREFURV9JTlNUQU5DRV9CRUZPUkUgPSAweDExO1xuRXZlbnQuTUFYX0VWRU5UUyA9IDB4MTI7XG5cbkV2ZW50LkdldEV2ZW50TmFtZSA9IGZ1bmN0aW9uKGV2ZW50SWQpIHtcblxuXHRzd2l0Y2goZXZlbnRJZCkge1xuXHRcdGNhc2UgMHgxIDogcmV0dXJuICdjb21wb25lbnRfaW5pdGlhbGl6ZWQnO1xuXHRcdGNhc2UgMHgyIDogcmV0dXJuICdjcmVhdGVfaW5zdGFuY2VfYmVmb3JlJztcblx0XHRjYXNlIDB4MyA6IHJldHVybiAnZGlzcG9zZV9pbnN0YW5jZSc7XG5cdFx0Y2FzZSAweDQgOiByZXR1cm4gJ2Rpc3Bvc2Vfb2JqZWN0Jztcblx0XHRjYXNlIDB4NSA6IHJldHVybiAnZ2V0X3J1bnRpbWUnO1xuXHRcdGNhc2UgMHg2IDogcmV0dXJuICdnZXRfd2luZG93X3NpemUnO1xuXHRcdGNhc2UgMHg3IDogcmV0dXJuICdpbnN0YW5jZV9jcmVhdGVkJztcblx0XHRjYXNlIDB4OCA6IHJldHVybiAnaW5zdGFuY2VfZGlzcG9zZWQnO1xuXHRcdGNhc2UgMHg5IDogcmV0dXJuICdvYmplY3RfY3JlYXRlZCc7XG5cdFx0Y2FzZSAweGEgOiByZXR1cm4gJ29iamVjdF9pbml0aWFsaXplZCc7XG5cdFx0Y2FzZSAweGIgOiByZXR1cm4gJ3BhdXNlJztcblx0XHRjYXNlIDB4YyA6IHJldHVybiAncmVzdGFydCc7XG5cdFx0Y2FzZSAweGQgOiByZXR1cm4gJ3N0YXJ0Jztcblx0XHRjYXNlIDB4ZSA6IHJldHVybiAndXBkYXRlX2Zyb21faW5zdGFuY2VfYWZ0ZXInO1xuXHRcdGNhc2UgMHhmIDogcmV0dXJuICd1cGRhdGVfZnJvbV9pbnN0YW5jZV9iZWZvcmUnO1xuXHRcdGNhc2UgMHgxMCA6IHJldHVybiAndXBkYXRlX2luc3RhbmNlX2FmdGVyJztcblx0XHRjYXNlIDB4MTEgOiByZXR1cm4gJ3VwZGF0ZV9pbnN0YW5jZV9iZWZvcmUnO1xuXHRcdGRlZmF1bHQgOlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdFdmVudCB0eXBlIG5vdCBkZWZpbmVkIDogJyArIGV2ZW50SWQpO1xuXHR9XG5cbn07XG4vL0VWRU5UX0dFTkVSQVRFRF9FTkRcblxuLy9DVVNUT01fT1VUX09GX0NMQVNTX0lNUExFTUVOVEFUSU9OX0VORFxuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50OyIsImNvbnN0IFV0aWxzID0gcmVxdWlyZSgncjMtdXRpbHMnKTtcbmNvbnN0IEV2ZW50ID0gcmVxdWlyZSgncjMtZXZlbnQuanMnKTtcblxuLyoqXG5cbiBPUFRJT05TX1NUQVJUXG4gaWQ9VXRpbHMuUmFuZG9tSWQoMTApXG4gbmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUgKyAnKCcgKyBvcHRpb25zLmlkICsgJyknXG4gcmVnaXN0ZXI9dHJ1ZVxuIE9QVElPTlNfRU5EXG5cbiBJTlNUQU5DRV9PUFRJT05TX01BUFBJTkdfU1RBUlRcbiBJTlNUQU5DRV9PUFRJT05TX01BUFBJTkdfRU5EXG5cbiBMSU5LRURfT0JKRUNUU19TVEFSVFxuIExJTktFRF9PQkpFQ1RTX0VORFxuXG4gRVhDTFVERURfRlJPTV9JTlNUQU5DRV9PUFRJT05TX1NUQVJUXG4gaWRcbiBuYW1lXG4gcmVnaXN0ZXJcbiBFWENMVURFRF9GUk9NX0lOU1RBTkNFX09QVElPTlNfRU5EXG5cbiAqKi9cblxuY2xhc3MgUjNPYmplY3QgZXh0ZW5kcyBFdmVudCB7XG5cbiAgLy9DT05TVFJVQ1RPUl9FWFRFTkRTX1RFTVBMQVRFX1NUQVJUXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcblxuICAgIGlmIChVdGlscy5VbmRlZmluZWRPck51bGwob3B0aW9ucykpIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBzdXBlcihvcHRpb25zKTtcblxuICAgIHRoaXMuZW1pdChFdmVudC5PQkpFQ1RfQ1JFQVRFRCwgdGhpcyk7XG5cbiAgICAvL09QVElPTlNfSU5JVF9TVEFSVFxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKG9wdGlvbnMuaWQpKSB7XG4gICAgICBvcHRpb25zLmlkID0gVXRpbHMuUmFuZG9tSWQoMTApO1xuICAgIH1cbiAgICBpZiAoVXRpbHMuVW5kZWZpbmVkT3JOdWxsKG9wdGlvbnMubmFtZSkpIHtcbiAgICAgIG9wdGlvbnMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZSArICcoJyArIG9wdGlvbnMuaWQgKyAnKSc7XG4gICAgfVxuICAgIGlmIChVdGlscy5VbmRlZmluZWRPck51bGwob3B0aW9ucy5yZWdpc3RlcikpIHtcbiAgICAgIG9wdGlvbnMucmVnaXN0ZXIgPSB0cnVlO1xuICAgIH1cblx0XHQvL09QVElPTlNfSU5JVF9FTkRcblxuICAgIC8vQ1VTVE9NX09QVElPTlNfSU5JVF9TVEFSVFxuICAgIC8vQ1VTVE9NX09QVElPTlNfSU5JVF9FTkRcblxuICAgIE9iamVjdC5hc3NpZ24odGhpcywgb3B0aW9ucyk7XG5cbiAgICAvL0NVU1RPTV9CRUZPUkVfSU5JVF9TVEFSVFxuICAgIC8vQ1VTVE9NX0JFRk9SRV9JTklUX0VORFxuXG4gICAgdGhpcy5lbWl0KEV2ZW50Lk9CSkVDVF9JTklUSUFMSVpFRCwgdGhpcyk7XG4gIH1cblx0Ly9DT05TVFJVQ1RPUl9FWFRFTkRTX1RFTVBMQVRFX0VORFxuXG4gIC8vQ1JFQVRFX0lOU1RBTkNFX1RFTVBMQVRFX1NUQVJUXG4gIGNyZWF0ZUluc3RhbmNlKCkge1xuXG4gICAgLy9DUkVBVEVfSU5TVEFOQ0VfQkVGT1JFX1NUQVJUXG4gICAgdGhpcy5lbWl0KEV2ZW50LkNSRUFURV9JTlNUQU5DRV9CRUZPUkUsIHRoaXMpO1xuXHRcdC8vQ1JFQVRFX0lOU1RBTkNFX0JFRk9SRV9FTkRcblxuICAgIC8vQ1VTVE9NX0NSRUFURV9JTlNUQU5DRV9TVEFSVFxuICAgIC8vQ1VTVE9NX0NSRUFURV9JTlNUQU5DRV9FTkRcblxuICAgIC8vQ1JFQVRFX0lOU1RBTkNFX0FGVEVSX1NUQVJUXG4gICAgdGhpc1t0aGlzLnJ1bnRpbWVdLmNyZWF0ZUluc3RhbmNlKFxuICAgICAgdGhpcyxcbiAgICAgIHtcbiAgICAgICAgLy9DUkVBVEVfSU5TVEFOQ0VfT1BUSU9OU19TVEFSVFxuICAgICAgICAvL0NSRUFURV9JTlNUQU5DRV9PUFRJT05TX0VORFxuICAgICAgfVxuICAgIClcblxuICAgIHRoaXMuZW1pdChFdmVudC5JTlNUQU5DRV9DUkVBVEVELCB0aGlzKTtcblx0XHQvL0NSRUFURV9JTlNUQU5DRV9BRlRFUl9FTkRcblxuICB9XG5cdC8vQ1JFQVRFX0lOU1RBTkNFX1RFTVBMQVRFX0VORFxuXG4gIC8vVVBEQVRFX0lOU1RBTkNFX1RFTVBMQVRFX1NUQVJUXG4gIHVwZGF0ZUluc3RhbmNlKHByb3BlcnR5KSB7XG5cbiAgICAvL1VQREFURV9JTlNUQU5DRV9CRUZPUkVfU1RBUlRcbiAgICB0aGlzLmVtaXQoRXZlbnQuVVBEQVRFX0lOU1RBTkNFX0JFRk9SRSwgdGhpcyk7XG5cdFx0Ly9VUERBVEVfSU5TVEFOQ0VfQkVGT1JFX0VORFxuXG4gICAgLy9VUERBVEVfSU5TVEFOQ0VfT1BUSU9OU19TVEFSVFxuXHRcdC8vVVBEQVRFX0lOU1RBTkNFX09QVElPTlNfRU5EXG5cbiAgICAvL0NVU1RPTV9VUERBVEVfSU5TVEFOQ0VfU1RBUlRcbiAgICAvL0NVU1RPTV9VUERBVEVfSU5TVEFOQ0VfRU5EXG5cbiAgICAvL1VQREFURV9JTlNUQU5DRV9BRlRFUl9TVEFSVFxuICAgIHRoaXMuZW1pdChFdmVudC5VUERBVEVfSU5TVEFOQ0VfQUZURVIsIHRoaXMpO1xuXHRcdC8vVVBEQVRFX0lOU1RBTkNFX0FGVEVSX0VORFxuXG4gIH1cblx0Ly9VUERBVEVfSU5TVEFOQ0VfVEVNUExBVEVfRU5EXG5cbiAgLy9VUERBVEVfRlJPTV9JTlNUQU5DRV9URU1QTEFURV9TVEFSVFxuICB1cGRhdGVGcm9tSW5zdGFuY2UocHJvcGVydHkpIHtcblxuICAgIC8vVVBEQVRFX0ZST01fSU5TVEFOQ0VfQkVGT1JFX1NUQVJUXG4gICAgdGhpcy5lbWl0KEV2ZW50LlVQREFURV9GUk9NX0lOU1RBTkNFX0JFRk9SRSwgdGhpcyk7XG5cdFx0Ly9VUERBVEVfRlJPTV9JTlNUQU5DRV9CRUZPUkVfRU5EXG5cbiAgICAvL1VQREFURV9GUk9NX0lOU1RBTkNFX09QVElPTlNfU1RBUlRcblx0XHQvL1VQREFURV9GUk9NX0lOU1RBTkNFX09QVElPTlNfRU5EXG5cbiAgICAvL0NVU1RPTV9VUERBVEVfRlJPTV9JTlNUQU5DRV9TVEFSVFxuICAgIC8vQ1VTVE9NX1VQREFURV9GUk9NX0lOU1RBTkNFX0VORFxuXG4gICAgLy9VUERBVEVfRlJPTV9JTlNUQU5DRV9BRlRFUl9TVEFSVFxuICAgIHRoaXMuZW1pdChFdmVudC5VUERBVEVfRlJPTV9JTlNUQU5DRV9BRlRFUiwgdGhpcyk7XG5cdFx0Ly9VUERBVEVfRlJPTV9JTlNUQU5DRV9BRlRFUl9FTkRcblxuICB9XG5cdC8vVVBEQVRFX0ZST01fSU5TVEFOQ0VfVEVNUExBVEVfRU5EXG5cbiAgLy9ESVNQT1NFX1RFTVBMQVRFX1NUQVJUXG4gIGRpc3Bvc2UoKSB7XG5cbiAgICAvL0RJU1BPU0VfQkVGT1JFX1NUQVJUXG4gICAgdGhpcy5zdWJzY3JpYmUoXG4gICAgICBFdmVudC5JTlNUQU5DRV9ESVNQT1NFRCxcbiAgICAgIGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgICBpZiAob2JqZWN0ID09PSB0aGlzKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KEV2ZW50LkRJU1BPU0VfT0JKRUNULCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICk7XG5cdFx0Ly9ESVNQT1NFX0JFRk9SRV9FTkRcblxuICAgIC8vQ1VTVE9NX0RJU1BPU0VfU1RBUlRcbiAgICAvL0NVU1RPTV9ESVNQT1NFX0VORFxuXG4gICAgLy9ESVNQT1NFX0FGVEVSX1NUQVJUXG4gICAgdGhpcy5kaXNwb3NlSW5zdGFuY2UoKTtcblx0XHQvL0RJU1BPU0VfQUZURVJfRU5EXG5cbiAgfVxuXHQvL0RJU1BPU0VfVEVNUExBVEVfRU5EXG5cbiAgLy9ESVNQT1NFX0lOU1RBTkNFX1RFTVBMQVRFX1NUQVJUXG4gIGRpc3Bvc2VJbnN0YW5jZSgpIHtcblxuICAgIC8vRElTUE9TRV9JTlNUQU5DRV9CRUZPUkVfU1RBUlRcbiAgICBjb25zb2xlLmxvZygnRGlzcG9zaW5nIGluc3RhbmNlIG9mICcgKyB0aGlzLm5hbWUpO1xuXHRcdC8vRElTUE9TRV9JTlNUQU5DRV9CRUZPUkVfRU5EXG5cbiAgICAvL0NVU1RPTV9ESVNQT1NFX0lOU1RBTkNFX1NUQVJUXG4gICAgLy9DVVNUT01fRElTUE9TRV9JTlNUQU5DRV9FTkRcblxuICAgIC8vRElTUE9TRV9JTlNUQU5DRV9BRlRFUl9TVEFSVFxuICAgIHRoaXMuZW1pdChFdmVudC5ESVNQT1NFX0lOU1RBTkNFLCB0aGlzKTtcblx0XHQvL0RJU1BPU0VfSU5TVEFOQ0VfQUZURVJfRU5EXG5cbiAgfVxuXHQvL0RJU1BPU0VfSU5TVEFOQ0VfVEVNUExBVEVfRU5EXG5cbiAgLy9DVVNUT01fSU1QTEVNRU5UQVRJT05fU1RBUlRcbiAgLy9DVVNUT01fSU1QTEVNRU5UQVRJT05fRU5EXG5cbn1cblxuLy9DVVNUT01fT1VUX09GX0NMQVNTX0lNUExFTUVOVEFUSU9OX1NUQVJUXG4vL0NVU1RPTV9PVVRfT0ZfQ0xBU1NfSU1QTEVNRU5UQVRJT05fRU5EXG5cbm1vZHVsZS5leHBvcnRzID0gUjNPYmplY3Q7IiwiY29uc3QgU3lzdGVtID0gcmVxdWlyZSgnLi9yMy1zeXN0ZW0uanMnKTtcbmNvbnN0IFN5c3RlbUxpbmtpbmcgPSByZXF1aXJlKCcuL3IzLXN5c3RlbS1saW5raW5nLmpzJyk7XG5jb25zdCBTeXN0ZW1Tb2NrZXQgPSByZXF1aXJlKCcuL3IzLXN5c3RlbS1zb2NrZXQuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFN5c3RlbSxcbiAgU3lzdGVtTGlua2luZyxcbiAgU3lzdGVtU29ja2V0XG59IiwiY29uc3QgU3lzdGVtID0gcmVxdWlyZSgnLi9yMy1zeXN0ZW0nKTtcbmNvbnN0IFIzT2JqZWN0ID0gcmVxdWlyZSgnLi4vcjMtcjMtb2JqZWN0Jyk7XG5jb25zdCBFdmVudCA9IHJlcXVpcmUoJy4uL3IzLWV2ZW50Jyk7XG5cbmNsYXNzIExpbmtpbmdTeXN0ZW0gZXh0ZW5kcyBTeXN0ZW0ge1xuXG5cdHN0YXRpYyBzdGFydCgpIHtcblxuXHRcdHN1cGVyLnN0YXJ0KCk7XG5cdFx0XG5cdFx0Y29uc29sZS5sb2coJ3N0YXJ0aW5nIGxpbmtpbmcgc3lzdGVtJyk7XG5cblx0XHRFdmVudC5TdWJzY3JpYmUoXG5cdFx0XHRFdmVudC5PQkpFQ1RfQ1JFQVRFRCxcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0Y29uc29sZS5sb2coJ2xpbmtpbmcgc3lzdGVtIGRpc2NvdmVyZWQgYW4gb2JqZWN0Jyk7XG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdGxldCBvYmplY3QgPSBuZXcgUjNPYmplY3QoKTtcblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cdFxuXG59XG5cbm1vZHVsZS5leHBvcnRzID0gTGlua2luZ1N5c3RlbTtcbiIsImNvbnN0IFN5c3RlbSA9IHJlcXVpcmUoJy4vcjMtc3lzdGVtLmpzJyk7XG5cbmNsYXNzIFNvY2tldFN5c3RlbSBleHRlbmRzIFN5c3RlbSB7XG5cblx0c3RhdGljIHN0YXJ0KCkge1xuXG5cdFx0c3VwZXIuc3RhcnQoKTtcblx0XHRcblx0XHRjb25zb2xlLmxvZygnc3RhcnRpbmcgc29ja2V0IHN5c3RlbScpO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVxuXG59XG5cbm1vZHVsZS5leHBvcnRzID0gU29ja2V0U3lzdGVtOyIsImNsYXNzIFN5c3RlbSB7XG5cblx0c3RhdGljIHN0YXJ0KCkge1xuXHRcdGNvbnNvbGUubG9nKCdzdGFydGluZyBhIHN5c3RlbScpO1x0XG5cdH1cblxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFN5c3RlbTtcbiIsImNvbnN0IHtTeXN0ZW0sIFN5c3RlbUxpbmtpbmcsIFN5c3RlbVNvY2tldH0gPSByZXF1aXJlKCcuL3IzLXN5c3RlbScpO1xuY29uc3QgUjNPYmplY3QgPSByZXF1aXJlKCcuL3IzLXIzLW9iamVjdCcpO1xuXG5jbGFzcyBSMyB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdH1cblxuXHRzdGF0aWMgdmVyc2lvbigpIHtcblx0XHRyZXR1cm4gJ19fREFURV9fJztcblx0fVxuXG59XG5cblIzLlIzT2JqZWN0IFx0XHQ9IFIzT2JqZWN0O1xuUjMuU3lzdGVtIFx0XHRcdD0gU3lzdGVtO1xuUjMuU3lzdGVtLkxpbmtpbmdcdD0gU3lzdGVtTGlua2luZztcblIzLlN5c3RlbS5Tb2NrZXRcdD0gU3lzdGVtU29ja2V0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFIzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file + /** + * toApiObject() + * - Transforms the current object into JSON ready to be stored to the back-end. \n * @returns JSON + */ + toApiObject() { + + //GENERATE_TO_API_OBJECT_METHOD_START + //GENERATE_TO_API_OBJECT_METHOD_END + + //CUSTOM_TO_API_OBJECT_METHOD_START + //CUSTOM_TO_API_OBJECT_METHOD_END + + } + //GENERATE_METHODS_END + + //GENERATE_STATIC_METHODS_START + //GENERATE_STATIC_METHODS_END + + //CUSTOM_IMPLEMENTATION_START + //CUSTOM_IMPLEMENTATION_END +} + +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_START +//CUSTOM_OUT_OF_CLASS_IMPLEMENTATION_END + +module.exports = Image; \ No newline at end of file diff --git a/package.json b/package.json index 6754f9b..090c714 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "r3", - "version": "2.0.0", + "version" : "2.0.18", "description": "", "private": true, "dependencies": { @@ -19,6 +19,7 @@ "map-stream": "0.0.7", "mocha": "^9.0.0", "webpack": "^5.39.1", + "webpack-cli": "*", "webpack-stream": "^6.1.2" }, "scripts": { diff --git a/src/r3/index.js b/src/r3/index.js index 59ee134..1579027 100644 --- a/src/r3/index.js +++ b/src/r3/index.js @@ -1,15 +1,18 @@ //GENERATE_IMPORTS_START -const R3 = require('./r3-r3.js'); -const System = require('./r3-system/r3-system.js'); -const Event = require('./r3-event.js'); -const Utils = require('./r3-utils.js'); +const R3 = require('r3-r3.js'); //GENERATE_IMPORTS_END +//GENERATE_INDEX_BODY_START +R3.System.Linking.Start() +R3.System.Socket.Start() +R3.System.Test.Start() + +console.log('r3.js - version ' + R3.version + ' compiled ' + R3.compileDate); + +//GENERATE_INDEX_BODY_END + module.exports = { //GENERATE_EXPORTS_START - R3, - System, - Event, - Utils + R3 //GENERATE_EXPORTS_END } \ No newline at end of file diff --git a/src/r3/r3-component/index.js b/src/r3/r3-component/index.js index 3157a7f..2a45b0a 100644 --- a/src/r3/r3-component/index.js +++ b/src/r3/r3-component/index.js @@ -3,6 +3,9 @@ const Component = require('./r3-component.js'); const Image = require('./r3-image.js'); //GENERATE_IMPORTS_END +//GENERATE_INDEX_BODY_START +//GENERATE_INDEX_BODY_END + module.exports = { //GENERATE_EXPORTS_START Component, diff --git a/src/r3/r3-r3.js b/src/r3/r3-r3.js index 969c88d..65ebfc9 100644 --- a/src/r3/r3-r3.js +++ b/src/r3/r3-r3.js @@ -1,6 +1,6 @@ class R3 { - static version = '__VERSION__'; - static compileDate = '__DATE__'; + static version = '2.0.18'; + static compileDate = '2021 Jul 04 - 16:34:09 pm'; } //GENERATE_IMPORTS_START @@ -29,10 +29,13 @@ R3.Event.Object.Project = Project; R3.Event.Object.Component.Image = Image; //GENERATE_DEFINES_END +//GENERATE_CONVENIENT_DEFINES_START +R3.Object = R3Object; +R3.Component = Component; +//GENERATE_CONVENIENT_DEFINES_END + //CUSTOM_CONVENIENT_DEFINES_START -R3.Object = R3.Event.Object; -R3.Project = R3.Event.Object.Project; -R3.Component = R3.Event.Object.Component; +R3.Project = Project; //CUSTOM_CONVENIENT_DEFINES_END module.exports = R3; diff --git a/src/r3/r3-system/index.js b/src/r3/r3-system/index.js index f2eb235..f573ba9 100644 --- a/src/r3/r3-system/index.js +++ b/src/r3/r3-system/index.js @@ -5,6 +5,9 @@ const SystemSocket = require('./r3-system-socket.js'); const SystemTest = require('./r3-system-test.js'); //GENERATE_IMPORTS_END +//GENERATE_INDEX_BODY_START +//GENERATE_INDEX_BODY_END + module.exports = { //GENERATE_EXPORTS_START System, diff --git a/src/templates/index.template b/src/templates/index.template index 231c6ae..9b6f590 100644 --- a/src/templates/index.template +++ b/src/templates/index.template @@ -1,6 +1,9 @@ //GENERATE_IMPORTS_START //GENERATE_IMPORTS_END +//GENERATE_INDEX_BODY_START +//GENERATE_INDEX_BODY_END + module.exports = { //GENERATE_EXPORTS_START //GENERATE_EXPORTS_END diff --git a/src/templates/r3-base.template b/src/templates/r3-base.template index d326f88..ad0d373 100644 --- a/src/templates/r3-base.template +++ b/src/templates/r3-base.template @@ -1,6 +1,6 @@ class R3 { - static version = '__VERSION__'; - static compileDate = '__DATE__'; + static version = 'VERSION'; + static compileDate = 'DATE'; } //GENERATE_IMPORTS_START @@ -9,6 +9,9 @@ class R3 { //GENERATE_DEFINES_START //GENERATE_DEFINES_END +//GENERATE_CONVENIENT_DEFINES_START +//GENERATE_CONVENIENT_DEFINES_END + //CUSTOM_CONVENIENT_DEFINES_START //CUSTOM_CONVENIENT_DEFINES_END diff --git a/src/templates/token.db b/src/templates/token.db index 6c767ae..7bd3ea4 100644 --- a/src/templates/token.db +++ b/src/templates/token.db @@ -1,6 +1,7 @@ GENERATE_ASYNC_METHOD GENERATE_CONSTRUCTOR GENERATE_CONSTRUCTOR_EXTENDS +GENERATE_CONVENIENT_DEFINES GENERATE_CREATE_INSTANCE_METHOD GENERATE_CREATE_INSTANCE_OPTIONS GENERATE_DEFINES @@ -10,6 +11,7 @@ GENERATE_EMIT_METHOD GENERATE_EVENT_LISTENERS GENERATE_EXPORTS GENERATE_IMPORTS +GENERATE_INDEX_BODY GENERATE_INHERITED GENERATE_METHOD_NAME_UPPERCASE_METHOD GENERATE_METHODS diff --git a/update_templates.php b/update_templates.php index f0321a0..3c406c7 100755 --- a/update_templates.php +++ b/update_templates.php @@ -952,6 +952,11 @@ function generateR3($nodes) $file = str_replace('src/r3', '.', $node->file); array_push($imports, "const " . $node->name . ' = require(\'' . $file . "');"); array_push($defines, $node->nameSpace . $node->nameSpaceClassName . ' = ' . $node->name); + + if (sizeof($node->children) > 0 && substr_count($node->nameSpace, ".") > 1) { + $convenientDefine = "R3." . $node->nameSpaceClassName . ' = ' . $node->name; + array_push($convenientDefines, $convenientDefine); + } } @@ -963,13 +968,59 @@ function generateR3($nodes) $template = file_get_contents('src/templates/r3-base.template'); + $version = file_get_contents('version'); + + $template = str_replace('DATE', date("Y M d - H:i:s a"), $template); + $template = str_replace('VERSION', $version, $template); + file_put_contents($r3File, $template); + $packageJson = file_get_contents('package.json'); + $packageJson = preg_replace('/(.*version.*: ").*(".*)/', '${1}' . $version . '${2}', $packageJson); + file_put_contents('package.json', $packageJson); + updateSection($r3File, 'GENERATE_IMPORTS', implode("\n", $imports)); updateSection($r3File, 'GENERATE_DEFINES', implode(";\n", $defines) . ";"); + updateSection($r3File, 'GENERATE_CONVENIENT_DEFINES', implode(";\n", $convenientDefines) . ";"); + if (in_array('CUSTOM_CONVENIENT_DEFINES', array_keys($tokens))) { updateSection($r3File, 'CUSTOM_CONVENIENT_DEFINES', $tokens['CUSTOM_CONVENIENT_DEFINES']); } + + $indexFile = 'src/r3/index.js'; + + $template = file_get_contents('src/templates/index.template'); + file_put_contents($indexFile, $template); + + $imports = ['const R3 = require(\'r3-r3.js\');']; + $exports = ' R3'; + $indexBody = []; + + foreach ($nodes as $node) { + /** + * Node $node + */ + if (preg_match('/\bSystem\w+\b/', $node->name)){ + array_push($indexBody, $node->nameSpace . $node->nameSpaceClassName . ".Start()"); + } + } + + array_push($indexBody, "\nconsole.log('r3.js - version ' + R3.version + ' compiled ' + R3.compileDate);\n\n"); + + updateSection($indexFile, 'GENERATE_IMPORTS', implode("\n", $imports)); + updateSection($indexFile, 'GENERATE_INDEX_BODY', implode("\n", $indexBody)); + updateSection($indexFile, 'GENERATE_EXPORTS', $exports); + + $r3js = fopen('dist/r3.js', "w"); + + ftruncate($r3js, 0); + + foreach ($nodes as $node) { + $contents = file_get_contents($node->file); + fwrite($r3js, $contents); + } + + fclose($r3js); } if ($argv[2] == 'build-graph') { diff --git a/version b/version new file mode 100644 index 0000000..e164972 --- /dev/null +++ b/version @@ -0,0 +1 @@ +2.0.18 \ No newline at end of file