// Apoio do Produto3D: cor hex, tabelas de forma/material e a interpolação da câmera orbital. import {COR, trilha} from '../base'; import type {V3} from './modelos'; export type ChaveCamera = {em: number; orbita?: number; elevacao?: number; distancia?: number; alvo?: V3}; export const hexRgb = (h: string): V3 => { const s = h.replace('#', ''); const v = parseInt(s.length === 3 ? s.split('').map((c) => c + c).join('') : s, 16); return [((v >> 16) & 255) / 255, ((v >> 8) & 255) / 255, (v & 255) / 255]; }; export const TIPOS = {caixa: 1, capsula: 2, elipsoide: 3, cilindro: 4, anel: 5} as const; export const MATS = {cetim: 0, metal: 1, grafite: 2, brilho: 3} as const; export const MAT_COR = {cetim: COR.produto, metal: COR.metal, grafite: COR.grafite, brilho: COR.produto}; /** a câmera no quadro f, interpolando cada valor entre as chaves que o definem */ export const camera = (f: number, chaves: ChaveCamera[]) => { const tr = (k: 'orbita' | 'elevacao' | 'distancia', p: number) => trilha(f, chaves.filter((c) => c[k] !== undefined).map((c) => [c.em, c[k] as number] as [number, number]), p); const alvos = chaves.filter((c) => c.alvo); const alvo: V3 = [0, 1, 2].map((i) => trilha(f, alvos.map((c) => [c.em, c.alvo![i]] as [number, number]), [0, 0.2, 0][i])) as V3; return {orbita: tr('orbita', 0), elevacao: tr('elevacao', 8), distancia: tr('distancia', 7), alvo}; };