UNPKG

@polygonjs/polygonjs

Version:

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

90 lines (89 loc) 3.78 kB
"use strict"; import { BaseSopOperation } from "./_Base"; import { InputCloneMode } from "../../../engine/poly/InputCloneMode"; import { ThreejsCoreObject } from "../../../core/geometry/modules/three/ThreejsCoreObject"; import { CameraAttribute } from "../../../core/camera/CoreCamera"; import { CameraSopNodeType } from "../../poly/NodeContext"; import { CoreWebXRARController } from "../../../core/webXR/webXRAR/CoreWebXRARController"; import { WebXRARFeature } from "../../../core/webXR/webXRAR/CommonAR"; import { WebXRFeatureStatus, WEBXR_FEATURE_STATUSES, WEBXR_FEATURE_STATUS_OPTIONAL_INDEX, DEFAULT_WEBXR_REFERENCE_SPACE_TYPE, WEBXR_REFERENCE_SPACE_TYPES } from "../../../core/webXR/Common"; import { TypeAssert } from "../../poly/Assert"; import { isBooleanTrue } from "../../../core/Type"; import { CoreMask } from "../../../core/geometry/Mask"; const _CameraWebXRARSopOperation = class extends BaseSopOperation { static type() { return CameraSopNodeType.WEBXR_AR; } cook(inputCoreGroups, params) { const coreGroup = inputCoreGroups[0]; const objects = CoreMask.filterObjects(coreGroup, { group: params.group }); if (this._node) { _CameraWebXRARSopOperation.updateObject({ scene: this._node.scene(), objects, params, active: true }); } return coreGroup; } static updateObject(options) { const { scene, objects, params, active } = options; scene.webXR.setARControllerCreationFunction(function(renderer, camera, canvas, options2) { return new CoreWebXRARController(scene, renderer, camera, canvas, options2); }); const optionalFeatures = []; const requiredFeatures = []; function assignFeatureByStatus(feature, featureStatusIndex) { const featureStatus = WEBXR_FEATURE_STATUSES[featureStatusIndex] || WebXRFeatureStatus.NOT_USED; switch (featureStatus) { case WebXRFeatureStatus.NOT_USED: { return; } case WebXRFeatureStatus.OPTIONAL: { optionalFeatures.push(feature); return; } case WebXRFeatureStatus.REQUIRED: { requiredFeatures.push(feature); return; } } TypeAssert.unreachable(featureStatus); } assignFeatureByStatus(WebXRARFeature.HIT_TEST, params.hitTest); assignFeatureByStatus(WebXRARFeature.LIGHT_ESTIMATION, params.lightEstimation); const optionalFeaturesStr = optionalFeatures.join(" "); const requiredFeaturesStr = requiredFeatures.join(" "); for (let object of objects) { ThreejsCoreObject.addAttribute(object, CameraAttribute.WEBXR_AR, active); ThreejsCoreObject.addAttribute(object, CameraAttribute.WEBXR_AR_FEATURES_OPTIONAL, optionalFeaturesStr); ThreejsCoreObject.addAttribute(object, CameraAttribute.WEBXR_AR_FEATURES_REQUIRED, requiredFeaturesStr); ThreejsCoreObject.addAttribute( object, CameraAttribute.WEBXR_AR_OVERRIDE_REFERENCE_SPACE_TYPE, isBooleanTrue(params.overrideReferenceSpaceType) ); if (isBooleanTrue(params.overrideReferenceSpaceType)) { ThreejsCoreObject.addAttribute( object, CameraAttribute.WEBXR_AR_REFERENCE_SPACE_TYPE, WEBXR_REFERENCE_SPACE_TYPES[params.referenceSpaceType] ); } } } }; export let CameraWebXRARSopOperation = _CameraWebXRARSopOperation; CameraWebXRARSopOperation.DEFAULT_PARAMS = { group: "*", hitTest: WEBXR_FEATURE_STATUS_OPTIONAL_INDEX, lightEstimation: WEBXR_FEATURE_STATUS_OPTIONAL_INDEX, cameraAccess: WEBXR_FEATURE_STATUS_OPTIONAL_INDEX, overrideReferenceSpaceType: false, referenceSpaceType: WEBXR_REFERENCE_SPACE_TYPES.indexOf(DEFAULT_WEBXR_REFERENCE_SPACE_TYPE) }; CameraWebXRARSopOperation.INPUT_CLONED_STATE = InputCloneMode.FROM_NODE;