UNPKG

polygonjs-engine

Version:

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

118 lines (104 loc) 3.43 kB
import {BaseSopOperation} from './_Base'; import {DefaultOperationParams} from '../_Base'; import {InputCloneMode} from '../../../engine/poly/InputCloneMode'; import {CSS2DObject} from '../../../modules/core/objects/CSS2DObject'; import {CoreString} from '../../../core/String'; import {CoreGroup} from '../../geometry/Group'; import {CoreType} from '../../Type'; interface Css2DObjectParams { id: string; className: string; html: string; } const ATTRIBUTE_NAME = { id: 'id', className: 'class', html: 'html', }; interface Css2DObjectSopParams extends DefaultOperationParams { useIdAttrib: boolean; id: string; useClassAttrib: boolean; className: string; useHtmlAttrib: boolean; html: string; copyAttributes: boolean; attributesToCopy: string; } export class Css2DObjectSopOperation extends BaseSopOperation { static readonly DEFAULT_PARAMS: Css2DObjectSopParams = { useIdAttrib: false, id: 'my_css_object', useClassAttrib: false, className: 'css2DObject', useHtmlAttrib: false, html: '<div>default html</div>', copyAttributes: false, attributesToCopy: '', }; static readonly INPUT_CLONED_STATE = InputCloneMode.FROM_NODE; static type(): Readonly<'css2DObject'> { return 'css2DObject'; } cook(input_contents: CoreGroup[], params: Css2DObjectSopParams) { const core_group = input_contents[0]; if (core_group) { const objects = this._create_objects_from_input_points(core_group, params); return this.create_core_group_from_objects(objects); } else { const object = this._create_object_from_scratch(params); return this.create_core_group_from_objects([object]); } } private _create_objects_from_input_points(core_group: CoreGroup, params: Css2DObjectSopParams) { const points = core_group.points(); const objects: CSS2DObject[] = []; for (let point of points) { const id = params.useIdAttrib ? (point.attribValue(ATTRIBUTE_NAME.id) as string) : params.className; const className = params.useClassAttrib ? (point.attribValue(ATTRIBUTE_NAME.className) as string) : params.className; const html = params.useHtmlAttrib ? (point.attribValue(ATTRIBUTE_NAME.html) as string) : params.html; const object = Css2DObjectSopOperation.create_css_object({ id, className, html, }); const element = object.element; if (params.copyAttributes) { const attrib_names = CoreString.attribNames(params.attributesToCopy); for (let attrib_name of attrib_names) { const attrib_value = point.attribValue(attrib_name); if (CoreType.isString(attrib_value)) { element.setAttribute(attrib_name, attrib_value); } else { if (CoreType.isNumber(attrib_value)) { element.setAttribute(attrib_name, `${attrib_value}`); } } } } object.position.copy(point.position()); object.updateMatrix(); objects.push(object); } return objects; } private _create_object_from_scratch(params: Css2DObjectSopParams) { const object = Css2DObjectSopOperation.create_css_object({ id: params.id, className: params.className, html: params.html, }); return object; } private static create_css_object(params: Css2DObjectParams) { const element = document.createElement('div'); element.id = params.id; element.className = params.className; element.innerHTML = params.html; const object = new CSS2DObject(element); object.matrixAutoUpdate = false; return object; } }