useTransformStore.js 3.56 KB
import { defineStore } from 'pinia';
import { reactive, ref, nextTick } from 'vue';

export const useTransformStore = defineStore('transform', () => {
    const sticktToBaseChecked = ref(true);
    const rotateAroundCenterChecked = ref(true);

    const isTranslationReset = ref(false);
    const isRotationReset = ref(false);
    const isAllReset = ref(false);

    const translationItems = reactive({
        x: 0,
        y: 0,
        z: 0
    });
    const rotationItems = reactive({
        x: 0,
        y: 0,
        z: 0
    });

    const oldTranslationItems = reactive({ ...translationItems });
    const oldRotationItems = reactive({ ...rotationItems });

    const setTranslationValue = (x, y, z) => {
        translationItems.x = x;
        translationItems.y = y;
        translationItems.z = z;
    };

    const setRotationValue = (x, y, z) => {
        rotationItems.x = x;
        rotationItems.y = y;
        rotationItems.z = z;
    };

    const transformFromModal = (newVal, oldVal, key, type) => {
        if (newVal !== undefined) {
            if (type === 'rotate') {
                nextTick(() => {
                    if (newVal >= 360) {
                        rotationItems[key] = newVal % 360;
                    } else if (newVal <= -360) {
                        rotationItems[key] = newVal % -360;
                    }
                });
                oldRotationItems.x = rotationItems.x;
                oldRotationItems.y = rotationItems.y;
                oldRotationItems.z = rotationItems.z;
                oldRotationItems[key] = oldVal;
            }
            if (type === 'translate') {
                oldTranslationItems.x = translationItems.x;
                oldTranslationItems.y = translationItems.y;
                oldTranslationItems.z = translationItems.z;
                oldTranslationItems[key] = oldVal;
            }
        }
    };

    const setInit = () => {
        translationItems.x = 0;
        translationItems.y = 0;
        translationItems.z = 0;
        rotationItems.x = 0;
        rotationItems.y = 0;
        rotationItems.z = 0;

        oldTranslationItems.x = 0;
        oldTranslationItems.y = 0;
        oldTranslationItems.z = 0;
        oldRotationItems.x = 0;
        oldRotationItems.y = 0;
        oldRotationItems.z = 0;

        sticktToBaseChecked.value = false;
    };

    const setReset = (/* key */) => {
        /* if (key === 'translate') {
            translationItems.x = 0;
            translationItems.y = 0;
            translationItems.z = 0;
            isTranslationReset.value = !isTranslationReset.value;
        } else {
            rotationItems.x = 0;
            rotationItems.y = 0;
            rotationItems.z = 0;
            isRotationReset.value = !isRotationReset.value;
        } */
        translationItems.x = 0;
        translationItems.y = 0;
        translationItems.z = 0;
        rotationItems.x = 0;
        rotationItems.y = 0;
        rotationItems.z = 0;
        isAllReset.value = !isAllReset.value;
    };

    const setRotate = (key, angle) => {
        const old = rotationItems[key];
        rotationItems[key] += angle;
        transformFromModal(rotationItems[key], old, key, 'rotate');
    };

    return {
        sticktToBaseChecked,
        rotateAroundCenterChecked,
        translationItems,
        rotationItems,
        oldTranslationItems,
        oldRotationItems,
        isTranslationReset,
        isRotationReset,
        isAllReset,
        setInit,
        setReset,
        setRotate,
        setTranslationValue,
        setRotationValue,
        transformFromModal
    };
});