import { Reporter } from '../reporter/reporter.js';
import { Vector3, Quaternion } from '../../node_modules/three/build/three.module.js';
import { checkPropTypes } from '../lib.js';
import { Actor } from './actor.js';
import { BlockInstance } from '../configurator/block_instance.js';
import { ComponentLoader } from '../package/loader/component_loader.js';
import { Component } from '../component/component.js';
/**
* Single block that can be placed in the scene
* @extends Actor
*/
class SingleBlockInstance extends Actor {
/**
* @param {Reporter} reporter
* @param {Object} settings
* @param {UUID} [settings.id]
* @param {BlockInstance} settings.blockInstance
* @param {ComponentLoader} settings.loader
* @param {Vector3} [settings.position]
* @param {Quaternion} [settings.quaternion]
*/
constructor(reporter, settings) {
super(reporter, settings);
checkPropTypes(
settings,
{
blockInstance: BlockInstance,
loader: ComponentLoader
},
{
position: Vector3,
quaternion: Quaternion,
}
);
this.blockInstance = settings.blockInstance;
this.block = settings.blockInstance.block;
this.blockInstance
.build({ componentLoader: settings.loader })
.then(() => {
this.updateBody(settings.blockInstance.content.main.medium);
if (settings.position) {
this.body.position.copy(settings.position);
}
if (settings.quaternion) {
this.body.quaternion.copy(settings.quaternion);
}
});
this._stateRegister = [
{ position: this.body.position.clone(), quaternion: this.body.quaternion.clone() }
];
}
toJSON() {
return {
block: this.block.id,
position: Component.unlink( this.body.position ),
quaternion: Component.unlink( this.body.quaternion )
}
}
/** @param {Object} selectedState */
async onStateCursorMoved(selectedState) {
// await this.updateBody( ... );
}
// when dropped somewhere, addState
}
export { SingleBlockInstance }