|
import { RefObject, useEffect, useState } from 'react' |
|
import assets from '../assets' |
|
import { CreateTemplateBody } from '../body' |
|
import { GetLoading } from '../components/Loading' |
|
import { BodyEditor } from '../editor' |
|
import i18n, { LanguageMapping } from '../i18n' |
|
import { LoadFoot, LoadHand } from '../models' |
|
|
|
export async function LoadBodyData() { |
|
const loading = GetLoading(500) |
|
loading.show({ title: i18n.t('Downloading Hand Model') }) |
|
await LoadHand(assets['models/hand.fbx']) |
|
loading.show({ title: i18n.t('Downloading Foot Model') }) |
|
await LoadFoot(assets['models/foot.fbx']) |
|
loading.hide() |
|
CreateTemplateBody() |
|
} |
|
|
|
export function useBodyEditor( |
|
canvasRef: RefObject<HTMLCanvasElement>, |
|
previewCanvasRef: RefObject<HTMLCanvasElement>, |
|
parent?: RefObject<HTMLDivElement> |
|
) { |
|
const [editor, setEditor] = useState<BodyEditor>() |
|
|
|
useEffect(() => { |
|
const canvas = canvasRef.current |
|
if (!canvas) return |
|
const previewCanvas = previewCanvasRef.current |
|
if (!previewCanvas) return |
|
console.warn('create editor') |
|
|
|
let editor: BodyEditor | null = new BodyEditor({ |
|
canvas, |
|
previewCanvas, |
|
parentElem: parent?.current ?? (document as any), |
|
statsElem: import.meta.env.DEV ? document.body : undefined, |
|
}) |
|
|
|
setEditor(editor) |
|
|
|
const init = async () => { |
|
|
|
|
|
if (editor) { |
|
await LoadBodyData() |
|
editor?.ResetScene() |
|
if (editor?.RestoreScene && location.hash) { |
|
const rawData = decodeURIComponent( |
|
location.hash.replace(/^#/, '') |
|
) |
|
editor?.RestoreScene(rawData) |
|
location.hash = '' |
|
} |
|
} |
|
} |
|
init() |
|
|
|
return () => { |
|
console.warn('disponse') |
|
editor?.disponse() |
|
editor = null |
|
} |
|
}, []) |
|
|
|
return editor |
|
} |
|
|
|
export function useLanguageSelect() { |
|
const [current] = useState( |
|
() => LanguageMapping[i18n.language] ?? 'English' |
|
) |
|
const [R_LanguageMapping] = useState(() => |
|
Object.fromEntries( |
|
Object.entries(LanguageMapping).map(([k, v]) => [v, k]) |
|
) |
|
) |
|
|
|
return { |
|
current, |
|
languagList: [...Object.values(LanguageMapping)], |
|
changeLanguage: (value: string) => { |
|
const lng = R_LanguageMapping[value] |
|
const url = new URL(window.location.href) |
|
|
|
url.searchParams.set('lng', lng) |
|
window.location.assign(url) |
|
}, |
|
} |
|
} |
|
|