UNPKG

@polygonjs/polygonjs

Version:

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

182 lines (169 loc) 5.77 kB
import {Mesh, Object3D, Quaternion, Vector3} from 'three'; import {ObjectNamedFunction1, ObjectNamedFunction2} from './_Base'; import {getObjectPropertyRef, PropertyType} from '../../core/reactivity/ObjectPropertyReactivity'; import {dummyReadRefVal} from '../../core/reactivity/CoreReactivity'; import {_matchArrayLength} from './_ArrayUtils'; import {getObjectChildrenCountRef} from '../../core/reactivity/ObjectHierarchyReactivity'; // // // Single Object // // export class getObjectProperty extends ObjectNamedFunction1<[string]> { static override type() { return 'getObjectProperty'; } func<K extends keyof PropertyType>(object3D: Object3D, propertyName: K): PropertyType[K] { dummyReadRefVal(getObjectPropertyRef(object3D, propertyName).value); return (object3D as Mesh)[propertyName] as PropertyType[K]; } } export class getObjectWorldPosition extends ObjectNamedFunction1<[Vector3]> { static override type() { return 'getObjectWorldPosition'; } func(object3D: Object3D, target: Vector3): Vector3 { // this can't just depend on the matrix, // so we need to depend on time for now dummyReadRefVal(this.timeController.timeUniform().value); // object3D.getWorldPosition(target); return target; } } export class object3DLocalToWorld extends ObjectNamedFunction2<[Vector3, Vector3]> { static override type() { return 'object3DLocalToWorld'; } func(object3D: Object3D, position: Vector3, target: Vector3): Vector3 { // this can't just depend on the matrix, // so we need to depend on time for now dummyReadRefVal(this.timeController.timeUniform().value); // target.copy(position); object3D.localToWorld(target); return target; } } export class object3DWorldToLocal extends ObjectNamedFunction2<[Vector3, Vector3]> { static override type() { return 'object3DWorldToLocal'; } func(object3D: Object3D, position: Vector3, target: Vector3): Vector3 { // this can't just depend on the matrix, // so we need to depend on time for now dummyReadRefVal(this.timeController.timeUniform().value); // target.copy(position); object3D.worldToLocal(target); return target; } } // // // Generics // // function _getChildrenPropertiesVector3(propertyName: 'position' | 'scale' | 'up') { return function (object3D: Object3D, targets: Vector3[]): Vector3[] { dummyReadRefVal(getObjectChildrenCountRef(object3D).value); _matchArrayLength(object3D.children, targets, () => new Vector3()); let i = 0; const children = object3D.children; for (let child of children) { dummyReadRefVal(getObjectPropertyRef(child, propertyName).value); targets[i].copy(child[propertyName]); i++; } return targets; }; } function _getChildrenPropertiesQuaternion(propertyName: 'quaternion') { return function (object3D: Object3D, targets: Quaternion[]): Quaternion[] { dummyReadRefVal(getObjectChildrenCountRef(object3D).value); _matchArrayLength(object3D.children, targets, () => new Quaternion()); let i = 0; const children = object3D.children; for (let child of children) { dummyReadRefVal(getObjectPropertyRef(child, propertyName).value); targets[i].copy(child[propertyName]); i++; } return targets; }; } function _getChildrenPropertiesBoolean( propertyName: 'visible' | 'matrixAutoUpdate' | 'castShadow' | 'receiveShadow' | 'frustumCulled' ) { return function (object3D: Object3D, targets: boolean[]): boolean[] { dummyReadRefVal(getObjectChildrenCountRef(object3D).value); _matchArrayLength(object3D.children, targets, () => false); let i = 0; const children = object3D.children; for (let child of children) { dummyReadRefVal(getObjectPropertyRef(child, propertyName).value); targets[i] = child[propertyName]; i++; } return targets; }; } // // // Children // // export class getChildrenPropertiesPosition extends ObjectNamedFunction1<[Array<Vector3>]> { static override type() { return 'getChildrenPropertiesPosition'; } func = _getChildrenPropertiesVector3('position'); } export class getChildrenPropertiesQuaternion extends ObjectNamedFunction1<[Array<Quaternion>]> { static override type() { return 'getChildrenPropertiesQuaternion'; } func = _getChildrenPropertiesQuaternion('quaternion'); } export class getChildrenPropertiesScale extends ObjectNamedFunction1<[Array<Vector3>]> { static override type() { return 'getChildrenPropertiesScale'; } func = _getChildrenPropertiesVector3('scale'); } export class getChildrenPropertiesUp extends ObjectNamedFunction1<[Array<Vector3>]> { static override type() { return 'getChildrenPropertiesUp'; } func = _getChildrenPropertiesVector3('up'); } export class getChildrenPropertiesVisible extends ObjectNamedFunction1<[Array<boolean>]> { static override type() { return 'getChildrenPropertiesVisible'; } func = _getChildrenPropertiesBoolean('visible'); } export class getChildrenPropertiesMatrixAutoUpdate extends ObjectNamedFunction1<[Array<boolean>]> { static override type() { return 'getChildrenPropertiesMatrixAutoUpdate'; } func = _getChildrenPropertiesBoolean('matrixAutoUpdate'); } export class getChildrenPropertiesCastShadow extends ObjectNamedFunction1<[Array<boolean>]> { static override type() { return 'getChildrenPropertiesCastShadow'; } func = _getChildrenPropertiesBoolean('castShadow'); } export class getChildrenPropertiesReceiveShadow extends ObjectNamedFunction1<[Array<boolean>]> { static override type() { return 'getChildrenPropertiesReceiveShadow'; } func = _getChildrenPropertiesBoolean('receiveShadow'); } export class getChildrenPropertiesFrustumCulled extends ObjectNamedFunction1<[Array<boolean>]> { static override type() { return 'getChildrenPropertiesFrustumCulled'; } func = _getChildrenPropertiesBoolean('frustumCulled'); }