Source: actor/single_block_instance.js

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 }