| import * as THREE from 'three'; | 
| import { REAL_COMPARE_MAP_SCALE, REAL_COMPARE_MAP_OFFSET_X, REAL_COMPARE_MAP_OFFSET_Z } from '../config/setting' | 
|   | 
| export const isNullOfUndefined = (param) => { | 
|     if (null === param || undefined === param) { | 
|         return true; | 
|     } else { | 
|         return false; | 
|     } | 
| } | 
|   | 
| export const rotationToNum = (rotation) => { | 
|     let res = rotation * 180 / Math.PI; | 
|     if (res < 0) { | 
|         res += 360; | 
|     } else if (res > 360) { | 
|         res -= 360; | 
|     } | 
|     return res; | 
| } | 
|   | 
| export const rotationParseNum = (num) => { | 
|     const normalizedDegrees = positiveAngle(num); | 
|     return normalizedDegrees * Math.PI / 180; | 
| } | 
|   | 
| export const minDiffTheta = (originTheta, targetTheta) => { | 
|     return (targetTheta - originTheta > 180) ? targetTheta - 360 : targetTheta; | 
| } | 
|   | 
| export const positiveAngle = (angle) => { | 
|     return ((angle % 360) + 360) % 360; | 
| } | 
|   | 
| export const normalizeAngle = (angle) => { | 
|     let newAngle = angle % 360; | 
|   | 
|     if (newAngle < -180) { | 
|         newAngle += 360; | 
|     } else if (newAngle > 180) { | 
|         newAngle -= 360; | 
|     } | 
|     return newAngle; | 
| } | 
|   | 
| export const calculateMappedPosition = (realPos) => { | 
|     return [ | 
|         realPos[0] * REAL_COMPARE_MAP_SCALE + REAL_COMPARE_MAP_OFFSET_X, | 
|         realPos[1], | 
|         realPos[2] * REAL_COMPARE_MAP_SCALE + REAL_COMPARE_MAP_OFFSET_Z | 
|     ]; | 
| }; | 
|   | 
| export const setShadow = (obj) => { | 
|     obj.castShadow = true; | 
|     obj.receiveShadow = true; | 
|   | 
|     if (obj.children) { | 
|         obj.children.forEach((child) => { | 
|             setShadow(child); | 
|         }); | 
|     } | 
| }; | 
|   | 
| export const setColor = (obj, color = 0x4680BF) => { | 
|     if (obj.material) { | 
|         obj.material.color.set(color); | 
|     } | 
|     if (obj.children) { | 
|         obj.children.forEach((child) => { | 
|             setColor(child, color); | 
|         }); | 
|     } | 
| }; | 
|   | 
| export const deepEqual = (obj1, obj2) => { | 
|     if (obj1 === obj2) { | 
|         return true; | 
|     } | 
|     if (typeof obj1 !== "object" || obj1 === null || typeof obj2 !== "object" || obj2 === null) { | 
|         return false; | 
|     } | 
|     var keys1 = Object.keys(obj1); | 
|     var keys2 = Object.keys(obj2); | 
|     if (keys1.length !== keys2.length) { | 
|         return false; | 
|     } | 
|     for (var key of keys1) { | 
|         if (!keys2.includes(key) || !deepEqual(obj1[key], obj2[key])) { | 
|             return false; | 
|         } | 
|     } | 
|     return true; | 
| } | 
|   | 
| export const parseLocNo = (locNo) => { | 
|     if (!locNo || typeof locNo !== 'string') { | 
|         return null; | 
|     } | 
|     const locParseArr = locNo.split('-'); | 
|     return { | 
|         row: Number(locParseArr?.[0]), | 
|         bay: Number(locParseArr?.[1]), | 
|         lev: Number(locParseArr?.[2]), | 
|     } | 
| } | 
|   | 
| export const generateLocNo = (row, bay, lev) => { | 
|     return row + '-' + bay + '-' + lev; | 
| } |