55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
import { create } from 'zustand';
|
|
|
|
export type MappingMode = 'imported' | 'planar' | 'box' | 'cylindrical' | 'triplanar';
|
|
|
|
export interface UVTransforms {
|
|
scale: [number, number];
|
|
repeat: [number, number];
|
|
offset: [number, number];
|
|
rotation: number;
|
|
}
|
|
|
|
export interface TriplanarTransforms {
|
|
scale: number;
|
|
blendSharpness: number;
|
|
rotation: [number, number, number];
|
|
worldSpace: boolean;
|
|
}
|
|
|
|
interface ConfiguratorState {
|
|
mappingMode: MappingMode;
|
|
uvTransforms: UVTransforms;
|
|
triplanarTransforms: TriplanarTransforms;
|
|
projectionAxis: 'x' | 'y' | 'z';
|
|
|
|
// Actions
|
|
setMappingMode: (mode: MappingMode) => void;
|
|
setUVTransforms: (transforms: Partial<UVTransforms>) => void;
|
|
setTriplanarTransforms: (transforms: Partial<TriplanarTransforms>) => void;
|
|
setProjectionAxis: (axis: 'x' | 'y' | 'z') => void;
|
|
}
|
|
|
|
export const useConfiguratorStore = create<ConfiguratorState>((set) => ({
|
|
mappingMode: 'imported',
|
|
projectionAxis: 'z',
|
|
uvTransforms: {
|
|
scale: [1, 1],
|
|
repeat: [1, 1],
|
|
offset: [0, 0],
|
|
rotation: 0,
|
|
},
|
|
triplanarTransforms: {
|
|
scale: 1,
|
|
blendSharpness: 5.0,
|
|
rotation: [0, 0, 0],
|
|
worldSpace: false,
|
|
},
|
|
|
|
setMappingMode: (mode) => set({ mappingMode: mode }),
|
|
setUVTransforms: (transforms) =>
|
|
set((state) => ({ uvTransforms: { ...state.uvTransforms, ...transforms } })),
|
|
setTriplanarTransforms: (transforms) =>
|
|
set((state) => ({ triplanarTransforms: { ...state.triplanarTransforms, ...transforms } })),
|
|
setProjectionAxis: (axis) => set({ projectionAxis: axis }),
|
|
}));
|