UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

111 lines (99 loc) 3.42 kB
/** * returns the current GPS position if the device has access to it * * */ import {ParamlessTypedJsNode} from './_Base'; import {JsConnectionPoint, JsConnectionPointType, JS_CONNECTION_POINT_IN_NODE_DEF} from '../utils/io/connections/Js'; import {JsType} from '../../poly/registers/nodes/types/Js'; import {JsLinesCollectionController} from './code/utils/JsLinesCollectionController'; import {Poly} from '../../Poly'; import {WatchedValueJsDefinition} from './utils/JsDefinition'; import {nodeMethodName} from './code/assemblers/actor/ActorAssemblerUtils'; const CONNECTION_OPTIONS = JS_CONNECTION_POINT_IN_NODE_DEF; enum GeolocationCurrentPositionOutput { LAT = 'lat', LNG = 'lng', } export class GeolocationCurrentPositionJsNode extends ParamlessTypedJsNode { static override type() { return JsType.GEOLOCATION_CURRENT_POSITION; } override isTriggering() { return true; } override initializeNode() { super.initializeNode(); this.io.inputs.setNamedInputConnectionPoints([ new JsConnectionPoint(JsConnectionPointType.TRIGGER, JsConnectionPointType.TRIGGER, CONNECTION_OPTIONS), ]); this.io.outputs.setNamedOutputConnectionPoints([ new JsConnectionPoint(JsConnectionPointType.TRIGGER, JsConnectionPointType.TRIGGER, CONNECTION_OPTIONS), new JsConnectionPoint( GeolocationCurrentPositionOutput.LAT, JsConnectionPointType.FLOAT, CONNECTION_OPTIONS ), new JsConnectionPoint( GeolocationCurrentPositionOutput.LNG, JsConnectionPointType.FLOAT, CONNECTION_OPTIONS ), ]); } override setLines(linesController: JsLinesCollectionController) { // outputs const usedOutputNames = this.io.outputs.used_output_names(); const _val = ( propertyName: string, functionName: 'geolocationLatitude' | 'geolocationLongitude', type: JsConnectionPointType ) => { if (!usedOutputNames.includes(propertyName)) { return; } const func = Poly.namedFunctionsRegister.getFunction(functionName, this, linesController); const varName = this.jsVarName(propertyName); // const variable = createVariable(type); // if (variable) { // shadersCollectionController.addVariable(this, variable); // } linesController.addBodyOrComputed(this, [ { dataType: type, varName, value: func.asString(), }, ]); }; _val(GeolocationCurrentPositionOutput.LAT, 'geolocationLatitude', JsConnectionPointType.FLOAT); _val(GeolocationCurrentPositionOutput.LNG, 'geolocationLongitude', JsConnectionPointType.FLOAT); } override setTriggeringLines(linesController: JsLinesCollectionController, triggeredMethods: string) { const geolocationCurrentPositionRef = Poly.namedFunctionsRegister.getFunction( 'geolocationCurrentPositionRef', this, linesController ); linesController.addDefinitions(this, [ new WatchedValueJsDefinition( this, linesController, JsConnectionPointType.VECTOR2, geolocationCurrentPositionRef.asString(), `this.${nodeMethodName(this)}()`, { deep: true, } ), ]); linesController.addTriggeringLines(this, [triggeredMethods], { gatherable: false, }); } override setTriggerableLines(linesController: JsLinesCollectionController) { const func = Poly.namedFunctionsRegister.getFunction('geolocationGetCurrentPosition', this, linesController); const bodyLine = func.asString(); linesController.addTriggerableLines(this, [bodyLine]); } }