Source: objects/BaseModelObject3D.js

import { Utils } from '../common/Utils';
import { Object3D } from './Object3D';
import { EventType } from '../const';
import { MathUtils } from '../math/MathUtils';

/**
 * @class BaseModelObject3D
 * The base model object 3D.
 * @memberof THING
 * @extends THING.Object3D
 */
class BaseModelObject3D extends Object3D {

	constructor(param) {
		super(param);
	}

	hasResource() {
		return true;
	}

	onSetupResource(param) {
		this.onSetupURL(param);

		// Setup components
		const components = param['components'];
		const toolkit = param['toolkit'];
		if (components && toolkit) {
			this.onImportComponents(components, toolkit, param);
		}

		let dynamic = Utils.parseValue(param['dynamic'], false);
		if (!dynamic) {
			let node = this.app.resourceManager.parseModel(this.type, param);
			this.body.setNode(node);

			this.onLoadComplete();
		}
	}

	onLoadResource(options, resolve, reject) {
		let dynamic = Utils.parseValue(options['dynamic'], false);
		if (!dynamic) {
			if (this.hasResource()) {
				let node = this.app.resourceManager.parseModel(this.type, options);
				this.body.setNode(node);

				resolve();
			}
			// Here we do not proivde any URL, so let it to be loaded state
			else {
				resolve();
			}
		}
		else {
			resolve();
		}
	}

	onCreateBodyNode(type) {
		return Utils.createObject('Node');
	}

	onCollectMesh() {
		// All base model object 3D resource creation is dynamic, so skip to collect mesh when export
		return false;
	}

	_processBodyWithoutPivot(callback) {
		let pivot = this.pivot;
		let isEqualPivot = MathUtils.equalsVector3(pivot, [0.5, 0.5, 0.5]);
		if (!isEqualPivot) {
			this.pivot = null;
		}

		callback(this.body);

		if (!isEqualPivot) {
			this.pivot = pivot;
		}
	}

	/**
	 * Check whether it's BaseModelObject3D type or inherit from it.
	 * @type {Boolean}
	 * @example
	 * let obj = new THING.BaseModelObject3D();
	 * let ret = obj.isBaseModelObject3D;
	 * // @expect(ret == true)
	 */
	get isBaseModelObject3D() {
		return true;
	}

}

export { BaseModelObject3D }