UNPKG

@polygonjs/polygonjs

Version:

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

119 lines (108 loc) 3.97 kB
import {BaseSopOperation} from './_Base'; import {CoreGroup} from '../../../core/geometry/Group'; import {InputCloneMode} from '../../poly/InputCloneMode'; import {DefaultOperationParams} from '../../../core/operations/_Base'; import {CameraSopNodeType} from '../../poly/NodeContext'; import {PolyScene} from '../../scene/PolyScene'; import {ThreejsCoreObject} from '../../../core/geometry/modules/three/ThreejsCoreObject'; import {CameraAttribute} from '../../../core/camera/CoreCamera'; import { MarkerTrackingTransformMode, MARKER_TRACKING_TRANSFORM_MODES, MarkerTrackingSourceMode, MARKER_TRACKING_SOURCE_MODES, } from '../../../core/webXR/markerTracking/Common'; import {Poly} from '../../Poly'; import {CoreObjectType, ObjectContent} from '../../../core/geometry/ObjectContent'; import {CoreMask} from '../../../core/geometry/Mask'; interface CameraWebXRARMarkerTrackingSopParams extends DefaultOperationParams { group: string; sourceMode: number; sourceUrl: string; transformMode: number; smooth: boolean; smoothCount: number; barCodeType: string; barCodeValue: number; } interface UpdateObjectOptions { scene: PolyScene; objects: ObjectContent<CoreObjectType>[]; params: CameraWebXRARMarkerTrackingSopParams; active: boolean; } export class CameraWebXRARMarkerTrackingSopOperation extends BaseSopOperation { static override readonly DEFAULT_PARAMS: CameraWebXRARMarkerTrackingSopParams = { group: '', sourceMode: MARKER_TRACKING_SOURCE_MODES.indexOf(MarkerTrackingSourceMode.WEBCAM), sourceUrl: '', transformMode: MARKER_TRACKING_TRANSFORM_MODES.indexOf(MarkerTrackingTransformMode.CAMERA), smooth: true, smoothCount: 5, barCodeType: Poly.thirdParty.markerTracking().barCodeTypes()[0] || '', barCodeValue: 0, }; static override readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE; static override type(): Readonly<CameraSopNodeType.WEBXR_AR_MARKER_TRACKING> { return CameraSopNodeType.WEBXR_AR_MARKER_TRACKING; } override cook(inputCoreGroups: CoreGroup[], params: CameraWebXRARMarkerTrackingSopParams) { const coreGroup = inputCoreGroups[0]; const objects = CoreMask.filterObjects(coreGroup, { group: params.group, }); if (Poly.thirdParty.markerTracking().hasController()) { if (this._node) { CameraWebXRARMarkerTrackingSopOperation.updateObject({ scene: this._node.scene(), objects, params, active: true, }); } } else { this._node?.states.error.set( 'This node requires the plugin-marker-tracking. See [https://github.com/polygonjs/plugin-marker-tracking](https://github.com/polygonjs/plugin-marker-tracking)' ); } return coreGroup; } static updateObject(options: UpdateObjectOptions) { const {objects, params, active} = options; for (let object of objects) { ThreejsCoreObject.addAttribute(object, CameraAttribute.WEBXR_AR_MARKER_TRACKING, active); // source const sourceMode = MARKER_TRACKING_SOURCE_MODES[params.sourceMode]; ThreejsCoreObject.addAttribute(object, CameraAttribute.WEBXR_AR_MARKER_TRACKING_SOURCE_MODE, sourceMode); ThreejsCoreObject.addAttribute( object, CameraAttribute.WEBXR_AR_MARKER_TRACKING_SOURCE_URL, params.sourceUrl ); // transform const transformMode = MARKER_TRACKING_TRANSFORM_MODES[params.transformMode]; ThreejsCoreObject.addAttribute( object, CameraAttribute.WEBXR_AR_MARKER_TRACKING_TRANSFORM_MODE, transformMode ); // smooth ThreejsCoreObject.addAttribute(object, CameraAttribute.WEBXR_AR_MARKER_TRACKING_SMOOTH, params.smooth); ThreejsCoreObject.addAttribute( object, CameraAttribute.WEBXR_AR_MARKER_TRACKING_SMOOTH_COUNT, params.smoothCount ); ThreejsCoreObject.addAttribute( object, CameraAttribute.WEBXR_AR_MARKER_TRACKING_BAR_CODE_TYPE, params.barCodeType ); ThreejsCoreObject.addAttribute( object, CameraAttribute.WEBXR_AR_MARKER_TRACKING_BAR_CODE_VALUE, params.barCodeValue ); } } }