@adatechnology/game-vehicles 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/locales/en.json","../src/locales/pt-BR.json","../src/locale.ts","../src/util.ts","../src/legacy-seeds.ts","../src/materials.ts","../src/geometry.ts","../src/context.ts","../src/warp.ts","../src/body.ts","../src/glass.ts","../src/lights.ts","../src/interior.ts","../src/hood.ts","../src/car.ts","../src/trucks.ts","../src/wheels.ts","../src/particles.ts","../src/fluids.ts","../src/glass-damage.ts","../src/impact.ts","../src/explosion.ts","../src/rollover.ts","../src/tick.ts","../src/armor.ts","../src/zone-core.ts","../src/zone-decals.ts","../src/zone-dent.ts","../src/damage-panels.ts","../src/damage-parts.ts","../src/zone-derive.ts","../src/zone-auto.ts","../src/zone-apply.ts","../src/scenarios.ts","../src/ui.ts","../src/lod.ts","../src/damageables.ts","../src/kit.ts","../src/destructible/model.ts","../src/destructible/visual.ts","../src/destructible/clips.ts","../src/destructible/impl.ts","../src/destructible/item.ts"],"sourcesContent":["{\n \"plate\": {\n \"band\": \"BRAZIL\"\n },\n \"parts\": {\n \"tire_front\": \"Front {side} tire\",\n \"tire_rear\": \"Rear {side} tire\",\n \"bike_tire_front\": \"Front tire\",\n \"bike_tire_rear\": \"Rear tire\",\n \"headlight\": \"{Side} headlight\",\n \"taillight\": \"{Side} taillight\",\n \"led_bar\": \"LED bar\",\n \"taillight_bar\": \"Taillight bar\",\n \"hood\": \"Hood\",\n \"engine\": \"Engine\",\n \"engine_electric\": \"Electric motor and inverter\",\n \"radiator\": \"Radiator\",\n \"bumper_front\": \"Front bumper\",\n \"bumper_rear\": \"Rear bumper\",\n \"fuel_tank\": \"Fuel tank\",\n \"diesel_tank\": \"Diesel tank\",\n \"windshield\": \"Windshield\",\n \"rear_window\": \"Rear window\",\n \"window_front\": \"Front window\",\n \"window_rear\": \"Rear window\",\n \"quarter_glass\": \"Rear quarter glass\",\n \"cab_window\": \"Cab window\",\n \"window\": \"Window\",\n \"glass\": \"Glass\",\n \"glass_side\": \"{label} ({side})\",\n \"glass_side_m\": \"{label} ({side})\",\n \"track\": \"{Side} track\"\n },\n \"texts\": {\n \"high_voltage\": \"HIGH VOLTAGE\",\n \"who\": \"whoever is on that side\",\n \"no_effect\": \"\"\n },\n \"blast\": {\n \"lethal\": \"Lethal radius {m} m\",\n \"injury\": \"Injuries up to {m} m\",\n \"tank_explosion\": \"Tank explosion\",\n \"explosion\": \"Explosion\"\n },\n \"zones\": {\n \"windshield\": \"Windshield\",\n \"glass_left\": \"Left side glass\",\n \"glass_right\": \"Right side glass\",\n \"rear_window\": \"Rear window\",\n \"light_bar_front\": \"Front light bar\",\n \"taillight\": \"Taillight\",\n \"light_bar_rear\": \"Taillight bar\",\n \"headlight\": \"{Side} headlight\",\n \"taillight_side\": \"{Side} taillight\",\n \"wheels\": \"Wheels\",\n \"wheels_axle_front\": \"Front axle wheels\",\n \"wheels_axle_rear\": \"Rear axle wheels\",\n \"wheels_axle_n\": \"Axle {n} wheels\",\n \"wheel_front_side\": \"Front {side} wheel\",\n \"wheel_rear_side\": \"Rear {side} wheel\",\n \"wheel_front\": \"Front wheel\",\n \"wheel_rear\": \"Rear wheel\",\n \"bumper_front\": \"Front bumper\",\n \"bumper_rear\": \"Rear bumper\",\n \"hood\": \"Hood\",\n \"fender_front\": \"Front {side} fender\",\n \"door_front\": \"Front {side} door\",\n \"door\": \"{Side} door\",\n \"door_rear\": \"Rear {side} door\",\n \"side_rear\": \"Rear {side} side panel\",\n \"roof\": \"Pillars and roof\",\n \"cargo_bed\": \"Cargo bed\",\n \"trunk_lid\": \"Trunk lid\",\n \"tail_lid\": \"Rear lid\",\n \"underbody\": \"Underbody and suspension\",\n \"engine\": \"Engine\",\n \"engine_electric\": \"Electric motor\",\n \"radiator\": \"Radiator\",\n \"fuel_tank\": \"Fuel tank\",\n \"battery\": \"Battery\",\n \"diesel_tank\": \"Diesel tank\",\n \"fairing\": \"Fairing and headlight\",\n \"handlebar_levers\": \"Handlebar and levers\",\n \"tank\": \"Tank\",\n \"seat_rack\": \"Seat and rack\",\n \"handlebar\": \"Handlebar\",\n \"frame\": \"Frame\",\n \"seat_tail\": \"Seat and tail\",\n \"exhaust\": \"Exhaust\",\n \"grille_front\": \"Grille and front\",\n \"engine_hood\": \"Engine hood\",\n \"fender_rear\": \"Rear {side} fender\",\n \"operator_station\": \"Operator station\",\n \"bus_front\": \"Bus front\",\n \"cab_front\": \"Cab (front)\",\n \"bus_front_side\": \"Front, {side} side\",\n \"cab_side\": \"Cab, {side} side\",\n \"body_saloon\": \"Saloon\",\n \"body_tank\": \"Tank\",\n \"body_body\": \"Body\",\n \"body_box\": \"Box\",\n \"body_side\": \"{label} ({side} side)\",\n \"body_rear\": \"{label} (rear)\",\n \"chassis\": \"Chassis\",\n \"armor_front\": \"Front armor\",\n \"armor_side\": \"{Side} armor\",\n \"armor_rear\": \"Rear armor\",\n \"cannon\": \"Cannon\",\n \"weapon\": \"Weapon\",\n \"turret\": \"Roof and turret\",\n \"track\": \"{Side} track\",\n \"wheels_side\": \"{Side} side wheels\",\n \"bow\": \"Bow\",\n \"port_side\": \"Port side\",\n \"starboard_side\": \"Starboard side\",\n \"stern\": \"Stern\",\n \"deck\": \"Deck and cabin\",\n \"outboard_engine\": \"Outboard engine\",\n \"nose_propeller\": \"Nose and propeller\",\n \"nose_engine\": \"Nose and engine\",\n \"cabin_glass\": \"Cabin and glass\",\n \"wing\": \"{Side} wing\",\n \"rear_fuselage\": \"Rear fuselage\",\n \"tail\": \"Tail\",\n \"landing_gear\": \"Landing gear\",\n \"wing_tanks\": \"Tanks (in the wings)\",\n \"nose_bubble\": \"Nose and bubble\",\n \"cabin\": \"Cabin\",\n \"tail_cone\": \"Tail cone\",\n \"main_rotor\": \"Main rotor\",\n \"tail_rotor\": \"Tail rotor\",\n \"skids\": \"Skids\",\n \"engine_transmission\": \"Engine and transmission\",\n \"front\": \"Front\",\n \"side\": \"{Side} side\",\n \"rear\": \"Rear\",\n \"top\": \"Roof\"\n },\n \"who\": {\n \"front_seats\": \"whoever rides in front\",\n \"rear_seats\": \"whoever rides in the back\",\n \"driver\": \"the driver\",\n \"passenger\": \"the front passenger\",\n \"rear_left\": \"whoever rides in the back on the left\",\n \"rear_right\": \"whoever rides in the back on the right\",\n \"left_side\": \"whoever is on the left side\",\n \"right_side\": \"whoever is on the right side\",\n \"cargo\": \"the cargo\",\n \"tractor_driver\": \"the tractor driver\",\n \"boarding_door\": \"the boarding door\",\n \"helper\": \"the helper\",\n \"seated_side\": \"whoever is seated on that side\",\n \"back_seats\": \"whoever rides at the back\",\n \"crew_side\": \"the crew on that side\",\n \"boat_side\": \"whoever is on that side of the boat\",\n \"pilot\": \"the pilot\",\n \"passengers\": \"the passengers\"\n },\n \"bands\": {\n \"intact\": \"Intact\",\n \"scratched\": \"Scratched\",\n \"dented\": \"Dented\",\n \"destroyed\": \"Destroyed\",\n \"torn_off\": \"Torn off\"\n },\n \"groups\": {\n \"default\": \"Vehicles\"\n },\n \"sides\": {\n \"left\": \"left\",\n \"right\": \"right\",\n \"leftM\": \"left\",\n \"rightM\": \"right\"\n },\n \"matchers\": {\n \"windshield\": \"windshield\",\n \"rear\": \"rear\",\n \"side\": \"left|right\",\n \"tank\": \"tank|tanker\",\n \"diesel\": \"diesel\",\n \"fuel\": \"gasoline|petrol|ethanol|alcohol|fuel\",\n \"glass_id\": \"glass|window|windshield|rear_window\"\n },\n \"ui\": {\n \"front\": \"▲ FRONT\",\n \"inside\": \"Inside\",\n \"aria\": \"Damage map seen from above, front up\",\n \"noZones\": \"This vehicle has no zones.\",\n \"health\": \"Overall health\"\n },\n \"mechanics\": {\n \"chassis\": \"Chassis frame\",\n \"battery\": \"Battery\",\n \"alternator\": \"Alternator\",\n \"gearbox\": \"Gearbox\",\n \"brakes\": \"Brakes\",\n \"steering\": \"Steering\",\n \"shock_absorbers\": \"Shock absorbers\",\n \"tow_hitch\": \"Tow hitch\",\n \"oil_pan\": \"Oil pan\",\n \"mirror\": \"{Side} mirror\",\n \"tyre\": \"{zone} tyre\",\n \"pillar_a\": \"{Side} A pillar\",\n \"pillar_c\": \"{Side} C pillar\",\n \"engine\": \"Engine\",\n \"radiator\": \"Radiator\",\n \"fuel_tank\": \"Fuel tank\"\n }\n}\n","{\n \"plate\": {\n \"band\": \"BRASIL\"\n },\n \"parts\": {\n \"tire_front\": \"Pneu dianteiro {sideM}\",\n \"tire_rear\": \"Pneu traseiro {sideM}\",\n \"bike_tire_front\": \"Pneu dianteiro\",\n \"bike_tire_rear\": \"Pneu traseiro\",\n \"headlight\": \"Farol {sideM}\",\n \"taillight\": \"Lanterna {side}\",\n \"led_bar\": \"Barra de LED\",\n \"taillight_bar\": \"Barra de lanterna\",\n \"hood\": \"Capô\",\n \"engine\": \"Motor\",\n \"engine_electric\": \"Motor elétrico e inversor\",\n \"radiator\": \"Radiador\",\n \"bumper_front\": \"Para-choque dianteiro\",\n \"bumper_rear\": \"Para-choque traseiro\",\n \"fuel_tank\": \"Tanque de combustível\",\n \"diesel_tank\": \"Tanque de diesel\",\n \"windshield\": \"Para-brisa\",\n \"rear_window\": \"Vidro traseiro\",\n \"window_front\": \"Janela dianteira\",\n \"window_rear\": \"Janela traseira\",\n \"quarter_glass\": \"Vidro lateral traseiro\",\n \"cab_window\": \"Janela da cabine\",\n \"window\": \"Janela\",\n \"glass\": \"Vidro\",\n \"glass_side\": \"{label} {side}\",\n \"glass_side_m\": \"{label} {sideM}\",\n \"track\": \"Lagarta {side}\"\n },\n \"texts\": {\n \"high_voltage\": \"ALTA TENSÃO\",\n \"who\": \"quem está desse lado\",\n \"no_effect\": \"\"\n },\n \"blast\": {\n \"lethal\": \"Raio letal {m} m\",\n \"injury\": \"Ferimentos até {m} m\",\n \"tank_explosion\": \"Explosão do tanque\",\n \"explosion\": \"Explosão\"\n },\n \"zones\": {\n \"windshield\": \"Para-brisa\",\n \"glass_left\": \"Vidros do lado esquerdo\",\n \"glass_right\": \"Vidros do lado direito\",\n \"rear_window\": \"Vidro traseiro\",\n \"light_bar_front\": \"Barra de luz dianteira\",\n \"taillight\": \"Lanterna\",\n \"light_bar_rear\": \"Barra de lanterna\",\n \"headlight\": \"Farol {sideM}\",\n \"taillight_side\": \"Lanterna {side}\",\n \"wheels\": \"Rodas\",\n \"wheels_axle_front\": \"Rodas do eixo dianteiro\",\n \"wheels_axle_rear\": \"Rodas do eixo traseiro\",\n \"wheels_axle_n\": \"Rodas do eixo {n}\",\n \"wheel_front_side\": \"Roda dianteira {side}\",\n \"wheel_rear_side\": \"Roda traseira {side}\",\n \"wheel_front\": \"Roda dianteira\",\n \"wheel_rear\": \"Roda traseira\",\n \"bumper_front\": \"Para-choque dianteiro\",\n \"bumper_rear\": \"Para-choque traseiro\",\n \"hood\": \"Capô\",\n \"fender_front\": \"Paralama dianteiro {sideM}\",\n \"door_front\": \"Porta dianteira {side}\",\n \"door\": \"Porta {side}\",\n \"door_rear\": \"Porta traseira {side}\",\n \"side_rear\": \"Lateral traseira {side}\",\n \"roof\": \"Colunas e teto\",\n \"cargo_bed\": \"Caçamba\",\n \"trunk_lid\": \"Tampa do porta-malas\",\n \"tail_lid\": \"Tampa traseira\",\n \"underbody\": \"Assoalho e suspensão\",\n \"engine\": \"Motor\",\n \"engine_electric\": \"Motor elétrico\",\n \"radiator\": \"Radiador\",\n \"fuel_tank\": \"Tanque de combustível\",\n \"battery\": \"Bateria\",\n \"diesel_tank\": \"Tanque de diesel\",\n \"fairing\": \"Carenagem e farol\",\n \"handlebar_levers\": \"Guidão e manetes\",\n \"tank\": \"Tanque\",\n \"seat_rack\": \"Banco e bagageiro\",\n \"handlebar\": \"Guidão\",\n \"frame\": \"Quadro\",\n \"seat_tail\": \"Banco e rabeta\",\n \"exhaust\": \"Escapamento\",\n \"grille_front\": \"Grade e frente\",\n \"engine_hood\": \"Capô do motor\",\n \"fender_rear\": \"Paralama traseiro {sideM}\",\n \"operator_station\": \"Posto do operador\",\n \"bus_front\": \"Frente do ônibus\",\n \"cab_front\": \"Cabine (frente)\",\n \"bus_front_side\": \"Frente, lado {sideM}\",\n \"cab_side\": \"Cabine, lado {sideM}\",\n \"body_saloon\": \"Salão\",\n \"body_tank\": \"Tanque\",\n \"body_body\": \"Carroceria\",\n \"body_box\": \"Baú\",\n \"body_side\": \"{label} (lado {sideM})\",\n \"body_rear\": \"{label} (traseira)\",\n \"chassis\": \"Chassi\",\n \"armor_front\": \"Blindagem frontal\",\n \"armor_side\": \"Blindagem lateral {side}\",\n \"armor_rear\": \"Blindagem traseira\",\n \"cannon\": \"Canhão\",\n \"weapon\": \"Arma\",\n \"turret\": \"Teto e torre\",\n \"track\": \"Lagarta {side}\",\n \"wheels_side\": \"Rodas do lado {sideM}\",\n \"bow\": \"Proa\",\n \"port_side\": \"Costado de bombordo\",\n \"starboard_side\": \"Costado de boreste\",\n \"stern\": \"Popa\",\n \"deck\": \"Convés e cabine\",\n \"outboard_engine\": \"Motor de popa\",\n \"nose_propeller\": \"Nariz e hélice\",\n \"nose_engine\": \"Nariz e motor\",\n \"cabin_glass\": \"Cabine e vidros\",\n \"wing\": \"Asa {side}\",\n \"rear_fuselage\": \"Fuselagem traseira\",\n \"tail\": \"Cauda\",\n \"landing_gear\": \"Trem de pouso\",\n \"wing_tanks\": \"Tanques (nas asas)\",\n \"nose_bubble\": \"Nariz e bolha\",\n \"cabin\": \"Cabine\",\n \"tail_cone\": \"Cone de cauda\",\n \"main_rotor\": \"Rotor principal\",\n \"tail_rotor\": \"Rotor de cauda\",\n \"skids\": \"Esquis\",\n \"engine_transmission\": \"Motor e transmissão\",\n \"front\": \"Frente\",\n \"side\": \"Lado {sideM}\",\n \"rear\": \"Traseira\",\n \"top\": \"Teto\"\n },\n \"who\": {\n \"front_seats\": \"quem vai na frente\",\n \"rear_seats\": \"quem vai atrás\",\n \"driver\": \"o motorista\",\n \"passenger\": \"o carona\",\n \"rear_left\": \"quem vai atrás à esquerda\",\n \"rear_right\": \"quem vai atrás à direita\",\n \"left_side\": \"quem está do lado esquerdo\",\n \"right_side\": \"quem está do lado direito\",\n \"cargo\": \"a carga\",\n \"tractor_driver\": \"o tratorista\",\n \"boarding_door\": \"a porta de embarque\",\n \"helper\": \"o ajudante\",\n \"seated_side\": \"quem está sentado desse lado\",\n \"back_seats\": \"quem vai no fundo\",\n \"crew_side\": \"a tripulação desse lado\",\n \"boat_side\": \"quem está desse bordo\",\n \"pilot\": \"o piloto\",\n \"passengers\": \"os passageiros\"\n },\n \"bands\": {\n \"intact\": \"Intacto\",\n \"scratched\": \"Arranhado\",\n \"dented\": \"Amassado\",\n \"destroyed\": \"Destruído\",\n \"torn_off\": \"Arrancado\"\n },\n \"groups\": {\n \"default\": \"Veículos\"\n },\n \"sides\": {\n \"left\": \"esquerda\",\n \"right\": \"direita\",\n \"leftM\": \"esquerdo\",\n \"rightM\": \"direito\"\n },\n \"matchers\": {\n \"windshield\": \"para-brisa\",\n \"rear\": \"traseir\",\n \"side\": \"esquerd|direit\",\n \"tank\": \"tanque\",\n \"diesel\": \"diesel\",\n \"fuel\": \"gasolina|etanol|álcool|combust\",\n \"glass_id\": \"glass|window|windshield|rear_window|vidro|janela|para_brisa\"\n },\n \"ui\": {\n \"front\": \"▲ FRENTE\",\n \"inside\": \"Por dentro\",\n \"aria\": \"Mapa de danos visto de cima, frente para cima\",\n \"noZones\": \"Este veículo não tem zonas.\",\n \"health\": \"Saúde geral\"\n },\n \"mechanics\": {\n \"chassis\": \"Chassi\",\n \"battery\": \"Bateria\",\n \"alternator\": \"Alternador\",\n \"gearbox\": \"Caixa de câmbio\",\n \"brakes\": \"Freios\",\n \"steering\": \"Direção\",\n \"shock_absorbers\": \"Amortecedores\",\n \"tow_hitch\": \"Engate de reboque\",\n \"oil_pan\": \"Cárter\",\n \"mirror\": \"Retrovisor {sideM}\",\n \"tyre\": \"Pneu ({zone})\",\n \"pillar_a\": \"Coluna A {sideM}\",\n \"pillar_c\": \"Coluna C {sideM}\",\n \"engine\": \"Motor\",\n \"radiator\": \"Radiador\",\n \"fuel_tank\": \"Tanque de combustível\"\n }\n}\n","import en from './locales/en.json'\nimport ptBR from './locales/pt-BR.json'\n\n/** Every user-visible string of the engine, grouped by area. Missing keys of a locale fall back to English. */\nexport type LocaleStrings = typeof en\n\n/** A locale given by the caller: any subset of {@link LocaleStrings}. */\nexport type PartialLocaleStrings = { [K in keyof LocaleStrings]?: Partial<LocaleStrings[K]> }\n\nconst registry: Record<string, PartialLocaleStrings> = { en, 'pt-BR': ptBR }\n\n/** Registers (or extends) a locale under a code such as `es` or `pt-BR`. Missing keys fall back to English. */\nexport function registerLocale(code: string, strings: PartialLocaleStrings | Record<string, any>): void {\n registry[code] = merge(registry[code] || {}, strings)\n}\n\n/** Codes of the registered locales. */\nexport function listLocales(): string[] {\n return Object.keys(registry)\n}\n\nfunction merge(base: any, extra: any): any {\n const out: any = Array.isArray(base) ? base.slice() : Object.assign({}, base)\n Object.keys(extra || {}).forEach(function (k) {\n const v = extra[k]\n if (v && typeof v === 'object' && !Array.isArray(v)) out[k] = merge(out[k] && typeof out[k] === 'object' ? out[k] : {}, v)\n else if (v !== undefined) out[k] = v\n })\n return out\n}\n\n/** Copies `source` into `target` in place, level by level (the string table of a live kit has to stay the same object). */\nexport function assignDeep(target: any, source: any): any {\n Object.keys(source || {}).forEach(function (k) {\n const v = source[k]\n if (v && typeof v === 'object' && !Array.isArray(v)) target[k] = assignDeep(target[k] && typeof target[k] === 'object' ? target[k] : {}, v)\n else if (v !== undefined) target[k] = v\n })\n return target\n}\n\n/**\n * Resolves a locale to a complete string table.\n * Accepts a registered code (`'pt-BR'`; `'pt'` finds `'pt-BR'`, `'en-US'` finds `'en'`), or a partial table that overrides English.\n */\nexport function resolveStrings(locale?: string | PartialLocaleStrings): LocaleStrings {\n /* English is the base of every locale, including the keys content packs add to it with registerLocale */\n const base = registry.en || en\n if (locale && typeof locale === 'object') return merge(base, locale)\n const code = locale || 'en'\n const hit = findLocale(code)\n return hit ? merge(base, hit) : (merge(base, {}) as LocaleStrings)\n}\n\nfunction findLocale(code: string): PartialLocaleStrings | null {\n if (registry[code]) return registry[code]\n const lower = code.toLowerCase()\n const exact = Object.keys(registry).find((k) => k.toLowerCase() === lower)\n if (exact) return registry[exact]\n const lang = lower.split(/[-_]/)[0]\n const byLang = Object.keys(registry).find((k) => k.toLowerCase().split(/[-_]/)[0] === lang)\n return byLang ? registry[byLang] : null\n}\n\n/** Replaces `{name}` in a template. `{Name}` (capital first letter) capitalises the value of `name`. Unknown names stay as written. */\nexport function format(template: string, vars?: Record<string, unknown>): string {\n if (!vars) return template\n return template.replace(/\\{(\\w+)\\}/g, function (whole, name: string) {\n if (name in vars) return String(vars[name])\n const lower = name.charAt(0).toLowerCase() + name.slice(1)\n if (lower !== name && lower in vars) {\n const v = String(vars[lower])\n return v.charAt(0).toUpperCase() + v.slice(1)\n }\n return whole\n })\n}\n\n/** A function that looks up a dotted key (`'zones.hood'`) and fills in its variables. */\nexport type Translate = (key: string, vars?: Record<string, unknown>) => string\n\n/**\n * Builds the translate function of a string table. The variable `s` (-1 left, +1 right) is expanded to\n * `{side}` (feminine word) and `{sideM}` (masculine word), so one template reads right in languages with grammatical gender.\n */\nexport function createTranslate(strings: LocaleStrings): Translate {\n return function t(key, vars) {\n let cur: any = strings\n for (const part of key.split('.')) {\n cur = cur == null ? undefined : cur[part]\n if (cur === undefined) break\n }\n if (typeof cur !== 'string') return key\n if (vars && typeof vars.s === 'number') {\n const left = vars.s < 0\n vars = Object.assign({ side: strings.sides[left ? 'left' : 'right'], sideM: strings.sides[left ? 'leftM' : 'rightM'] }, vars)\n }\n return format(cur, vars)\n }\n}\n\n/** Regular expressions that recognise a part by its label when no `key` was given. Built from the `matchers` of the string table. */\nexport interface Matchers {\n windshield: RegExp\n rear: RegExp\n side: RegExp\n tank: RegExp\n diesel: RegExp\n fuel: RegExp\n /** Zone ids that already start like a glass id, so no `glass_` prefix is added. */\n glassId: RegExp\n}\n\nexport function createMatchers(strings: LocaleStrings): Matchers {\n const m = strings.matchers\n return {\n windshield: new RegExp(m.windshield, 'i'),\n rear: new RegExp(m.rear, 'i'),\n side: new RegExp(m.side, 'i'),\n tank: new RegExp(m.tank, 'i'),\n diesel: new RegExp(m.diesel, 'i'),\n fuel: new RegExp(m.fuel, 'i'),\n glassId: new RegExp('^(?:' + m.glass_id + ')'),\n }\n}\n","/** Pure helpers shared by every module. They never touch three.js. */\n\n/** Deterministic hash of three numbers to [0, 1). */\nexport function hash(a: number, b: number, c: number): number {\n const h = Math.sin(a * 127.1 + b * 311.7 + c * 74.7) * 43758.5453\n return h - Math.floor(h)\n}\n\nexport function clamp(v: number, a: number, b: number): number {\n return Math.max(a, Math.min(b, v))\n}\n\n/** Smoothstep on [0, 1]. */\nexport function smooth(t: number): number {\n t = clamp(t, 0, 1)\n return t * t * (3 - 2 * t)\n}\n\n/** Mulberry32 pseudo random generator. The same seed always gives the same sequence. */\nexport function rng(seed: number): () => number {\n let a = seed >>> 0\n return function () {\n a = (a + 0x6d2b79f5) | 0\n let t = Math.imul(a ^ (a >>> 15), 1 | a)\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\n/** FNV-1a hash of a string, used to derive seeds from vehicle keys and zone ids. */\nexport function strHash(s: string): number {\n let h = 2166136261\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i)\n h = Math.imul(h, 16777619)\n }\n return h >>> 0\n}\n\n/** Marks an object and all its children as decals (ignored by raycasts, rollover and crash fields). */\nexport function markDecal(o: any): void {\n o.traverse((x: any) => {\n x.userData.decal = true\n })\n}\n\n/** Lower-case ASCII identifier made from free text (\"Rear window 2\" -> \"rear_window_2\"). */\nexport function slug(text: unknown): string {\n return String(text)\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_|_$/g, '')\n}\n","/**\n * Legacy seeds. Every damage effect is deterministic: the random stream of a zone comes from a hash of the vehicle key, the\n * zone id and the band. The first version of the engine used Portuguese ids and salts, so ids and salts that were renamed\n * keep their original text here, and the seed is built from the legacy text. A vehicle that looked a given way before\n * renaming still looks exactly the same.\n */\nimport { slug } from './util'\n\n/** Build states: new English name -> original seed text. */\nexport const LEGACY_STATES: Record<string, string> = { intact: 'intacto', damaged: 'danificado', modified: 'modificado' }\n\n/** Salts mixed into the seed of each phase of `applyZones`. */\nexport const SEED_SALTS = { rust: '|ferrugem|', scenario: '|cenario', settle: '|assenta', rollover: '|capota' }\n\n/** Auto-derived zone ids: new id -> original id. Ids that did not change are not listed. */\nexport const LEGACY_ZONE_IDS: Record<string, string> = {\n bumper_front: 'parachoque_d',\n bumper_rear: 'parachoque_t',\n fender_front_left: 'paralama_de',\n fender_front_right: 'paralama_dd',\n door_front_left: 'porta_de',\n door_front_right: 'porta_dd',\n door_rear_left: 'porta_te',\n door_rear_right: 'porta_td',\n side_rear_left: 'lateral_te',\n side_rear_right: 'lateral_td',\n hood: 'capo',\n roof: 'teto',\n lid: 'tampa',\n underbody: 'assoalho',\n cargo_bed: 'cacamba',\n engine: 'motor',\n radiator: 'radiador',\n fuel_tank: 'tanque',\n battery: 'bateria',\n fairing: 'carenagem',\n handlebar: 'guidao',\n seat: 'banco',\n frame: 'quadro',\n exhaust: 'escapamento',\n front: 'frente',\n rear: 'traseira',\n top: 'topo',\n tractor_hood: 'capo_trator',\n fender_rear_left: 'paralama_te',\n fender_rear_right: 'paralama_td',\n operator_station: 'posto',\n cab_front: 'cab_frente',\n cab_left: 'cab_e',\n cab_right: 'cab_d',\n body_left: 'corpo_e',\n body_right: 'corpo_d',\n body_rear: 'corpo_t',\n chassis: 'chassi',\n armor_front: 'blind_frente',\n armor_left: 'blind_e',\n armor_right: 'blind_d',\n armor_rear: 'blind_t',\n weapon: 'arma',\n turret: 'torre',\n track_left: 'lagarta_e',\n track_right: 'lagarta_d',\n wheels_left: 'rodas_e',\n wheels_right: 'rodas_d',\n bow: 'proa',\n side_left: 'costado_e',\n side_right: 'costado_d',\n stern: 'popa',\n deck: 'conves',\n nose: 'nariz',\n cab: 'cabine',\n wing_left: 'asa_e',\n wing_right: 'asa_d',\n fuselage: 'fuselagem',\n tail: 'cauda',\n landing_gear: 'trem',\n fuel_tanks: 'tanques',\n tail_cone: 'cone',\n rotor: 'rotor',\n tail_rotor: 'rotor_cauda',\n skids: 'esquis',\n}\n\n/**\n * Lets a content pack add its own legacy seeds: `zones` maps a new zone id to the original id and `glassLabels` maps the key of a\n * glass part to its original label. The tables are shared by every kit of the process; an id keeps one meaning, so a different\n * text for an id that is already known is an error.\n */\nexport function registerLegacySeeds(tables: { zones?: Record<string, string>; glassLabels?: Record<string, string> }): void {\n const add = (target: Record<string, string>, source: Record<string, string> | undefined, what: string) => {\n Object.keys(source || {}).forEach(function (k) {\n if (target[k] !== undefined && target[k] !== source![k]) throw new Error('registerLegacySeeds: ' + what + ' \"' + k + '\" already maps to \"' + target[k] + '\"')\n target[k] = source![k]\n })\n }\n add(LEGACY_ZONE_IDS, tables.zones, 'zone id')\n add(LEGACY_GLASS_LABELS, tables.glassLabels, 'glass label')\n}\n\n/** The text a zone contributes to its seed: an explicit `seedId`, the legacy id, or the id itself. */\nexport function legacyZoneId(z: { id: string; seedId?: string }): string {\n return z.seedId || LEGACY_ZONE_IDS[z.id] || z.id\n}\n\n/** Original glass labels by part key; the zone id of a pane was the slug of its (Portuguese) label. */\nexport const LEGACY_GLASS_LABELS: Record<string, string> = {\n windshield: 'Para-brisa',\n rear_window: 'Vidro traseiro',\n window_front: 'Janela dianteira',\n window_rear: 'Janela traseira',\n quarter_glass: 'Vidro lateral traseiro',\n cab_window: 'Janela da cabine',\n window: 'Janela',\n glass: 'Vidro',\n}\n\n/**\n * Original zone id of a glass pane. `key` is the part key (null for free-text labels), `label` the current label,\n * `side` -1/1 for panes made by `sideWindows`, `appended` 'left'/'right' when the zone added a side word itself and\n * `fallback` the new id, used when the label was free text (then the id never changed).\n */\nexport function legacyGlassId(key: string | null, label: string, side: number, appended: string | null, fallback: string): string {\n if (!key || !(key in LEGACY_GLASS_LABELS)) return fallback\n let text = LEGACY_GLASS_LABELS[key]\n if (side) text += side < 0 ? ' esquerda' : ' direita'\n else if (appended) text += appended === 'left' ? ' esquerdo' : ' direito'\n let id = slug(text)\n if (!/^vidro|^janela|^para_brisa/.test(id)) id = 'vidro_' + id\n void label\n return id\n}\n\n/** Original id of a light zone: `farol_e`, `lanterna_c`, `farol_d_2`... */\nexport function legacyLightId(kind: string, side: string, index: number): string {\n const k = kind === 'taillight' ? 'lanterna' : 'farol'\n const s = side === 'center' ? 'c' : side === 'left' ? 'e' : 'd'\n return k + '_' + s + (index ? '_' + (index + 1) : '')\n}\n","/** Shared materials, studio environment map, paint colours and text textures. */\nimport type { Kit } from './types'\n\nexport function installMaterials(kit: Kit): void {\n const THREE = kit.THREE\n const I = kit._\n const document = kit.document\n\n /* ================= materiais ================= */\n const RUST = new THREE.Color('#5e3220')\n /* kit.configure({ palette: { rust } }) changes the rust tone of aged paint */\n const cache: any = {}\n /* studio environment map (canvas cube): without it every very metallic material (chrome, reflector, aluminium) renders almost black.\n Grey-blue sky, a light band on the horizon and a dark floor. It is added automatically to every material with metalness >= 0.6. */\n let envTex: any = null\n function studioEnvironment() {\n if (envTex) return envTex\n const faces = []\n const S = 64\n for (let f = 0; f < 6; f++) {\n const cv = document.createElement('canvas')\n cv.width = cv.height = S\n const x: any = cv.getContext('2d')\n if (f === 2) {\n x.fillStyle = '#7d8a99'\n x.fillRect(0, 0, S, S)\n x.fillStyle = 'rgba(235,240,245,0.55)'\n x.fillRect(S * 0.3, S * 0.3, S * 0.4, S * 0.4)\n } else if (f === 3) {\n x.fillStyle = '#16181a'\n x.fillRect(0, 0, S, S)\n } else {\n const gr = x.createLinearGradient(0, 0, 0, S)\n gr.addColorStop(0, '#7a8796')\n gr.addColorStop(0.42, '#b9c2cb')\n gr.addColorStop(0.5, '#e6eaee')\n gr.addColorStop(0.56, '#5b6066')\n gr.addColorStop(1, '#1a1c1e')\n x.fillStyle = gr\n x.fillRect(0, 0, S, S)\n if (f === 0 || f === 4) {\n x.fillStyle = 'rgba(255,255,255,0.35)'\n x.fillRect(S * 0.15, S * 0.12, S * 0.25, S * 0.22)\n }\n }\n faces.push(cv)\n }\n envTex = new THREE.CubeTexture(faces)\n envTex.needsUpdate = true\n return envTex\n }\n kit.studioEnvironment = studioEnvironment\n function makeMaterial(color: any, o: any) {\n o = o || {}\n const c = color instanceof THREE.Color ? color : new THREE.Color(color)\n const key =\n 's' +\n c.getHexString() +\n JSON.stringify(o, function (k, v) {\n return v && v.isColor ? '#' + v.getHexString() : v && v.isTexture ? v.uuid : v\n })\n if (!cache[key]) {\n const o2 = Object.assign({}, o)\n delete o2.noEnv\n const mt = new THREE.MeshStandardMaterial(Object.assign({ color: c, roughness: 0.8, metalness: 0, flatShading: false }, o2))\n if (!o.envMap && o.noEnv !== true && mt.metalness >= 0.6) {\n mt.envMap = studioEnvironment()\n if (o.envMapIntensity == null) mt.envMapIntensity = 0.55 + (mt.metalness - 0.6) * 1.6\n }\n cache[key] = mt\n }\n return cache[key]\n }\n function makeFlatMaterial(color: any, o: any) {\n return makeMaterial(color, Object.assign({ flatShading: true, roughness: 0.92 }, o || {}))\n }\n const DOUBLE_SIDE = THREE.DoubleSide\n function toColor(hex: any) {\n return new THREE.Color(hex)\n }\n const MATERIALS = {\n trim: makeMaterial('#17191b', { roughness: 0.7 }),\n rubber: makeMaterial('#111111', { roughness: 0.95, side: DOUBLE_SIDE }),\n chrome: makeMaterial('#b8bcbf', { metalness: 0.9, roughness: 0.28 }),\n steel: makeMaterial('#6c7175', { metalness: 0.7, roughness: 0.45 }),\n glass: makeMaterial('#2a3c44', { roughness: 0.05, metalness: 0.25, transparent: true, opacity: 0.4, depthWrite: false, side: DOUBLE_SIDE }),\n tint: makeMaterial('#121a1e', { roughness: 0.05, metalness: 0.3, transparent: true, opacity: 0.62, depthWrite: false, side: DOUBLE_SIDE }),\n /* rear glass: darker, so the interior does not look like an open bed seen from behind */\n rearTint: makeMaterial('#0c1114', { roughness: 0.04, metalness: 0.45, transparent: true, opacity: 0.84, depthWrite: false, side: DOUBLE_SIDE }),\n glassDark: makeMaterial('#0c1317', { roughness: 0.06, metalness: 0.75, side: DOUBLE_SIDE }),\n armorGlass: makeMaterial('#1d302d', { roughness: 0.08, metalness: 0.4, transparent: true, opacity: 0.6, depthWrite: false, side: DOUBLE_SIDE }),\n glassEdge: makeMaterial('#a9bcc1', { roughness: 0.25, metalness: 0.1, transparent: true, opacity: 0.6, depthWrite: false, side: DOUBLE_SIDE }),\n lens: makeMaterial('#eef3f5', { roughness: 0.03, metalness: 0.1, transparent: true, opacity: 0.16, depthWrite: false }),\n lensRed: makeMaterial('#c0281c', { roughness: 0.04, metalness: 0.1, transparent: true, opacity: 0.42, depthWrite: false }),\n lensAmber: makeMaterial('#d88a2a', { roughness: 0.04, transparent: true, opacity: 0.4, depthWrite: false }),\n housing: makeMaterial('#111214', { roughness: 0.45, metalness: 0.2 }),\n reflector: makeMaterial('#dfe3e6', { metalness: 0.9, roughness: 0.12, side: DOUBLE_SIDE }),\n reflectorLit: makeMaterial('#e8e2cc', { metalness: 0.6, roughness: 0.18, emissive: toColor('#cfc19a'), emissiveIntensity: 1.6, side: DOUBLE_SIDE }),\n hole: makeMaterial('#040506', { roughness: 1, side: DOUBLE_SIDE }),\n dark: makeMaterial('#0a0b0c', { roughness: 1, side: DOUBLE_SIDE }),\n head: makeMaterial('#efe6c9', { emissive: toColor('#f0dcaa'), emissiveIntensity: 1.7, roughness: 0.2 }),\n led: makeMaterial('#e6f2ff', { emissive: toColor('#cfe6ff'), emissiveIntensity: 1.6, roughness: 0.2 }),\n tail: makeMaterial('#8a1a14', { emissive: toColor('#7a0d08'), emissiveIntensity: 0.8, roughness: 0.25 }),\n amber: makeMaterial('#c8781e', { emissive: toColor('#b0600c'), emissiveIntensity: 0.8, roughness: 0.3 }),\n rev: makeMaterial('#cfcfc8', { emissive: toColor('#5a5a55'), emissiveIntensity: 0.35, roughness: 0.3 }),\n blue: makeMaterial('#1d4f9a', { emissive: toColor('#2f6fe0'), emissiveIntensity: 1.2, roughness: 0.3 }),\n green: makeMaterial('#1d7a3a', { emissive: toColor('#2fbf5a'), emissiveIntensity: 1.0, roughness: 0.3 }),\n broken: makeMaterial('#1b1b1a', { roughness: 0.6 }),\n bulbBroken: makeMaterial('#232220', { roughness: 0.7, metalness: 0.2 }),\n wood: makeMaterial('#6b4a2e', { roughness: 0.9 }),\n leather: makeMaterial('#4a2f20', { roughness: 0.7 }),\n seat: makeMaterial('#1e1f22', { roughness: 0.85 }),\n alu: makeMaterial('#8e959a', { metalness: 0.6, roughness: 0.42, side: DOUBLE_SIDE }),\n carpet: makeMaterial('#141517', { roughness: 1 }),\n plastic: makeMaterial('#1f2023', { roughness: 0.75 }),\n headliner: makeMaterial('#6f6c66', { roughness: 0.95, side: DOUBLE_SIDE }),\n gauge: makeMaterial('#0d1512', { emissive: toColor('#4fbf8a'), emissiveIntensity: 0.35, roughness: 0.4 }),\n screen: makeMaterial('#0b1220', { emissive: toColor('#3d6cb0'), emissiveIntensity: 0.4, roughness: 0.2 }),\n bay: makeMaterial('#2c3033', { roughness: 0.8, metalness: 0.2, emissive: toColor('#0c0e10'), emissiveIntensity: 1, side: DOUBLE_SIDE }),\n hoodLiner: makeMaterial('#1c1d1e', { roughness: 0.95, side: DOUBLE_SIDE }),\n block: makeMaterial('#a3abb0', { metalness: 0.55, roughness: 0.38, emissive: toColor('#1a1d1f'), emissiveIntensity: 1 }),\n cover: makeMaterial('#3c4044', { metalness: 0.4, roughness: 0.35, emissive: toColor('#101213'), emissiveIntensity: 1 }),\n radiator: makeMaterial('#3a3f42', { metalness: 0.5, roughness: 0.55 }),\n yellow: makeMaterial('#e0b81c', { roughness: 0.4 }),\n capBlue: makeMaterial('#2a63c4', { roughness: 0.4 }),\n postRed: makeMaterial('#b3261e', { roughness: 0.4 }),\n postBlack: makeMaterial('#0c0c0c', { roughness: 0.4 }),\n coolant: makeMaterial('#e85fa3', { roughness: 0.15, transparent: true, opacity: 0.5, depthWrite: false }),\n coolantLiq: makeMaterial('#d0307a', { roughness: 0.3, emissive: toColor('#3a0a1e'), emissiveIntensity: 0.4 }),\n washer: makeMaterial('#9fd2ea', { roughness: 0.15, transparent: true, opacity: 0.5, depthWrite: false }),\n hv: makeMaterial('#e4670f', { roughness: 0.5 }),\n hose: makeMaterial('#121212', { roughness: 0.8 }),\n }\n kit.makeMaterial = makeMaterial\n kit.makeFlatMaterial = makeFlatMaterial\n kit.materials = MATERIALS\n function paintColor(hex: any, st: any) {\n const c = new THREE.Color(hex)\n if (st === 'damaged') {\n c.lerp(RUST, 0.22)\n c.multiplyScalar(0.9)\n }\n return c\n }\n kit.paintColor = paintColor\n const texCache: any = {}\n function textTexture(text: any, o: any) {\n o = o || {}\n const key = text + JSON.stringify(o)\n if (texCache[key]) return texCache[key]\n const w = o.w || 512\n const h = o.h || 128\n const cv = document.createElement('canvas')\n cv.width = w\n cv.height = h\n const x: any = cv.getContext('2d')\n if (o.bg) {\n x.fillStyle = o.bg\n x.fillRect(0, 0, w, h)\n }\n if (o.band) {\n x.fillStyle = o.band\n x.fillRect(0, 0, w, h * 0.24)\n x.fillStyle = '#fff'\n x.font = '600 ' + Math.round(h * 0.15) + \"px 'IBM Plex Sans', Arial, sans-serif\"\n x.textAlign = 'center'\n x.textBaseline = 'middle'\n x.fillText(kit.t('plate.band'), w / 2, h * 0.125)\n }\n x.fillStyle = o.fg || '#111'\n x.textAlign = 'center'\n x.textBaseline = 'middle'\n /* shrink the font until the text fits the width (never clips) */\n let fs = Math.round(h * (o.size || 0.6))\n const fam = (o.weight || '700') + ' '\n const ff = 'px ' + (o.font || \"'Saira Condensed', 'Arial Narrow', sans-serif\")\n x.font = fam + fs + ff\n while (fs > 6 && x.measureText(text).width > w * 0.94) {\n fs -= 1\n x.font = fam + fs + ff\n }\n x.fillText(text, w / 2, o.band ? h * 0.62 : h / 2 + 2)\n const t = new THREE.CanvasTexture(cv)\n texCache[key] = t\n return t\n }\n kit.textTexture = textTexture\n\n Object.assign(I, { RUST, cache, studioEnvironment, makeMaterial, makeFlatMaterial, DOUBLE_SIDE, toColor, MATERIALS, paintColor, texCache, textTexture })\n}\n","/** Geometry helpers: rounded boxes, lofts, creasing, subdivision, merging and convex hulls. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installGeometry(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const lod = kit.lod\n\n /* ================= geometry ================= */\n function roundedBoxGeometry(w: any, h: any, d: any, r: any) {\n r = Math.max(0.002, Math.min(r, w * 0.45, h * 0.45, d * 0.45))\n /* light mode: a small or hard-edged box is a plain box (12 triangles), the rest gets fewer rounding rings */\n if (lod.on && (r < 0.012 || Math.max(w, h, d) < lod.flatBoxEdge || Math.min(w, h, d) < 0.08)) return new THREE.BoxGeometry(w, h, d)\n const nb = lod.on ? lod.roundingRings : 3\n const n = 2 * nb + 1\n const g = new THREE.BoxGeometry(1, 1, 1, n, n, n)\n const p = g.attributes.position\n const nr = g.attributes.normal\n const hx = w / 2 - r\n const hy = h / 2 - r\n const hz = d / 2 - r\n function map(v: any, hi: any) {\n const i = Math.round((v + 0.5) * n)\n return i <= nb ? -hi - (r * (nb - i)) / nb : hi + (r * (i - nb - 1)) / nb\n }\n const q = new V3()\n const c = new V3()\n const dir = new V3()\n for (let i = 0; i < p.count; i++) {\n q.set(map(p.getX(i), hx), map(p.getY(i), hy), map(p.getZ(i), hz))\n c.set(clamp(q.x, -hx, hx), clamp(q.y, -hy, hy), clamp(q.z, -hz, hz))\n dir.subVectors(q, c)\n if (dir.lengthSq() > 1e-12) {\n dir.normalize()\n q.copy(c).addScaledVector(dir, r)\n nr.setXYZ(i, dir.x, dir.y, dir.z)\n }\n p.setXYZ(i, q.x, q.y, q.z)\n }\n return g\n }\n function taper(geo: any, t: any) {\n geo.computeBoundingBox()\n const bb = geo.boundingBox\n const h = bb.max.y - bb.min.y\n const p = geo.attributes.position\n const sx = t.sx == null ? 1 : t.sx\n const sz = t.sz == null ? 1 : t.sz\n const sh = t.shift || 0\n for (let i = 0; i < p.count; i++) {\n const k = (p.getY(i) - bb.min.y) / h\n p.setX(i, p.getX(i) * (1 + (sx - 1) * k) + sh * k)\n p.setZ(i, p.getZ(i) * (1 + (sz - 1) * k))\n }\n p.needsUpdate = true\n geo.computeVertexNormals()\n }\n function subdivide(geo: any, maxLen: any) {\n if (lod.on) maxLen = maxLen * lod.subdivisionFactor\n const src = geo.index ? geo.toNonIndexed() : geo\n const a = src.attributes.position.array\n const out: any = []\n function d(p: any, q: any) {\n return Math.hypot(p[0] - q[0], p[1] - q[1], p[2] - q[2])\n }\n function m(p: any, q: any) {\n return [(p[0] + q[0]) / 2, (p[1] + q[1]) / 2, (p[2] + q[2]) / 2]\n }\n function tri(A: any, B: any, C: any, depth: any) {\n const ab = d(A, B)\n const bc = d(B, C)\n const ca = d(C, A)\n const mx = Math.max(ab, bc, ca)\n if (mx <= maxLen || depth > 12) {\n out.push(A[0], A[1], A[2], B[0], B[1], B[2], C[0], C[1], C[2])\n return\n }\n if (mx === ab) {\n const D = m(A, B)\n tri(A, D, C, depth + 1)\n tri(D, B, C, depth + 1)\n } else if (mx === bc) {\n const E2 = m(B, C)\n tri(A, B, E2, depth + 1)\n tri(A, E2, C, depth + 1)\n } else {\n const F = m(C, A)\n tri(A, B, F, depth + 1)\n tri(F, B, C, depth + 1)\n }\n }\n for (let i = 0; i < a.length; i += 9) tri([a[i], a[i + 1], a[i + 2]], [a[i + 3], a[i + 4], a[i + 5]], [a[i + 6], a[i + 7], a[i + 8]], 0)\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(out, 3))\n g.userData.crease = true\n return g\n }\n function crease(geo: any, deg: any) {\n if (geo.index) {\n const ni = geo.toNonIndexed()\n Object.keys(ni.attributes).forEach(function (k) {\n geo.setAttribute(k, ni.attributes[k])\n })\n geo.setIndex(null)\n }\n const p = geo.attributes.position\n const n = p.count\n const FN = []\n const map: any = {}\n const A = new V3()\n const B = new V3()\n const C = new V3()\n const e1 = new V3()\n const e2 = new V3()\n function key(i: any) {\n return Math.round(p.getX(i) * 2000) + ',' + Math.round(p.getY(i) * 2000) + ',' + Math.round(p.getZ(i) * 2000)\n }\n const keys = new Array(n)\n for (let f = 0; f < n / 3; f++) {\n A.fromBufferAttribute(p, 3 * f)\n B.fromBufferAttribute(p, 3 * f + 1)\n C.fromBufferAttribute(p, 3 * f + 2)\n const nn = new V3().crossVectors(e1.subVectors(C, B), e2.subVectors(A, B))\n if (nn.lengthSq() > 1e-20) nn.normalize()\n FN.push(nn)\n for (let k = 0; k < 3; k++) {\n const kk = key(3 * f + k)\n keys[3 * f + k] = kk\n ;(map[kk] || (map[kk] = [])).push(f)\n }\n }\n const cs = Math.cos((deg * PI) / 180)\n const out = new Float32Array(n * 3)\n const s = new V3()\n for (let i = 0; i < n; i++) {\n const fi = (i / 3) | 0\n const list = map[keys[i]]\n s.set(0, 0, 0)\n for (let j = 0; j < list.length; j++) {\n const g = FN[list[j]]\n if (g.dot(FN[fi]) >= cs) s.add(g)\n }\n if (s.lengthSq() < 1e-20) s.copy(FN[fi])\n s.normalize()\n out[3 * i] = s.x\n out[3 * i + 1] = s.y\n out[3 * i + 2] = s.z\n }\n geo.setAttribute('normal', new THREE.BufferAttribute(out, 3))\n geo.userData.crease = true\n return geo\n }\n function pathShape(items: any) {\n const s = new THREE.Shape()\n const n = items.length\n function sp(it: any) {\n return it.arc ? [it.arc[0] + it.arc[2] * Math.cos(it.arc[3]), it.arc[1] + it.arc[2] * Math.sin(it.arc[3])] : [it[0], it[1]]\n }\n function ep(it: any) {\n return it.arc ? [it.arc[0] + it.arc[2] * Math.cos(it.arc[4]), it.arc[1] + it.arc[2] * Math.sin(it.arc[4])] : [it[0], it[1]]\n }\n const ins = []\n const outs = []\n for (let i = 0; i < n; i++) {\n const it = items[i]\n if (it.arc) {\n ins.push(sp(it))\n outs.push(ep(it))\n continue\n }\n const r = it[2] || 0\n const pv = ep(items[(i - 1 + n) % n])\n const nx = sp(items[(i + 1) % n])\n const dp = Math.hypot(pv[0] - it[0], pv[1] - it[1]) || 1\n const dn = Math.hypot(nx[0] - it[0], nx[1] - it[1]) || 1\n const rp = Math.min(r, dp * 0.45)\n const rn = Math.min(r, dn * 0.45)\n ins.push([it[0] + ((pv[0] - it[0]) / dp) * rp, it[1] + ((pv[1] - it[1]) / dp) * rp])\n outs.push([it[0] + ((nx[0] - it[0]) / dn) * rn, it[1] + ((nx[1] - it[1]) / dn) * rn])\n }\n s.moveTo(outs[0][0], outs[0][1])\n for (let j = 1; j <= n; j++) {\n const idx = j % n\n const it2 = items[idx]\n s.lineTo(ins[idx][0], ins[idx][1])\n if (it2.arc) s.absarc(it2.arc[0], it2.arc[1], it2.arc[2], it2.arc[3], it2.arc[4], !!it2.arc[5])\n else if ((it2[2] || 0) > 0) s.quadraticCurveTo(it2[0], it2[1], outs[idx][0], outs[idx][1])\n }\n return s\n }\n function tumble(geo: any, T: any) {\n if (!T) return\n const p = geo.attributes.position\n for (let i = 0; i < p.count; i++) {\n const t = clamp((p.getY(i) - T.belt) / (T.top - T.belt), 0, 1)\n p.setZ(i, p.getZ(i) * (1 - T.k * t))\n }\n p.needsUpdate = true\n }\n function loftGeometry(st: any, seg: any, pw: any, colorFn: any) {\n seg = seg || 22\n pw = pw || 2\n const pos: any = []\n const col: any = []\n const idx = []\n const ring = seg + 1\n st.forEach(function (s: any) {\n for (let j = 0; j <= seg; j++) {\n const a = (j / seg) * PI * 2\n const c = Math.cos(a)\n const sn = Math.sin(a)\n const e = 2 / (s.p || pw)\n const yy = s.y + (s.h / 2) * Math.sign(sn) * Math.pow(Math.abs(sn), e)\n const zz = (s.w / 2) * Math.sign(c) * Math.pow(Math.abs(c), e)\n pos.push(s.x, yy, zz)\n if (colorFn) {\n const cc = colorFn(s.x, yy, zz, s)\n col.push(cc.r, cc.g, cc.b)\n }\n }\n })\n for (let i = 0; i < st.length - 1; i++)\n for (let k = 0; k < seg; k++) {\n const a0 = i * ring + k\n const b0 = a0 + ring\n idx.push(a0, a0 + 1, b0, a0 + 1, b0 + 1, b0)\n }\n ;[0, st.length - 1].forEach(function (si, e) {\n const s = st[si]\n if (s.w < 0.01) return\n const ci = pos.length / 3\n pos.push(s.x, s.y, 0)\n if (colorFn) {\n const cc = colorFn(s.x, s.y, 0, s)\n col.push(cc.r, cc.g, cc.b)\n }\n for (let k = 0; k < seg; k++) {\n const a = si * ring + k\n if (e === 0) idx.push(ci, a + 1, a)\n else idx.push(ci, a, a + 1)\n }\n })\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n if (colorFn) g.setAttribute('color', new THREE.Float32BufferAttribute(col, 3))\n g.setIndex(idx)\n g.computeVertexNormals()\n return g\n }\n function hullGeometry(o: any, colorFn: any) {\n const n = o.n || 18\n const m = 14\n const pos = []\n const col = []\n const idx = []\n for (let i = 0; i <= n; i++) {\n const t = i / n\n const x = -o.L / 2 + t * o.L\n const b = o.beam(t)\n const ky = o.keel(t)\n const sy = o.sheer(t)\n for (let j = 0; j <= m; j++) {\n const v = (j / m) * 2 - 1\n const z = b * v\n const y = ky + (sy - ky) * Math.pow(Math.abs(v), o.p || 2)\n pos.push(x, y, z)\n if (colorFn) {\n const c = colorFn(x, y, z)\n col.push(c.r, c.g, c.b)\n }\n }\n }\n for (let a = 0; a < n; a++)\n for (let k = 0; k < m; k++) {\n const p0 = a * (m + 1) + k\n const p1 = p0 + m + 1\n idx.push(p0, p1, p0 + 1, p0 + 1, p1, p1 + 1)\n }\n const ci = pos.length / 3\n const x0 = -o.L / 2\n const sy0 = o.sheer(0)\n pos.push(x0, sy0, 0)\n if (colorFn) {\n const c0 = colorFn(x0, sy0, 0)\n col.push(c0.r, c0.g, c0.b)\n }\n for (let q = 0; q < m; q++) idx.push(ci, q, q + 1)\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n if (colorFn) g.setAttribute('color', new THREE.Float32BufferAttribute(col, 3))\n g.setIndex(idx)\n g.computeVertexNormals()\n return g\n }\n /* Cuts triangles: each test { sel(normal, centre) -> bool, sdf(x,y,z) -> number (negative = remove), tag }.\n Triangles crossing the edge are cut along the line sdf = 0. Removed pieces with a tag come back in .cut[tag]. */\n function cutGeometry(geo: any, tests: any) {\n const src = geo.index ? geo.toNonIndexed() : geo\n const names = ['position'].concat(\n ['color', 'uv'].filter(function (n) {\n return !!src.attributes[n]\n }),\n )\n const sizes = names.map(function (n) {\n return src.attributes[n].itemSize\n })\n const arrs = names.map(function (n) {\n return src.attributes[n].array\n })\n const nv = src.attributes.position.count\n let tris: any = []\n for (let f = 0; f < nv; f += 3) {\n const t = []\n for (let k = 0; k < 3; k++) {\n const v = []\n for (let a = 0; a < names.length; a++) for (let q = 0; q < sizes[a]; q++) v.push(arrs[a][(f + k) * sizes[a] + q])\n t.push(v)\n }\n tris.push(t)\n }\n const cut: any = {}\n const n = new V3()\n const e1 = new V3()\n const e2 = new V3()\n const ce = new V3()\n function lerp(P: any, Q: any, k: any) {\n const o = new Array(P.length)\n for (let i = 0; i < P.length; i++) o[i] = P[i] + (Q[i] - P[i]) * k\n return o\n }\n function clip(t: any, d: any, s: any) {\n const out = []\n for (let i = 0; i < 3; i++) {\n const j = (i + 1) % 3\n const di = s * d[i]\n const dj = s * d[j]\n if (di >= 0) out.push(t[i])\n if (di >= 0 !== dj >= 0) out.push(lerp(t[i], t[j], di / (di - dj)))\n }\n return out\n }\n function fan(poly: any, arr: any) {\n for (let i = 1; i < poly.length - 1; i++) arr.push([poly[0], poly[i], poly[i + 1]])\n }\n tests.forEach(function (T: any) {\n const next: any = []\n const rem = T.tag ? (cut[T.tag] = cut[T.tag] || []) : null\n tris.forEach(function (t: any) {\n const A = t[0]\n const B = t[1]\n const C = t[2]\n e1.set(B[0] - A[0], B[1] - A[1], B[2] - A[2])\n e2.set(C[0] - A[0], C[1] - A[1], C[2] - A[2])\n n.crossVectors(e1, e2)\n const len = n.length()\n if (len < 1e-12) {\n next.push(t)\n return\n }\n n.multiplyScalar(1 / len)\n ce.set((A[0] + B[0] + C[0]) / 3, (A[1] + B[1] + C[1]) / 3, (A[2] + B[2] + C[2]) / 3)\n if (T.sel && !T.sel(n, ce)) {\n next.push(t)\n return\n }\n const d = [T.sdf(A[0], A[1], A[2]), T.sdf(B[0], B[1], B[2]), T.sdf(C[0], C[1], C[2])]\n const ins = (d[0] < 0 ? 1 : 0) + (d[1] < 0 ? 1 : 0) + (d[2] < 0 ? 1 : 0)\n if (ins === 0) next.push(t)\n else if (ins === 3) {\n if (rem) rem.push(t)\n } else {\n fan(clip(t, d, 1), next)\n if (rem) fan(clip(t, d, -1), rem)\n }\n })\n tris = next\n })\n function build(list: any) {\n const g = new THREE.BufferGeometry()\n let off = 0\n names.forEach(function (nm, a) {\n const arr = new Float32Array(list.length * 3 * sizes[a])\n let w = 0\n list.forEach(function (t: any) {\n for (let k = 0; k < 3; k++) for (let q = 0; q < sizes[a]; q++) arr[w++] = t[k][off + q]\n })\n g.setAttribute(nm, new THREE.BufferAttribute(arr, sizes[a]))\n off += sizes[a]\n })\n g.userData.crease = true\n return g\n }\n const out: any = { geo: build(tris), cut: {} }\n Object.keys(cut).forEach(function (k) {\n out.cut[k] = crease(build(cut[k]), 42)\n })\n return out\n }\n /* Merges geometries (already transformed) into one, for repeated parts such as track links and honeycomb. */\n function mergeGeometries(list: any) {\n const pos: any = []\n const nor: any = []\n list.forEach(function (g: any) {\n const n = g.index ? g.toNonIndexed() : g\n if (!n.attributes.normal) n.computeVertexNormals()\n const pa = n.attributes.position.array\n const na = n.attributes.normal.array\n for (let i = 0; i < pa.length; i++) {\n pos.push(pa[i])\n nor.push(na[i])\n }\n })\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n g.setAttribute('normal', new THREE.Float32BufferAttribute(nor, 3))\n return g\n }\n /* Normalised 0..1 UV projecting onto the two axes of greatest extent (or onto the given axes, e.g. \"xy\"). */\n function uvProject(geo: any, axes: any) {\n geo.computeBoundingBox()\n const bb = geo.boundingBox\n const sz = new V3().subVectors(bb.max, bb.min)\n const ax = axes\n ? [axes.charCodeAt(0) - 120, axes.charCodeAt(1) - 120]\n : [0, 1, 2]\n .sort(function (a, b) {\n return sz.getComponent(b) - sz.getComponent(a)\n })\n .slice(0, 2)\n .sort()\n const p = geo.attributes.position\n const uv = new Float32Array(p.count * 2)\n const v = new V3()\n for (let i = 0; i < p.count; i++) {\n v.fromBufferAttribute(p, i)\n uv[2 * i] = (v.getComponent(ax[0]) - bb.min.getComponent(ax[0])) / (sz.getComponent(ax[0]) || 1)\n uv[2 * i + 1] = (v.getComponent(ax[1]) - bb.min.getComponent(ax[1])) / (sz.getComponent(ax[1]) || 1)\n }\n geo.setAttribute('uv', new THREE.BufferAttribute(uv, 2))\n return sz.getComponent(ax[0]) / (sz.getComponent(ax[1]) || 1)\n }\n kit.geo = {\n roundedBox: roundedBoxGeometry,\n taper: taper,\n subdivide: subdivide,\n crease: crease,\n pathShape: pathShape,\n tumble: tumble,\n loft: loftGeometry,\n hull: hullGeometry,\n cut: cutGeometry,\n merge: mergeGeometries,\n uvProject: uvProject,\n }\n /* Ready-made holes for shell({ holes }) and geo.cut */\n kit.holeTop = function (x0: any, x1: any, z: any, yMin: any, tag: any) {\n return {\n tag: tag,\n sel: function (n: any, ce: any) {\n return n.y > 0.3 && ce.y > yMin\n },\n sdf: function (x: any, y: any, zz: any) {\n return Math.max(x0 - x, x - x1, Math.abs(zz) - z)\n },\n }\n }\n kit.holeSide = function (poly: any, o: any) {\n o = o || {}\n let area = 0\n for (let i = 0; i < poly.length; i++) {\n const a = poly[i]\n const b = poly[(i + 1) % poly.length]\n area += a[0] * b[1] - b[0] * a[1]\n }\n const sg = area > 0 ? 1 : -1\n const E2 = poly.map(function (a: any, i: any) {\n const b = poly[(i + 1) % poly.length]\n const dx = b[0] - a[0]\n const dy = b[1] - a[1]\n const L = Math.hypot(dx, dy) || 1\n return [a[0], a[1], (sg * dy) / L, (-sg * dx) / L]\n })\n const sh = o.shrink || 0\n const zMin = o.zMin || 0\n return {\n tag: o.tag,\n sel: function (n: any, ce: any) {\n return Math.abs(n.z) > 0.5 && Math.abs(ce.z) >= zMin && (o.side == null || Math.sign(ce.z) === o.side)\n },\n sdf: function (x: any, y: any) {\n let d = -1e9\n for (let i = 0; i < E2.length; i++) {\n const e = E2[i]\n d = Math.max(d, (x - e[0]) * e[2] + (y - e[1]) * e[3])\n }\n return d + sh\n },\n }\n }\n kit.holeQuad = function (q: any, margin: any) {\n margin = margin || 0\n return {\n sel: function (n: any) {\n return n.x * q.n[0] + n.y * q.n[1] > 0.55\n },\n sdf: function (x: any, y: any, z: any) {\n const rx = x - q.pb[0]\n const ry = y - q.pb[1]\n const s = rx * q.u[0] + ry * q.u[1]\n const dn = rx * q.n[0] + ry * q.n[1]\n const s0 = q.ins\n const s1 = q.L - q.ins * 1.3\n const k = clamp((s - s0) / (s1 - s0), 0, 1)\n const hw = q.hb + (q.ht - q.hb) * k - margin\n return Math.max(s0 + margin - s, s - s1 + margin, Math.abs(z) - hw, Math.abs(dn - q.bev) - 0.08)\n },\n }\n }\n kit.holeBox = function (min: any, max: any, sel: any, tag: any) {\n return {\n tag: tag,\n sel: sel || null,\n sdf: function (x: any, y: any, z: any) {\n return Math.max(min[0] - x, x - max[0], min[1] - y, y - max[1], min[2] - z, z - max[2])\n },\n }\n }\n kit.holeWhere = function (sel: any, tag: any) {\n return {\n tag: tag,\n sel: sel,\n sdf: function () {\n return -1\n },\n }\n }\n\n Object.assign(I, { roundedBoxGeometry, taper, subdivide, crease, pathShape, tumble, loftGeometry, hullGeometry, cutGeometry, mergeGeometries, uvProject })\n}\n","import type { Kit } from './types'\nimport { clamp, rng } from './util'\n\nexport function installContext(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, DOUBLE_SIDE, MATERIALS, crease, mergeGeometries, paintColor, roundedBoxGeometry, subdivide, taper, textTexture } = I\n\n /**\n * Normalises a label argument. A plain string is used as given; `{ key }` takes the text from the locale (`parts.<key>`);\n * `{ key, label }` uses the given text but keeps the key, which the zone derivation uses to recognise the part.\n */\n function resolveLabel(l: any): { label: string; key?: string } {\n if (l && typeof l === 'object') return { key: l.key, label: l.label != null ? l.label : kit.t('parts.' + l.key) }\n return { label: l }\n }\n kit.resolveLabel = resolveLabel\n I.resolveLabel = resolveLabel\n\n /* ================= build context ================= */\n /** The object every vehicle builder receives. Axes: +x front, +y up, +z right (driver at negative z), ground at y = 0, metres. */\n class BuildContext {\n [key: string]: any\n constructor(state: string, seed?: number) {\n this.root = new THREE.Group()\n this.vehicle = new THREE.Group()\n this.effects = new THREE.Group()\n this.root.add(this.vehicle)\n this.root.add(this.effects)\n this.state = state\n this.glass = []\n this.quads = []\n this.deform = []\n this.wheels = []\n this.parts = []\n this.spin = []\n this.lights = []\n this.fluids = []\n this.meta = {}\n this.log = []\n this.paints = new Set()\n this.zoneDefs = []\n this.particles = []\n this.emitters = []\n this.seatTops = []\n this.hood = null\n this.rollState = null\n this.flipped = false\n this.time = 0\n this.rand = rng(seed || 7)\n }\n add(geo: any, mat: any, x: any, y: any, z: any, parent: any) {\n const m = new THREE.Mesh(geo, mat)\n m.position.set(x || 0, y || 0, z || 0)\n m.castShadow = true\n m.receiveShadow = true\n ;(parent || this.vehicle).add(m)\n return m\n }\n /** Paint material; `meta.matte` (or `o.matte`) gives a matte finish to everything, including parts created later (damage, hood). */\n paint(hex: any, o: any) {\n o = Object.assign({}, o || {})\n const matte = o.matte != null ? o.matte : this.meta.matte\n delete o.matte\n const base = matte\n ? { roughness: this.state === 'damaged' ? 0.92 : 0.82, metalness: 0.08, side: DOUBLE_SIDE }\n : { roughness: this.state === 'damaged' ? 0.75 : 0.42, metalness: 0.3, side: DOUBLE_SIDE }\n const pm = makeMaterial(paintColor(hex, this.state), Object.assign(base, o))\n this.paints.add(pm)\n return pm\n }\n roundBox(w: any, h: any, d: any, r: any, mat: any, x: any, y: any, z: any, o: any) {\n o = o || {}\n let geo = roundedBoxGeometry(w, h, d, r)\n if (o.taper) taper(geo, o.taper)\n if (o.sub) geo = crease(subdivide(geo, o.sub), 40)\n else if (o.def) geo = crease(geo.toNonIndexed(), 50)\n const m = this.add(geo, mat, x, y, z, o.parent)\n if (o.rot) m.rotation.set(o.rot[0], o.rot[1], o.rot[2])\n if (o.def) this.deform.push(m)\n return m\n }\n cylinder(r1: any, r2: any, h: any, mat: any, x: any, y: any, z: any, axis: any, o: any) {\n o = o || {}\n const m = this.add(new THREE.CylinderGeometry(r1, r2, h, o.seg || 20, 1, !!o.open), mat, x, y, z, o.parent)\n if (axis === 'x') m.rotation.z = -PI / 2\n else if (axis === 'z') m.rotation.x = PI / 2\n return m\n }\n sphere(r: any, mat: any, x: any, y: any, z: any, sx: any, sy: any, sz: any, o: any) {\n o = o || {}\n const m = this.add(new THREE.SphereGeometry(r, o.ws || 18, o.hs || 12, 0, PI * 2, 0, o.tl || PI), mat, x, y, z, o.parent)\n m.scale.set(sx || 1, sy || 1, sz || 1)\n return m\n }\n rod(a: any, b: any, r: any, mat: any, o: any) {\n o = o || {}\n const len = a.distanceTo(b)\n const m = this.add(\n new THREE.CylinderGeometry(r, o.r2 == null ? r : o.r2, len, o.seg || 10),\n mat,\n (a.x + b.x) / 2,\n (a.y + b.y) / 2,\n (a.z + b.z) / 2,\n o.parent,\n )\n m.quaternion.setFromUnitVectors(new V3(0, 1, 0), new V3().subVectors(b, a).normalize())\n return m\n }\n tube(pts: any, r: any, mat: any, o: any) {\n o = o || {}\n const curve = new THREE.CatmullRomCurve3(\n pts.map(function (p: any) {\n return p.isVector3 ? p.clone() : new V3(p[0], p[1], p[2] || 0)\n }),\n !!o.closed,\n )\n return this.add(new THREE.TubeGeometry(curve, o.seg || 40, r, o.rs || 8, !!o.closed), mat, 0, 0, 0, o.parent)\n }\n text(txt: any, w: any, h: any, x: any, y: any, z: any, face: any, o: any) {\n o = o || {}\n const mat = new THREE.MeshStandardMaterial({ map: textTexture(txt, o), transparent: !o.bg, roughness: 0.6, alphaTest: o.bg ? 0 : 0.3 })\n if (o.glow) {\n mat.emissive = new THREE.Color(o.glow)\n mat.emissiveMap = mat.map\n mat.emissiveIntensity = 0.6\n }\n const m = this.add(new THREE.PlaneGeometry(w, h), mat, x, y, z, o.parent)\n m.castShadow = false\n if (face === '+y' || face === '-y') m.rotation.x = face === '+y' ? -PI / 2 : PI / 2\n else m.rotation.y = ({ '+z': 0, '-z': PI, '+x': PI / 2, '-x': -PI / 2 } as Record<string, number>)[face] || 0\n return m\n }\n plate(x: any, y: any, z: any, face: any, txt: any) {\n /* the plate is rigid: soft body deformation (warp, sculpting) does not bend it; a dent carries it as a rigid body */\n const pl = this.text(txt || kit.config.plate, 0.4, 0.13, x, y, z, face, {\n w: 400,\n h: 130,\n bg: '#f2f2ee',\n band: '#1f4fa3',\n fg: '#151515',\n size: 0.5,\n font: \"'IBM Plex Mono', monospace\",\n weight: '500',\n })\n pl.userData.noWarp = true\n pl.userData.plate = true\n return pl\n }\n part(kind: any, label: any, obj: any, pos: any, reach?: any, o?: any) {\n const L = I.resolveLabel(label)\n const pt = Object.assign(\n { kind: kind, label: L.label, key: L.key, obj: obj, pos: pos.clone ? pos.clone() : new V3(pos[0], pos[1], pos[2]), reach: reach || 1 },\n o || {},\n )\n this.parts.push(pt)\n return pt\n }\n wheel(x: any, z: any, r: any, w: any, o: any) {\n o = o || {}\n const s = z >= 0 ? 1 : -1\n const g = new THREE.Group()\n g.position.set(x, o.y == null ? r : o.y, z)\n this.vehicle.add(g)\n const rr = r * (o.rimR || 0.6)\n const prof = [\n [rr, -w / 2 + 0.01],\n [r - 0.06, -w / 2],\n [r - 0.015, -w / 2 + 0.035],\n [r, -w / 2 + 0.08],\n [r, w / 2 - 0.08],\n [r - 0.015, w / 2 - 0.035],\n [r - 0.06, w / 2],\n [rr, w / 2 - 0.01],\n ].map(function (p) {\n return new THREE.Vector2(p[0], p[1])\n })\n const tire = new THREE.Mesh(crease(new THREE.LatheGeometry(prof, 30).toNonIndexed(), 55), MATERIALS.rubber)\n tire.rotation.x = PI / 2\n tire.castShadow = true\n g.add(tire)\n if (o.lugs) {\n const nl = Math.round(r * 30)\n const lugs: any = []\n for (let i = 0; i < nl; i++) {\n const a = (i / nl) * PI * 2\n ;[-1, 1].forEach(function (sd) {\n const lk = clamp(r / 0.55, 0.45, 1)\n const lg = roundedBoxGeometry((0.07 + r * 0.04) * lk, (0.05 + r * 0.03) * lk, w * 0.42, 0.015 * lk)\n const M = new THREE.Matrix4().compose(\n new V3(Math.cos(a) * (r + 0.01 * clamp(r / 0.55, 0.45, 1)), Math.sin(a) * (r + 0.01 * clamp(r / 0.55, 0.45, 1)), sd * w * 0.24),\n new THREE.Quaternion().setFromEuler(new THREE.Euler(0, sd * (o.chevron ? 0.45 : 0), a)),\n new V3(1, 1, 1),\n )\n lg.applyMatrix4(M)\n lugs.push(lg)\n })\n }\n const lm = new THREE.Mesh(mergeGeometries(lugs), MATERIALS.rubber)\n lm.castShadow = true\n g.add(lm)\n }\n const rimMat = o.rim || MATERIALS.steel\n const rim = new THREE.Mesh(new THREE.CylinderGeometry(rr, rr, w * 0.78, 24), rimMat)\n rim.rotation.x = PI / 2\n g.add(rim)\n const dish = new THREE.Mesh(new THREE.CylinderGeometry(rr * 0.92, rr * 0.7, 0.05, 24), rimMat)\n dish.rotation.x = PI / 2\n dish.position.z = s * w * 0.36\n g.add(dish)\n const ns = o.spokes == null ? 5 : o.spokes\n for (let k = 0; k < ns; k++) {\n const sp = new THREE.Mesh(roundedBoxGeometry(rr * 0.85, rr * 0.2, 0.04, 0.015), o.spokeMat || rimMat)\n const a2 = (k / ns) * PI * 2\n sp.position.set(Math.cos(a2) * rr * 0.45, Math.sin(a2) * rr * 0.45, s * (w * 0.4))\n sp.rotation.z = a2\n g.add(sp)\n }\n const cap = new THREE.Mesh(new THREE.SphereGeometry(rr * 0.22, 14, 8), MATERIALS.chrome)\n cap.scale.z = 0.5\n cap.position.z = s * w * 0.42\n g.add(cap)\n for (let n = 0; n < 5; n++) {\n const nut = new THREE.Mesh(new THREE.CylinderGeometry(0.014, 0.014, 0.03, 6), MATERIALS.chrome)\n const an = (n / 5) * PI * 2 + 0.3\n nut.rotation.x = PI / 2\n nut.position.set(Math.cos(an) * rr * 0.33, Math.sin(an) * rr * 0.33, s * w * 0.43)\n g.add(nut)\n }\n g.userData.r = r\n this.wheels.push(g)\n if (!o.noPart)\n this.part(\n 'wheel',\n o.label || kit.t(x >= 0 ? 'parts.tire_front' : 'parts.tire_rear', { s }),\n g,\n new V3(x, r, z + s * w * 0.4),\n 0.9,\n )\n return g\n }\n /** Point in `c.vehicle` coordinates to effects-group coordinates (vehicle world, ground y = 0). */\n toEffects(p: any) {\n this.vehicle.updateMatrix()\n return p.clone().applyMatrix4(this.vehicle.matrix)\n }\n dirToEffects(d: any) {\n return d.clone().applyQuaternion(this.vehicle.quaternion)\n }\n\n\n /** Declares or refines a damage zone: `c.zone(id, label, box, parts, options)`. Pass `label === false` to remove an auto-derived zone. */\n zone(id: string, label: any, box?: any, parts?: any, o?: any) {\n const d: any = Object.assign({ id: id }, o || {})\n if (label === false) d.remove = true\n else if (label) d.name = label\n if (box) d.box = I.normalizeBox(box)\n if (parts) d.objs = Array.isArray(parts) ? parts.slice() : [parts]\n this.zoneDefs.push(d)\n return d\n }\n }\n kit.BuildContext = BuildContext\n I.BuildContext = BuildContext\n}\n","/** Soft body warp (sculpting) used for panel deformation. */\nimport type { Kit } from './types'\nimport { clamp, smooth } from './util'\n\nexport function installWarp(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const lod = kit.lod\n const { crease } = I\n\n /* ================= global rounding (warp), resampled loft ================= */\n /* makeWarp(o) creates f(x, y, z) -> [x, y, z] that rounds the front/rear in plan view and curves the side.\n o: { xF, xR, Lf, Lr, hw, bowF, bowR, pinF, pinR, belt, ys, yb, kt, kb, dropF, dropY }. applyWarp(c, f) deforms everything already assembled. */\n function makeWarp(o: any) {\n function sec(y: any) {\n if (y >= o.belt) return o.kt\n if (y >= o.ys) {\n const a = (y - o.ys) / (o.belt - o.ys)\n return o.kt * a * a\n }\n const b = clamp((o.ys - y) / (o.ys - o.yb), 0, 1.25)\n return o.kb * b * b\n }\n const f = function (x: any, y: any, z: any) {\n const tF = smooth((x - (o.xF - o.Lf)) / o.Lf)\n const tR = smooth((o.xR + o.Lr - x) / o.Lr)\n const u = Math.min(1.15, Math.abs(z) / o.hw)\n const u2 = u * u\n const dropF = o.dropF ? o.dropF * tF * u2 * smooth((y - o.dropY) / 0.25) : 0\n return [x - o.bowF * tF * u2 + o.bowR * tR * u2, y - dropF, z * (1 - sec(y)) * (1 - o.pinF * tF * tF) * (1 - o.pinR * tR * tR)]\n }\n f.sec = sec\n return f\n }\n function applyWarp(c: any, Wf: any) {\n c.root.updateMatrixWorld(true)\n const gInv = new THREE.Matrix4().copy(c.vehicle.matrixWorld).invert()\n const rel = new THREE.Matrix4()\n const irel = new THREE.Matrix4()\n const v = new V3()\n const use = new Map()\n c.root.traverse(function (o: any) {\n if (o.isMesh) use.set(o.geometry, (use.get(o.geometry) || 0) + 1)\n })\n const skip = new Set(c.wheels)\n const dset = new Set(c.deform)\n const yAx = new V3(0, 1, 0)\n function warpMesh(msh: any) {\n const g = msh.geometry\n if (use.get(g) > 1 || !g.attributes.position) return false\n rel.multiplyMatrices(gInv, msh.matrixWorld)\n irel.copy(rel).invert()\n const p = g.attributes.position\n for (let i = 0; i < p.count; i++) {\n v.fromBufferAttribute(p, i).applyMatrix4(rel)\n const r = Wf(v.x, v.y, v.z)\n v.set(r[0], r[1], r[2]).applyMatrix4(irel)\n p.setXYZ(i, v.x, v.y, v.z)\n }\n p.needsUpdate = true\n if (g.userData.crease) crease(g, 42)\n else g.computeVertexNormals()\n g.computeBoundingSphere()\n g.computeBoundingBox()\n return true\n }\n function rigid(o: any) {\n const p = o.position\n const r = Wf(p.x, p.y, p.z)\n const a = Wf(p.x, p.y, p.z - 0.03)\n const b = Wf(p.x, p.y, p.z + 0.03)\n const yaw = Math.atan2(b[0] - a[0], b[2] - a[2])\n p.set(r[0], r[1], r[2])\n if (Math.abs(yaw) > 1e-4) o.quaternion.premultiply(new THREE.Quaternion().setFromAxisAngle(yAx, yaw))\n }\n c.glass.forEach(function (gm: any) {\n const GD = gm.userData.glass\n if (!GD || !GD.outline || GD.zpos == null) return\n let cx = 0\n let cy = 0\n GD.outline.forEach(function (p: any) {\n cx += p.x\n cy += p.y\n })\n cx /= GD.outline.length\n cy /= GD.outline.length\n const f = Wf(cx, cy, GD.zpos)[2] / GD.zpos\n GD.outline = GD.outline.map(function (p: any) {\n const r = Wf(p.x, p.y, GD.zpos)\n return new THREE.Vector2(r[0], r[1])\n })\n GD.zpos *= f\n GD.Wg *= f\n })\n c.vehicle.children.slice().forEach(function (o: any) {\n if (skip.has(o) || o.userData.noWarp) return\n if (o.isMesh) {\n if (!warpMesh(o)) rigid(o)\n return\n }\n const defs: any = []\n o.traverse(function (x: any) {\n if (x !== o && x.isMesh && dset.has(x)) defs.push(x)\n })\n if (defs.length) defs.forEach(warpMesh)\n else rigid(o)\n })\n }\n function resample(st: any, n: any) {\n if (lod.on) n = Math.max(lod.minStations, Math.round(n * lod.stationFraction))\n const out = []\n const L = st.length\n function P(i: any) {\n return st[Math.max(0, Math.min(L - 1, i))]\n }\n for (let k = 0; k <= n; k++) {\n const u = (k / n) * (L - 1)\n const i = Math.min(L - 2, Math.floor(u))\n const t = u - i\n const a = P(i - 1)\n const b = P(i)\n const c2 = P(i + 1)\n const d = P(i + 2)\n const row = []\n for (let j = 0; j < b.length; j++) {\n let p0 = a[j] == null ? b[j] : a[j]\n let p1 = b[j]\n let p2 = c2[j]\n let p3 = d[j] == null ? c2[j] : d[j]\n p0 = p0 || 0\n p1 = p1 || 0\n p2 = p2 || 0\n p3 = p3 || 0\n row.push(0.5 * (2 * p1 + (-p0 + p2) * t + (2 * p0 - 5 * p1 + 4 * p2 - p3) * t * t + (-p0 + 3 * p1 - 3 * p2 + p3) * t * t * t))\n }\n out.push(row)\n }\n return out\n }\n function smoothLoft(st: any, o: any) {\n o = o || {}\n if (lod.on) o = Object.assign({}, o, { seg: Math.max(lod.minLoftSegments, Math.round((o.seg || 24) * lod.loftSegmentFraction)) })\n if (o.smooth) st = resample(st, o.smooth)\n const seg = o.seg || 24\n const pos: any = []\n const idx = []\n const ring = seg + 1\n const axisY = o.axis === 'y'\n st.forEach(function (s: any) {\n const a0 = s[1]\n const b0 = s[2]\n const cc = (a0 + b0) / 2\n const hh = Math.abs(a0 - b0) / 2\n const w = s[3] / 2\n const e = 2 / (s[4] || o.p || 2.4)\n const zc = s[5] || 0\n for (let j = 0; j <= seg; j++) {\n const a = (j / seg) * PI * 2\n const cs = Math.cos(a)\n const sn = Math.sin(a)\n const u = cc + hh * Math.sign(sn) * Math.pow(Math.abs(sn), e)\n const z = zc + w * Math.sign(cs) * Math.pow(Math.abs(cs), e)\n if (axisY) pos.push(u, s[0], z)\n else pos.push(s[0], u, z)\n }\n })\n for (let i = 0; i < st.length - 1; i++)\n for (let k = 0; k < seg; k++) {\n const A = i * ring + k\n const B = A + ring\n if (axisY) idx.push(A, B, A + 1, A + 1, B, B + 1)\n else idx.push(A, A + 1, B, A + 1, B + 1, B)\n }\n ;[0, st.length - 1].forEach(function (si, e) {\n const s = st[si]\n if (s[3] < 0.004) return\n const ci = pos.length / 3\n const cc = (s[1] + s[2]) / 2\n if (axisY) pos.push(cc, s[0], s[5] || 0)\n else pos.push(s[0], cc, s[5] || 0)\n for (let k = 0; k < seg; k++) {\n const a = si * ring + k\n const flip = (e === 0) !== axisY\n if (flip) idx.push(ci, a + 1, a)\n else idx.push(ci, a, a + 1)\n }\n })\n let g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n g.setIndex(idx)\n g = crease(g.toNonIndexed(), o.crease || 60)\n return g\n }\n kit.makeWarp = makeWarp\n kit.applyWarp = applyWarp\n kit.geo.resample = resample\n kit.geo.smoothLoft = smoothLoft\n\n Object.assign(I, { makeWarp, applyWarp, resample, smoothLoft })\n}\n","/** Car body shell, panels and body helpers. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installBody(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { MATERIALS, crease, cutGeometry, pathShape, subdivide, tumble } = I\n\n /* ================= bodies ================= */\n function halfAt(Wg: any, T: any, y: any) {\n return (Wg / 2) * (T ? 1 - T.k * clamp((y - T.belt) / (T.top - T.belt), 0, 1) : 1)\n }\n kit.halfAt = halfAt\n function shell(c: any, o: any) {\n const items = o.items.slice()\n if (o.arches)\n o.arches\n .slice()\n .sort(function (a: any, b: any) {\n return b[0] - a[0]\n })\n .forEach(function (a: any) {\n const a0 = Math.asin(clamp((o.bottomY - a[1]) / a[2], -1, 1))\n items.push({ arc: [a[0], a[1], a[2], a0, PI - a0, false] })\n })\n const bev = o.bev == null ? 0.05 : o.bev\n let geo = new THREE.ExtrudeGeometry(pathShape(items), {\n depth: Math.max(0.01, o.W - 2 * bev),\n bevelEnabled: bev > 0,\n bevelThickness: bev,\n bevelSize: bev,\n bevelSegments: 4,\n curveSegments: 14,\n steps: 1,\n })\n geo.translate(0, 0, -(o.W - 2 * bev) / 2)\n geo = subdivide(geo, o.sub || 0.2)\n tumble(geo, o.T)\n const tests = (o.holes || []).slice()\n let cut: any = {}\n if (o.arches && o.archInner != null)\n o.arches.forEach(function (a: any) {\n const zk = o.archInner\n tests.push({\n sel: function (n: any, ce: any) {\n const dx = a[0] - ce.x\n const dy = a[1] - ce.y\n const d = Math.hypot(dx, dy) || 1\n return d < a[2] + 0.08 && (n.x * dx + n.y * dy) / d > 0.4\n },\n sdf: function (x: any, y: any, z: any) {\n return Math.abs(z) - zk\n },\n })\n })\n if (tests.length) {\n const r = cutGeometry(geo, tests)\n geo = r.geo\n cut = r.cut\n }\n crease(geo, 42)\n const m = c.add(geo, o.mat || c.paint(o.col))\n c.deform.push(m)\n m.userData.cut = cut\n if (o.arches)\n o.arches.forEach(function (a: any) {\n const a0 = Math.asin(clamp((o.bottomY - a[1]) / a[2], -1, 1))\n const rr = a[2] - 0.01\n if (o.archInner == null) {\n const wl = c.add(new THREE.CylinderGeometry(rr, rr, o.W - 0.12, 20, 1, true, a0 + PI / 2, PI - 2 * a0), MATERIALS.dark, a[0], a[1], 0)\n wl.rotation.x = PI / 2\n wl.castShadow = false\n } else\n [1, -1].forEach(function (s) {\n const len = o.W / 2 - 0.06 - o.archInner\n const w2 = c.add(\n new THREE.CylinderGeometry(rr, rr, len, 20, 1, true, a0 + PI / 2, PI - 2 * a0),\n MATERIALS.dark,\n a[0],\n a[1],\n s * (o.archInner + len / 2),\n )\n w2.rotation.x = PI / 2\n w2.castShadow = false\n const cap = c.add(new THREE.CircleGeometry(rr, 20, a0, PI - 2 * a0), MATERIALS.dark, a[0], a[1], s * o.archInner)\n cap.castShadow = false\n })\n })\n return m\n }\n kit.shell = shell\n function autoWindows(gh: any) {\n const inn = 0.075\n const yb = gh.belt + 0.06\n const yt = gh.roof - 0.075\n function lx(x0: any, x1: any, y: any) {\n return x0 + ((x1 - x0) * (y - gh.belt)) / (gh.roof - gh.belt)\n }\n function rearX(y: any) {\n return lx(gh.rb, gh.rt, y) + inn * 1.3\n }\n function frontX(y: any) {\n return lx(gh.fb, gh.ft, y) - inn * 1.3\n }\n const ps = gh.pillars.slice().sort(function (a: any, b: any) {\n return a - b\n })\n const bounds = [-1e9]\n ps.forEach(function (p: any) {\n bounds.push(p - 0.06, p + 0.06)\n })\n bounds.push(1e9)\n const polys = []\n for (let i = 0; i < bounds.length; i += 2) {\n ;(function (xa, xb) {\n const L = function (y: any) {\n return Math.max(xa, rearX(y))\n }\n const R = function (y: any) {\n return Math.min(xb, frontX(y))\n }\n if (R(yb) - L(yb) > 0.15 && R(yt) - L(yt) > 0.05)\n polys.push([\n [L(yb), yb],\n [R(yb), yb],\n [R(yt), yt],\n [L(yt), yt],\n ])\n })(bounds[i], bounds[i + 1])\n }\n return polys\n }\n kit.autoWindows = autoWindows\n function profX(items: any, y: any, front: any) {\n let best = front ? -1e9 : 1e9\n for (let i = 0; i < items.length; i++) {\n const a = items[i]\n const b = items[(i + 1) % items.length]\n if (a.arc || b.arc) continue\n if ((a[1] - y) * (b[1] - y) <= 0 && a[1] !== b[1]) {\n const x = a[0] + ((b[0] - a[0]) * (y - a[1])) / (b[1] - a[1])\n best = front ? Math.max(best, x) : Math.min(best, x)\n }\n }\n return best\n }\n kit.profX = profX\n /* Real surface of the bodywork by ray. The shell of kit.shell/kit.car bulges 2 to 8 cm beyond the profile (bevel, tumble, sculpting),\n so a part, plate or text placed with profX() can end up buried. Use this to seat parts on the finished skin.\n kit.surfaceAt(c, origin, direction, { all, max }) -> { p, n, obj } in c.vehicle coordinates, or null.\n By default only paint and the meshes that dent count; all: true accepts any visible mesh. */\n const _sr = new THREE.Raycaster()\n kit.surfaceAt = function (c: any, org: any, dir: any, o: any) {\n o = o || {}\n c.root.updateMatrixWorld(true)\n const Mw = c.vehicle.matrixWorld\n const inv = new THREE.Matrix4().copy(Mw).invert()\n const dset = new Set(c.deform)\n const cands: any = []\n c.vehicle.traverse(function (q: any) {\n if (!q.isMesh || !q.visible || q.userData.glass || q.userData.decal || q.isSprite) return\n if (o.all || dset.has(q) || (c.paints && c.paints.has(q.material))) cands.push(q)\n })\n const d = (dir.isVector3 ? dir.clone() : new V3(dir[0], dir[1], dir[2])).normalize()\n const p0 = org.isVector3 ? org.clone() : new V3(org[0], org[1], org[2])\n _sr.set(p0.clone().applyMatrix4(Mw), d.clone().transformDirection(Mw))\n _sr.near = 0\n _sr.far = o.max || 20\n const h = _sr.intersectObjects(cands, false)[0]\n if (!h) return null\n const n = h.face ? h.face.normal.clone().transformDirection(h.object.matrixWorld).transformDirection(inv) : d.clone().negate()\n if (n.dot(d) > 0) n.negate()\n return { p: h.point.clone().applyMatrix4(inv), n: n, obj: h.object }\n }\n /* x of the skin at the front (front = true) or at the rear, at height y and side z; falls back to profX(items) if the ray finds nothing */\n kit.surfaceX = function (c: any, y: any, z: any, front: any, items: any) {\n const m = c.meta\n const sg = front === false ? -1 : 1\n const x0 = sg > 0 ? (m.front || 3) + 2 : (m.rear || -3) - 2\n const h = kit.surfaceAt(c, new V3(x0, y, z || 0), new V3(-sg, 0, 0))\n return h ? h.p.x : items ? profX(items, y, front !== false) : null\n }\n\n Object.assign(I, { halfAt, shell, autoWindows, profX, _sr })\n}\n","/** Glass panes: windshield quads, side windows and ghost glass. */\nimport type { Kit } from './types'\n\nexport function installGlass(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n const { MATERIALS, crease, cutGeometry, pathShape, subdivide, tumble, uvProject } = I\n\n /* ================= glass ================= */\n kit.addGlass = function (c: any, geo: any, label: any, type?: any, o?: any) {\n o = o || {}\n if (!geo.attributes.uv || o.reuv) o.aspect = uvProject(geo, o.uvAxes)\n const m = c.add(geo, o.mat || MATERIALS.glass)\n m.castShadow = false\n m.receiveShadow = false\n m.renderOrder = 2\n const L = I.resolveLabel(label)\n m.userData.glass = {\n type: type || 'tempered',\n label: L.label,\n key: L.key,\n outline: o.outline || null,\n side: o.side,\n Wg: o.Wg,\n T: o.T,\n zpos: o.zpos,\n aspect: o.aspect || 1,\n hits: 0,\n broken: false,\n }\n c.glass.push(m)\n c.deform.push(m)\n let pos = o.pos\n if (!pos) {\n geo.computeBoundingBox()\n pos = geo.boundingBox.getCenter(new V3()).add(m.position)\n }\n c.part('glass', L, m, pos, o.reach || 0.9)\n return m\n }\n /* registers a ready mesh (roundBox, sphere...) as glass; type \"laminated\" cracks, \"tempered\" shatters */\n kit.asGlass = function (c: any, mesh: any, label: any, type: any, o: any) {\n o = o || {}\n const i = c.deform.indexOf(mesh)\n if (i >= 0) c.deform.splice(i, 1)\n if (mesh.parent) mesh.parent.remove(mesh)\n const geo = mesh.geometry\n geo.applyMatrix4(new THREE.Matrix4().compose(mesh.position, mesh.quaternion, mesh.scale))\n if (o.reuv !== false) o.reuv = true\n return kit.addGlass(c, geo, label, type, Object.assign({ mat: mesh.material }, o))\n }\n kit.sideWindows = function (c: any, polys: any, Wg: any, T: any, label: any, o: any) {\n o = o || {}\n ;(o.sides || [1, -1]).forEach(function (s: any) {\n polys.forEach(function (poly: any, i: any) {\n const shp = pathShape(\n poly.map(function (p: any) {\n return [p[0], p[1], 0.035]\n }),\n )\n const geo = new THREE.ExtrudeGeometry(shp, { depth: 0.008, bevelEnabled: false, curveSegments: 4 })\n const zpos = s > 0 ? Wg / 2 + 0.004 : -Wg / 2 - 0.012\n geo.translate(0, 0, zpos)\n tumble(geo, T)\n geo.computeVertexNormals()\n const asp = uvProject(geo, 'xy')\n let cx = 0\n let cy = 0\n poly.forEach(function (p: any) {\n cx += p[0]\n cy += p[1]\n })\n cx /= poly.length\n cy /= poly.length\n const base = I.resolveLabel(label ? label(i, polys.length) : { key: 'window' })\n const lab = { key: base.key, label: kit.t('parts.glass_side', { label: base.label, s }) }\n kit.addGlass(c, geo, lab, o.type || 'tempered', {\n mat: o.mat || (o.see === false ? MATERIALS.glassDark : MATERIALS.glass),\n pos: new V3(cx, cy, s * I.halfAt(Wg, T, cy)),\n outline: shp.getSpacedPoints(56),\n side: s,\n Wg: Wg,\n T: T,\n zpos: zpos,\n aspect: asp,\n })\n const pts = shp.getSpacedPoints(36).map(function (p: any) {\n return [p.x, p.y, s * (I.halfAt(Wg, T, p.y) + 0.005)]\n })\n pts.pop()\n const seal = c.tube(pts, 0.011, MATERIALS.trim, { closed: true, seg: 72, rs: 5 })\n seal.castShadow = false\n })\n })\n }\n /* Cuts a ready mesh (mesh local coordinates) and recomputes the normals. */\n kit.cutMesh = function (mesh: any, tests: any, deg: any, o: any) {\n /* o.sub: subdivide first (edges longer than o.sub, in m) for windows inside large faces; drops colour/uv */\n const src = o && o.sub ? subdivide(mesh.geometry, o.sub) : mesh.geometry\n const r = cutGeometry(src, tests)\n crease(r.geo, deg || 42)\n mesh.geometry.dispose()\n mesh.geometry = r.geo\n return r.cut\n }\n kit.quadDef = function (pb: any, pt: any, Wg: any, T: any, which: any, bev: any, o: any) {\n o = o || {}\n bev = bev == null ? 0.05 : bev\n const dx = pt[0] - pb[0]\n const dy = pt[1] - pb[1]\n const L = Math.hypot(dx, dy)\n const ux = dx / L\n const uy = dy / L\n const nx = which === 'front' ? uy : -uy\n const ny = which === 'front' ? -ux : ux\n const ins = o.inset || 0.09\n const off = bev + 0.006\n const sd = o.side || 0.1\n const b = [pb[0] + ux * ins + nx * off, pb[1] + uy * ins + ny * off]\n const t = [pt[0] - ux * ins * 1.3 + nx * off, pt[1] - uy * ins * 1.3 + ny * off]\n const hb = I.halfAt(Wg, T, b[1]) - sd\n const ht = I.halfAt(Wg, T, t[1]) - sd\n return { pb: pb, pt: pt, L: L, u: [ux, uy], n: [nx, ny], ins: ins, b: b, t: t, hb: hb, ht: ht, which: which, bev: bev, Wg: Wg, T: T }\n }\n kit.glassQuad = function (c: any, q: any, label: any, o: any) {\n o = o || {}\n const NX = 10\n const NY = 8\n const pos = []\n const uv = []\n const idx = []\n for (let j = 0; j <= NY; j++)\n for (let i = 0; i <= NX; i++) {\n const u = i / NX\n const v = j / NY\n const x = q.b[0] + (q.t[0] - q.b[0]) * v\n const y = q.b[1] + (q.t[1] - q.b[1]) * v\n const hw = q.hb + (q.ht - q.hb) * v\n pos.push(x, y, -hw + 2 * hw * u)\n uv.push(u, v)\n }\n for (let jj = 0; jj < NY; jj++)\n for (let ii = 0; ii < NX; ii++) {\n const a = jj * (NX + 1) + ii\n const b = a + 1\n const cc = a + NX + 2\n const d = a + NX + 1\n if (q.which === 'front') idx.push(a, b, cc, a, cc, d)\n else idx.push(a, cc, b, a, d, cc)\n }\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n g.setAttribute('uv', new THREE.Float32BufferAttribute(uv, 2))\n g.setIndex(idx)\n g.computeVertexNormals()\n const m = kit.addGlass(c, g, label, o.type || 'laminated', {\n mat: o.mat || (o.see === false ? MATERIALS.glassDark : MATERIALS.glass),\n pos: new V3((q.b[0] + q.t[0]) / 2, (q.b[1] + q.t[1]) / 2, 0),\n aspect: (q.hb + q.ht) / (q.L - q.ins * 2.3),\n reach: 1.0,\n })\n const B0 = new V3(q.b[0], q.b[1], -q.hb)\n const B1 = new V3(q.b[0], q.b[1], q.hb)\n const T0 = new V3(q.t[0], q.t[1], -q.ht)\n const T1 = new V3(q.t[0], q.t[1], q.ht)\n ;[\n [B0, B1],\n [B1, T1],\n [T1, T0],\n [T0, B0],\n ].forEach(function (e) {\n c.rod(e[0], e[1], 0.012, MATERIALS.trim, { seg: 6 }).castShadow = false\n })\n c.quads.push(q)\n return m\n }\n\n Object.assign(I, {})\n}\n","/** Headlights and taillights in several styles, with beams and glow. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installLights(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const document = kit.document\n const { MATERIALS, mergeGeometries, roundedBoxGeometry, taper } = I\n\n /* ================= headlights, taillights, grilles ================= */\n function lampGroup(c: any, x: any, y: any, z: any, rotY: any) {\n const g = new THREE.Group()\n g.position.set(x, y, z)\n g.rotation.y = rotY || 0\n g.userData.rigid = true\n c.vehicle.add(g)\n return g\n }\n function gm(g: any, geo: any, mat: any, x?: any, y?: any, z?: any) {\n const m = new THREE.Mesh(geo, mat)\n m.position.set(x || 0, y || 0, z || 0)\n m.castShadow = false\n g.add(m)\n return m\n }\n function wedgeY(geo: any, w: any, s: any, k: any) {\n const p = geo.attributes.position\n for (let i = 0; i < p.count; i++) {\n const t = clamp((p.getZ(i) * s) / w + 0.5, 0, 1)\n p.setY(i, p.getY(i) * (1 - k * t) + k * t * 0.0)\n }\n p.needsUpdate = true\n geo.computeVertexNormals()\n return geo\n }\n /* additive halo of the headlight/taillight (sprite without raycast) */\n let haloTex: any = null\n function glowTexture() {\n if (haloTex) return haloTex\n const cv = document.createElement('canvas')\n cv.width = cv.height = 64\n const x: any = cv.getContext('2d')\n const gr = x.createRadialGradient(32, 32, 0, 32, 32, 32)\n gr.addColorStop(0, 'rgba(255,255,255,1)')\n gr.addColorStop(0.18, 'rgba(255,255,255,0.55)')\n gr.addColorStop(0.5, 'rgba(255,255,255,0.12)')\n gr.addColorStop(1, 'rgba(255,255,255,0)')\n x.fillStyle = gr\n x.fillRect(0, 0, 64, 64)\n haloTex = new THREE.CanvasTexture(cv)\n return haloTex\n }\n const haloMats: any = {}\n function halo(parent: any, x: any, y: any, z: any, size: any, hex: any, op: any) {\n const key = hex + op\n if (!haloMats[key])\n haloMats[key] = new THREE.SpriteMaterial({\n map: glowTexture(),\n color: new THREE.Color(hex),\n blending: THREE.AdditiveBlending,\n transparent: true,\n depthWrite: false,\n opacity: op,\n })\n const sp = new THREE.Sprite(haloMats[key])\n sp.position.set(x, y, z)\n sp.scale.set(size, size, 1)\n sp.raycast = function () {}\n sp.userData.decal = true\n sp.userData.halo = true\n sp.renderOrder = 4\n parent.add(sp)\n return sp\n }\n kit.halo = halo\n function lampKit(g: any, d: any, inner: any, lens: any, lensMat: any, refl?: any) {\n refl = refl || MATERIALS.reflector\n return {\n housing: function (w: any, h: any, y?: any, z?: any, geoFn?: any) {\n const geo = roundedBoxGeometry(d, h, w, Math.min(0.03, h * 0.4))\n if (geoFn) geoFn(geo)\n return gm(g, geo, MATERIALS.housing, 0, y || 0, z || 0)\n },\n lens: function (w: any, h: any, y?: any, z?: any, geoFn?: any) {\n const geo = roundedBoxGeometry(0.03, h + 0.006, w + 0.006, Math.min(0.025, h * 0.4))\n if (geoFn) geoFn(geo)\n const L = gm(g, geo, lensMat, d / 2 - 0.004, y || 0, z || 0)\n L.renderOrder = 3\n lens.push(L)\n return L\n },\n glow: function (geo: any, mat: any, x: any, y: any, z: any) {\n const m = gm(g, geo, mat, x, y, z)\n inner.push(m)\n return m\n },\n proj: function (y: any, z: any, r: any, mat: any) {\n const bz = gm(g, new THREE.CylinderGeometry(r * 1.3, r * 1.45, 0.03, 18), refl, d / 2 - 0.03, y, z)\n bz.rotation.z = -PI / 2\n if (refl !== MATERIALS.reflector) inner.push(bz)\n const e = gm(g, new THREE.SphereGeometry(r, 14, 10), mat, d / 2 - 0.022, y, z)\n e.scale.x = 0.55\n inner.push(e)\n return e\n },\n }\n }\n /* Headlight. o: { style: round|dround|rect|slim|split|wedge|ledbar|truck, x, y, z, w, h, d, side (+1 right / -1 left), yaw, mat, label } */\n kit.headlight = function (c: any, o: any) {\n const st = o.style || 'rect'\n const w = o.w || 0.32\n const h = o.h || 0.12\n const d = o.d || 0.09\n const s = o.side || (o.z >= 0 ? 1 : -1)\n const g = lampGroup(c, o.x, o.y, o.z, -s * (o.yaw || 0))\n const inner: any = []\n const lens: any = []\n const B = o.mat || MATERIALS.head\n const K = lampKit(g, d, inner, lens, o.lens || MATERIALS.lens, MATERIALS.reflectorLit)\n if (st === 'round' || st === 'dround') {\n const nR = st === 'dround' ? 2 : 1\n const r = Math.min(h / 2, w / (2 * nR)) * 0.95\n for (let i = 0; i < nR; i++) {\n const pz = nR === 1 ? 0 : ((i ? 1 : -1) * w) / 4\n const back = gm(g, new THREE.CylinderGeometry(r * 1.06, r * 1.06, d * 0.8, 22), MATERIALS.housing, 0, 0, pz)\n back.rotation.z = PI / 2\n const ring = gm(g, new THREE.TorusGeometry(r * 1.02, 0.013, 8, 30), MATERIALS.chrome, d / 2 - 0.006, 0, pz)\n ring.rotation.y = PI / 2\n const bowl = gm(g, new THREE.SphereGeometry(r * 0.96, 18, 10, 0, PI * 2, 0, PI / 2), MATERIALS.reflectorLit, d / 2 - 0.012, 0, pz)\n bowl.rotation.z = PI / 2\n bowl.scale.y = 0.55\n inner.push(bowl)\n K.glow(new THREE.SphereGeometry(r * 0.24, 12, 8), B, d / 2 - r * 0.3, 0, pz)\n const ln = gm(g, new THREE.SphereGeometry(r, 18, 10, 0, PI * 2, 0, PI / 2), o.lens || MATERIALS.lens, d / 2 - 0.008, 0, pz)\n ln.rotation.z = -PI / 2\n ln.scale.y = 0.3\n ln.renderOrder = 3\n lens.push(ln)\n }\n } else if (st === 'rect' || st === 'truck') {\n K.housing(w, h)\n const pr = Math.min(h * 0.3, w * 0.14)\n K.proj(0, -w * 0.2, pr, B)\n K.proj(0, st === 'truck' ? w * 0.08 : w * 0.18, pr, B)\n if (st === 'truck') K.glow(roundedBoxGeometry(0.02, h * 0.8, w * 0.2, 0.01), MATERIALS.amber, d / 2 - 0.02, 0, s * w * 0.38)\n else K.glow(roundedBoxGeometry(0.012, h * 0.2, w * 0.16, 0.006), MATERIALS.amber, d / 2 - 0.016, -h * 0.34, s * w * 0.4)\n K.lens(w, h)\n } else if (st === 'slim' || st === 'ledbar') {\n K.housing(w, h)\n K.glow(roundedBoxGeometry(0.012, Math.max(0.012, h * 0.18), w * 0.92, 0.005), MATERIALS.led, d / 2 - 0.014, h * 0.3, 0)\n K.proj(-h * 0.08, -s * w * 0.22, h * 0.26, B)\n K.proj(-h * 0.08, s * w * 0.06, h * 0.22, B)\n K.lens(w, h)\n } else if (st === 'split') {\n const hu = h * 0.26\n const hl = h * 0.62\n K.housing(w, hu, h / 2 - hu / 2)\n K.glow(roundedBoxGeometry(0.012, hu * 0.45, w * 0.92, 0.005), MATERIALS.led, d / 2 - 0.014, h / 2 - hu / 2, 0)\n K.lens(w, hu, h / 2 - hu / 2)\n K.housing(w * 0.8, hl, -h / 2 + hl / 2, -s * w * 0.08)\n K.proj(-h / 2 + hl / 2, -s * w * 0.25, hl * 0.3, B)\n K.proj(-h / 2 + hl / 2, s * w * 0.05, hl * 0.3, B)\n K.lens(w * 0.8, hl, -h / 2 + hl / 2, -s * w * 0.08)\n } else if (st === 'wedge') {\n const wf = function (geo: any) {\n wedgeY(geo, w, s, 0.45)\n }\n K.housing(w, h, 0, 0, wf)\n K.proj(h * 0.05, -s * w * 0.24, h * 0.25, B)\n K.proj(h * 0.05, s * w * 0.0, h * 0.2, B)\n K.glow(roundedBoxGeometry(0.012, 0.014, w * 0.72, 0.005), MATERIALS.led, d / 2 - 0.014, -h * 0.32, -s * w * 0.1)\n K.glow(roundedBoxGeometry(0.012, h * 0.42, 0.014, 0.005), MATERIALS.led, d / 2 - 0.014, -h * 0.14, s * w * 0.26)\n K.lens(w, h, 0, 0, wf)\n }\n const L: any = { group: g, inner: inner, lens: lens, kind: 'headlight', tint: 'clear', broken: false }\n if (o.halo !== false) L.halo = [halo(g, d / 2 + 0.03, 0, 0, Math.max(w, h) * 1.9 + 0.12, '#ffe7b8', 0.55)]\n c.lights.push(L)\n if (!o.noPart) {\n const pt = c.part('headlight', o.label || kit.t('parts.headlight', { s }), g, new V3(o.x, o.y, o.z), o.reach || 0.8)\n pt.light = L\n }\n return L\n }\n /* Taillight. o: { style: wrap|bar|vertical|L|round2, x, y, z, w, h, d, side, wrap (length of the wrap-around) } */\n kit.taillight = function (c: any, o: any) {\n const st = o.style || 'wrap'\n const w = o.w || 0.3\n const h = o.h || 0.14\n const d = o.d || 0.08\n const s = o.side || (o.z >= 0 ? 1 : -1)\n const ls = -s\n const g = lampGroup(c, o.x, o.y, o.z, PI)\n const inner: any = []\n const lens: any = []\n const K = lampKit(g, d, inner, lens, MATERIALS.lensRed)\n if (st === 'round2') {\n ;[-1, 1].forEach(function (q) {\n const r = Math.min(h / 2, w / 4) * 0.92\n const pz = (q * w) / 4\n const back = gm(g, new THREE.CylinderGeometry(r * 1.08, r * 1.08, d * 0.7, 20), MATERIALS.housing, 0, 0, pz)\n back.rotation.z = PI / 2\n const e = gm(g, new THREE.CylinderGeometry(r * 0.9, r * 0.9, 0.012, 20), q * ls > 0 ? MATERIALS.tail : MATERIALS.tail, d / 2 - 0.02, 0, pz)\n e.rotation.z = PI / 2\n inner.push(e)\n const ring = gm(g, new THREE.TorusGeometry(r, 0.01, 6, 24), MATERIALS.chrome, d / 2 - 0.004, 0, pz)\n ring.rotation.y = PI / 2\n const ln = gm(g, new THREE.SphereGeometry(r, 16, 8, 0, PI * 2, 0, PI / 2), MATERIALS.lensRed, d / 2 - 0.01, 0, pz)\n ln.rotation.z = -PI / 2\n ln.scale.y = 0.25\n ln.renderOrder = 3\n lens.push(ln)\n })\n } else if (st === 'vertical') {\n K.housing(w, h)\n K.glow(roundedBoxGeometry(0.012, h * 0.55, w * 0.8, 0.006), MATERIALS.tail, d / 2 - 0.016, h * 0.18, 0)\n K.glow(roundedBoxGeometry(0.012, h * 0.16, w * 0.8, 0.006), MATERIALS.amber, d / 2 - 0.016, -h * 0.22, 0)\n K.glow(roundedBoxGeometry(0.012, h * 0.12, w * 0.8, 0.006), MATERIALS.rev, d / 2 - 0.016, -h * 0.4, 0)\n K.lens(w, h)\n } else if (st === 'L') {\n const th = h * 0.42\n K.housing(w, th, h / 2 - th / 2)\n K.glow(roundedBoxGeometry(0.012, th * 0.6, w * 0.9, 0.006), MATERIALS.tail, d / 2 - 0.016, h / 2 - th / 2, 0)\n K.lens(w, th, h / 2 - th / 2)\n K.housing(w * 0.3, h - th, -th / 2, ls * w * 0.35)\n K.glow(roundedBoxGeometry(0.012, (h - th) * 0.7, w * 0.22, 0.006), MATERIALS.tail, d / 2 - 0.016, -th / 2, ls * w * 0.35)\n K.lens(w * 0.3, h - th, -th / 2, ls * w * 0.35)\n K.glow(roundedBoxGeometry(0.012, th * 0.4, w * 0.25, 0.006), MATERIALS.rev, d / 2 - 0.016, -h * 0.25, -ls * w * 0.1)\n } else {\n K.housing(w, h)\n K.glow(roundedBoxGeometry(0.012, h * 0.42, w * 0.88, 0.006), MATERIALS.tail, d / 2 - 0.016, h * 0.18, 0)\n K.glow(roundedBoxGeometry(0.012, h * 0.22, w * 0.3, 0.006), MATERIALS.rev, d / 2 - 0.016, -h * 0.22, -ls * w * 0.25)\n K.glow(roundedBoxGeometry(0.012, h * 0.22, w * 0.3, 0.006), MATERIALS.amber, d / 2 - 0.016, -h * 0.22, ls * w * 0.2)\n K.lens(w, h)\n if (st === 'wrap') {\n const wl = o.wrap || 0.2\n const side = gm(g, roundedBoxGeometry(wl, h * 0.9, 0.04, 0.015), MATERIALS.housing, d / 2 - wl / 2, 0, ls * (w / 2 - 0.01))\n const sg = gm(g, roundedBoxGeometry(wl * 0.85, h * 0.5, 0.012, 0.005), MATERIALS.tail, d / 2 - wl / 2, h * 0.12, ls * (w / 2 + 0.008))\n inner.push(sg)\n const sl = gm(g, roundedBoxGeometry(wl, h * 0.9 + 0.006, 0.014, 0.006), MATERIALS.lensRed, d / 2 - wl / 2, 0, ls * (w / 2 + 0.016))\n sl.renderOrder = 3\n lens.push(sl)\n side.castShadow = false\n }\n }\n const L: any = { group: g, inner: inner, lens: lens, kind: 'taillight', tint: 'red', broken: false }\n if (o.halo !== false) L.halo = [halo(g, d / 2 + 0.03, 0, 0, Math.max(w, h) * 1.5 + 0.08, '#ff2a1a', 0.4)]\n c.lights.push(L)\n if (!o.noPart) {\n const pt = c.part('taillight', o.label || kit.t('parts.taillight', { s }), g, new V3(o.x, o.y, o.z), o.reach || 0.8)\n pt.light = L\n }\n return L\n }\n /* light bar from end to end (ledbar at the front, bar at the rear). face: +1 front, -1 rear */\n kit.lightBar = function (c: any, x: any, y: any, z0: any, z1: any, h: any, face: any, mat: any) {\n const len = Math.abs(z1 - z0)\n const zc = (z0 + z1) / 2\n const f = face || 1\n const hs = c.roundBox(0.04, h + 0.012, len, 0.008, MATERIALS.housing, x, y, zc)\n hs.castShadow = false\n const gl = c.roundBox(0.014, h, len, 0.006, mat || (f > 0 ? MATERIALS.led : MATERIALS.tail), x + f * 0.016, y, zc)\n gl.castShadow = false\n const ln = c.roundBox(0.012, h + 0.014, len + 0.006, 0.006, f > 0 ? MATERIALS.lens : MATERIALS.lensRed, x + f * 0.026, y, zc)\n ln.castShadow = false\n ln.renderOrder = 3\n const L = { group: null, inner: [gl], lens: [ln], kind: f > 0 ? 'headlight' : 'taillight', tint: f > 0 ? 'clear' : 'red', broken: false }\n c.lights.push(L)\n const pt = c.part(f > 0 ? 'headlight' : 'taillight', { key: f > 0 ? 'led_bar' : 'taillight_bar' }, gl, new V3(x, y, zc), 0.6)\n pt.light = L\n return L\n }\n /* Generic emblem (chrome circle with a bar), never a real logo */\n kit.emblem = function (c: any, x: any, y: any, z: any, r: any, parent: any) {\n r = r || 0.045\n const g = new THREE.Group()\n g.position.set(x, y, z)\n g.userData.rigid = true\n ;(parent || c.vehicle).add(g)\n const d1 = gm(g, new THREE.CylinderGeometry(r, r, 0.012, 24), MATERIALS.chrome)\n d1.rotation.z = PI / 2\n const d2 = gm(g, new THREE.CylinderGeometry(r * 0.78, r * 0.78, 0.014, 24), MATERIALS.trim)\n d2.rotation.z = PI / 2\n gm(g, roundedBoxGeometry(0.016, r * 0.32, r * 1.4, 0.005), MATERIALS.chrome)\n gm(g, roundedBoxGeometry(0.016, r * 1.0, r * 0.22, 0.005), MATERIALS.chrome, 0, 0, r * 0.25).rotation.x = 0.5\n return g\n }\n /* Grille. o: { style: bars|mesh|big|seven|closed|truck, x, y, z, w, h, col, emblem } */\n kit.grille = function (c: any, o: any) {\n const st = o.style || 'bars'\n const w = o.w || 0.6\n const h = o.h || 0.16\n const g = lampGroup(c, o.x, o.y, o.z || 0, 0)\n let i\n const paint = c.paint(o.col || c.meta.color || '#6a6a6a')\n if (st === 'bars') {\n gm(g, roundedBoxGeometry(0.05, h, w, Math.min(0.03, h * 0.3)), MATERIALS.trim)\n const nb = Math.max(2, Math.round(h / 0.05))\n for (i = 0; i < nb; i++) gm(g, roundedBoxGeometry(0.02, 0.016, w * 0.92, 0.006), MATERIALS.chrome, 0.03, -h / 2 + ((i + 0.5) * h) / nb, 0)\n } else if (st === 'mesh') {\n gm(g, roundedBoxGeometry(0.05, h, w, Math.min(0.03, h * 0.3)), MATERIALS.housing)\n const cell = 0.026\n const list = []\n const rows = Math.floor((h * 0.85) / (cell * 1.6))\n const cols = Math.floor((w * 0.9) / (cell * 1.8))\n for (let rI = 0; rI < rows; rI++)\n for (let cI = 0; cI < cols; cI++) {\n const hg = new THREE.CylinderGeometry(cell, cell, 0.02, 6)\n hg.rotateZ(PI / 2)\n hg.rotateX(PI / 6)\n hg.translate(0.026, -h * 0.42 + ((rI + 0.5) * h * 0.85) / rows, -w * 0.45 + ((cI + 0.5 + (rI % 2) * 0.5 - 0.25) * w * 0.9) / cols)\n list.push(hg)\n }\n if (list.length) gm(g, mergeGeometries(list), MATERIALS.trim)\n gm(g, roundedBoxGeometry(0.022, 0.014, w, 0.006), MATERIALS.chrome, 0.03, h / 2 - 0.008, 0)\n } else if (st === 'big') {\n const fr = roundedBoxGeometry(0.06, h, w, 0.03)\n taper(fr, { sz: 1.12 })\n gm(g, fr, MATERIALS.chrome)\n gm(g, roundedBoxGeometry(0.064, h * 0.82, w * 0.9, 0.02), MATERIALS.housing, 0.002, 0, 0)\n const nb2 = Math.max(3, Math.round(h / 0.06))\n for (i = 0; i < nb2; i++)\n gm(g, roundedBoxGeometry(0.02, 0.02, w * (0.84 + (0.1 * i) / nb2), 0.006), MATERIALS.chrome, 0.036, -h * 0.38 + (i * h * 0.76) / (nb2 - 1), 0)\n } else if (st === 'seven') {\n gm(g, roundedBoxGeometry(0.04, h, w, Math.min(0.03, h * 0.3)), paint)\n for (i = 0; i < 7; i++) gm(g, roundedBoxGeometry(0.03, h * 0.72, w * 0.07, 0.01), MATERIALS.housing, 0.008, 0, -w * 0.42 + i * w * 0.14)\n } else if (st === 'closed') {\n gm(g, roundedBoxGeometry(0.03, h, w, Math.min(0.03, h * 0.4)), paint)\n gm(g, roundedBoxGeometry(0.012, 0.012, w * 0.9, 0.005), MATERIALS.chrome, 0.018, -h * 0.25, 0)\n } else if (st === 'truck') {\n gm(g, roundedBoxGeometry(0.06, h + 0.04, w + 0.04, 0.03), MATERIALS.chrome)\n gm(g, roundedBoxGeometry(0.064, h, w, 0.02), MATERIALS.housing, 0.004, 0, 0)\n const nb3 = Math.max(4, Math.round(h / 0.1))\n for (i = 0; i < nb3; i++) gm(g, roundedBoxGeometry(0.024, 0.03, w * 0.94, 0.008), MATERIALS.chrome, 0.04, -h / 2 + ((i + 0.5) * h) / nb3, 0)\n }\n g.children.forEach(function (m: any) {\n m.castShadow = true\n })\n if (o.emblem !== false) kit.emblem(c, 0.05, st === 'closed' ? h * 0.12 : 0, 0, Math.min(0.05, h * 0.3), g)\n return g\n }\n\n Object.assign(I, { lampGroup, gm, wedgeY, haloTex, glowTexture, haloMats, halo, lampKit })\n}\n","/** Cabin interior: seats, steering wheel, dashboard and bus rows. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installInterior(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, MATERIALS } = I\n\n /* ================= interior ================= */\n /* Seat. x = seat centre, fl = floor height, z = lateral centre. o: { w, h (seat height), len, back, lean, n (places on a bench seat), dir (+1 faces forward), mat, headrest } */\n kit.seat = function (c: any, x: any, fl: any, z: any, o: any) {\n o = o || {}\n if (o.face === '+z' || o.face === '-z') {\n /* seat facing sideways (troop, ambulance): built facing +x in a group and rotated */\n const gp = new THREE.Group()\n gp.position.set(x, 0, z)\n gp.rotation.y = o.face === '+z' ? -PI / 2 : PI / 2\n gp.userData.rigid = true\n c.vehicle.add(gp)\n const n0 = c.seatTops.length\n kit.seat(c, 0, fl, 0, Object.assign({}, o, { face: null, parent: gp, dir: 1 }))\n const st = c.seatTops[n0]\n if (st) {\n st.x = x\n st.z = z\n const t = st.w\n st.w = st.l\n st.l = t\n }\n return gp\n }\n const PR = o.parent\n const w = o.w || 0.5\n const h = o.h || 0.28\n const mat = o.mat || MATERIALS.seat\n const dir = o.dir || 1\n const n = o.n || 1\n const back = o.back || 0.6\n const lean = o.lean == null ? 0.22 : o.lean\n const cl = o.len || 0.48\n c.roundBox(cl * 0.7, Math.max(0.04, h - 0.1), w * 0.85, 0.03, MATERIALS.plastic, x, fl + Math.max(0.04, h - 0.1) / 2, z, { parent: PR })\n c.roundBox(cl, 0.12, w, 0.05, mat, x, fl + h - 0.05, z, { rot: [0, 0, dir * 0.06], parent: PR })\n const bx = x - dir * (cl / 2 - 0.03)\n const pw = w / n\n const sl = Math.sin(lean)\n const cs = Math.cos(lean)\n for (let j = 0; j < n; j++) {\n const zz = z + (j - (n - 1) / 2) * pw\n c.roundBox(0.12, back, pw - (n > 1 ? 0.02 : 0), 0.05, mat, bx - (dir * sl * back) / 2, fl + h + (cs * back) / 2 - 0.03, zz, {\n rot: [0, 0, dir * lean],\n parent: PR,\n })\n if (o.headrest !== false) {\n const hx = bx - dir * sl * (back + 0.1)\n const hy = fl + h + cs * (back + 0.1) - 0.03\n const hw = Math.min(0.26, pw * 0.62)\n c.roundBox(0.09, 0.15, hw, 0.04, mat, hx, hy, zz, { rot: [0, 0, dir * lean], parent: PR })\n ;[-1, 1].forEach(function (q) {\n c.rod(\n new V3(hx, hy - 0.06, zz + q * hw * 0.25),\n new V3(bx - dir * sl * back, fl + h + cs * back - 0.06, zz + q * hw * 0.25),\n 0.006,\n MATERIALS.chrome,\n { seg: 5, parent: PR },\n )\n })\n }\n }\n c.seatTops.push({ x: x, y: fl + h + 0.01, z: z, w: w, l: cl })\n }\n /* 3-spoke steering wheel with column. o: { r, tilt (rad), col (column length), mat } */\n kit.steeringWheel = function (c: any, x: any, y: any, z: any, o: any) {\n o = o || {}\n const r = o.r || 0.18\n const mat = o.mat || MATERIALS.plastic\n const g = new THREE.Group()\n g.position.set(x, y, z)\n g.rotation.z = -(o.tilt == null ? 0.42 : o.tilt)\n g.userData.rigid = true\n c.vehicle.add(g)\n const rim = c.add(new THREE.TorusGeometry(r, 0.018, 8, 30), mat, 0, 0, 0, g)\n rim.rotation.y = PI / 2\n c.cylinder(r * 0.3, r * 0.3, 0.06, mat, 0.015, 0, 0, 'x', { parent: g })\n c.cylinder(r * 0.12, r * 0.12, 0.01, MATERIALS.chrome, -0.018, 0, 0, 'x', { parent: g })\n ;[\n [0, 0, r],\n [0, 0, -r],\n [0, -r, 0],\n ].forEach(function (p) {\n c.rod(new V3(0.005, 0, 0), new V3(p[0], p[1] * 0.95, p[2] * 0.95), 0.016, mat, { parent: g, seg: 6 })\n })\n c.rod(new V3(0.03, 0, 0), new V3(o.col || 0.34, 0, 0), 0.032, mat, { parent: g, seg: 10 })\n return g\n }\n /* Aircraft control yoke. */\n kit.yoke = function (c: any, x: any, y: any, z: any, o: any) {\n o = o || {}\n const mat = o.mat || MATERIALS.plastic\n c.rod(new V3(x + 0.25, y, z), new V3(x, y, z), 0.018, MATERIALS.chrome)\n c.roundBox(0.04, 0.05, 0.3, 0.02, mat, x, y, z)\n ;[-1, 1].forEach(function (s) {\n c.roundBox(0.04, 0.14, 0.04, 0.018, mat, x - 0.01, y + 0.05, z + s * 0.14)\n })\n }\n /* Dashboard: body, faintly glowing instrument cluster, central infotainment, air vents, glove box.\n o: { x (front edge, next to the windshield), y (top), w, d, h, drv (driver z or null), mat, screen, gauges } */\n kit.dashboard = function (c: any, o: any) {\n const d = o.d || 0.5\n const h = o.h || 0.36\n const x = o.x\n const y = o.y\n const w = o.w\n const mat = o.mat || MATERIALS.plastic\n const xb = x - d\n c.roundBox(d, h, w, 0.06, mat, x - d / 2, y - h / 2, 0)\n c.roundBox(d * 0.85, 0.025, w - 0.04, 0.01, o.top || mat, x - d / 2 - 0.02, y + 0.005, 0)\n if (o.drv != null) {\n c.roundBox(0.14, 0.09, 0.4, 0.04, mat, xb + 0.06, y + 0.03, o.drv)\n ;[-0.09, 0.09].forEach(function (dz) {\n c.cylinder(0.055, 0.055, 0.012, MATERIALS.gauge, xb + 0.002, y - 0.005, o.drv + dz, 'x', { seg: 18 })\n c.cylinder(0.06, 0.06, 0.008, MATERIALS.chrome, xb + 0.006, y - 0.005, o.drv + dz, 'x', { seg: 18, open: true })\n c.roundBox(0.004, 0.045, 0.006, 0.002, MATERIALS.amber, xb - 0.006, y + 0.008, o.drv + dz, { rot: [0.9, 0, 0] })\n })\n }\n if (o.screen !== false) {\n const sc = c.roundBox(0.016, 0.13, Math.min(0.24, w * 0.18), 0.012, MATERIALS.screen, xb + 0.12, y + 0.07, 0, { rot: [0, 0, -0.2] })\n sc.castShadow = false\n }\n const vz = [-w * 0.4, -0.08, 0.08, w * 0.4]\n vz.forEach(function (z) {\n c.roundBox(0.016, 0.05, 0.11, 0.01, MATERIALS.chrome, xb - 0.002, y - 0.09, z)\n c.roundBox(0.016, 0.038, 0.095, 0.008, MATERIALS.dark, xb - 0.006, y - 0.09, z)\n })\n if (o.drv != null) c.roundBox(0.006, 0.12, w * 0.3, 0.004, MATERIALS.dark, xb - 0.003, y - 0.2, -Math.sign(o.drv || -1) * w * 0.25)\n }\n function consoleBox(c: any, x: any, fl: any, h: any, mat: any) {\n c.roundBox(0.62, h, 0.2, 0.04, mat, x, fl + h / 2, 0)\n c.rod(new V3(x + 0.18, fl + h, 0), new V3(x + 0.13, fl + h + 0.13, 0), 0.011, MATERIALS.chrome, { seg: 6 })\n c.sphere(0.03, MATERIALS.plastic, x + 0.13, fl + h + 0.14, 0)\n c.roundBox(0.1, 0.03, 0.1, 0.02, MATERIALS.dark, x + 0.18, fl + h + 0.01, 0)\n c.rod(new V3(x - 0.06, fl + h, 0.0), new V3(x - 0.26, fl + h + 0.08, 0), 0.016, MATERIALS.plastic, { seg: 8 })\n }\n /* Complete car interior. Measures in c.vehicle:\n o: { x0 (windshield base), ft (windshield top), rb/rt (rear glass base/top), roof, belt, floor, zIn (inner half width),\n zRoof, rows (1..3), col (fabric), trim (plastic), drive (-1 = driver on the left), front ('bench' for a 3-seat bench), xFront, xRear, noConsole } */\n kit.interior = function (c: any, o: any) {\n const fab = makeMaterial(o.col || '#2c2d30', { roughness: 0.88 })\n const trim = makeMaterial(o.trim || '#1b1c1f', { roughness: 0.7 })\n const x0 = o.x0\n const fl = o.floor\n const belt = o.belt\n const zi = o.zIn\n const rows = o.rows || 2\n const drv = o.drive || -1\n const zs = o.zSeat || Math.min(zi * 0.5, 0.42)\n const xf = o.xFront != null ? o.xFront : x0 - 1.0\n const seatH = o.seatH || Math.min(0.3, (belt - fl) * 0.5)\n const xr = o.xRear != null ? o.xRear : o.rb != null ? o.rb + 0.08 : xf - rows * 0.9\n c.roundBox(Math.max(0.2, x0 - 0.1 - xr), 0.04, zi * 2, 0.015, MATERIALS.carpet, (x0 - 0.1 + xr) / 2, fl, 0)\n c.meta.cabin = { x0: xr - 0.1, x1: x0 + 0.1, y0: fl - 0.05, y1: (o.roof != null ? o.roof : belt + 0.5) + 0.05, z: zi + 0.045 }\n kit.dashboard(c, {\n x: x0 - 0.07,\n y: belt + 0.04,\n w: zi * 2,\n d: 0.5,\n h: Math.min(0.42, belt + 0.04 - fl - 0.1),\n drv: drv * zs,\n mat: trim,\n top: fab,\n })\n kit.steeringWheel(c, x0 - 0.68, belt - 0.02, drv * zs, { mat: trim })\n const roof = o.roof != null ? o.roof : belt + 0.5\n function lim(y: any) {\n if (o.rb == null) return -1e9\n const t = clamp((y - belt) / (roof - belt), 0, 1)\n return o.rb + t * ((o.rt != null ? o.rt : o.rb) - o.rb) + 0.1\n }\n let x = xf\n for (let r = 0; r < rows; r++) {\n let back = r === 0 ? 0.6 : 0.56\n const lean = r === 0 ? 0.22 : 0.15\n let it\n if (r > 0)\n for (it = 0; it < 30; it++) {\n const ty = fl + seatH + back + 0.1\n const tx = x - 0.21 - Math.sin(lean) * (back + 0.1) - 0.05\n if (tx >= lim(ty)) break\n if (back > 0.44) back -= 0.02\n else x += 0.02\n }\n if (r === 0) {\n if (o.front === 'bench') {\n const wb = zi * 2 - 0.62\n kit.seat(c, x, fl, drv * zs, { w: 0.5, mat: fab, back: back, lean: lean, h: seatH })\n kit.seat(c, x, fl, -drv * (zi - wb / 2 - 0.03), { w: wb, n: 2, mat: fab, back: back, lean: lean, h: seatH })\n } else {\n ;[-1, 1].forEach(function (s) {\n kit.seat(c, x, fl, s * zs, { w: Math.min(0.52, zi - zs + 0.22), mat: fab, back: back, lean: lean, h: seatH })\n })\n if (!o.noConsole) consoleBox(c, x + 0.16, fl, Math.min(0.26, seatH), trim)\n }\n } else kit.seat(c, x, fl, 0, { w: zi * 2 - 0.1, n: r === 2 ? 2 : 3, mat: fab, back: back, lean: lean, h: seatH * 0.95 })\n ;[-1, 1].forEach(function (s) {\n c.roundBox(0.8, belt - fl - 0.08, 0.035, 0.015, trim, x + 0.12, (belt + fl) / 2 + 0.02, s * (zi + 0.02))\n c.roundBox(0.3, 0.05, 0.07, 0.02, fab, x + 0.16, fl + seatH + 0.16, s * (zi - 0.015))\n c.roundBox(0.08, 0.025, 0.02, 0.008, MATERIALS.chrome, x + 0.36, belt - 0.11, s * (zi - 0.005))\n })\n x -= r === 0 ? 0.88 : 0.8\n }\n if (o.ft != null) {\n const hx1 = o.ft - 0.04\n const hx0 = (o.rt != null ? o.rt : xr) + 0.04\n const zr = o.zRoof || zi * 0.9\n if (hx1 > hx0) c.roundBox(hx1 - hx0, 0.02, zr * 2, 0.01, MATERIALS.headliner, (hx0 + hx1) / 2, roof - 0.012, 0).castShadow = false\n c.rod(new V3(o.ft - 0.1, roof - 0.02, 0), new V3(o.ft - 0.12, roof - 0.08, 0), 0.008, MATERIALS.plastic, { seg: 5 })\n c.roundBox(0.03, 0.06, 0.22, 0.02, MATERIALS.plastic, o.ft - 0.12, roof - 0.11, 0)\n ;[-1, 1].forEach(function (s) {\n c.roundBox(0.02, 0.15, 0.34, 0.01, MATERIALS.headliner, o.ft - 0.14, roof - 0.07, s * zs, { rot: [0, 0, 0.35] })\n })\n }\n }\n /* Bus rows with a central aisle and grab poles.\n o: { x0 (front row), x1 (last), pitch, floor, zIn, aisle, col, seatH, ceil, poles, rails, mat (pole) } */\n kit.busRows = function (c: any, o: any) {\n const fab = makeMaterial(o.col || '#3b4a5a', { roughness: 0.85 })\n const pitch = o.pitch || 0.78\n const aisle = o.aisle || 0.48\n const zi = o.zIn\n const pw = zi - aisle / 2\n let n = 0\n const pm = o.mat || MATERIALS.chrome\n const ceil = o.ceil || o.floor + 2.0\n for (let x = o.x0; x >= o.x1 - 1e-6; x -= pitch) {\n ;[-1, 1].forEach(function (s) {\n kit.seat(c, x, o.floor, s * (aisle / 2 + pw / 2), {\n w: pw,\n n: 2,\n mat: fab,\n back: 0.52,\n lean: 0.12,\n h: o.seatH || 0.42,\n len: 0.42,\n headrest: false,\n })\n })\n if (o.poles !== false && n % 2 === 0)\n [-1, 1].forEach(function (s) {\n c.rod(new V3(x - 0.3, o.floor, (s * aisle) / 2), new V3(x - 0.3, ceil, (s * aisle) / 2), 0.016, pm, { seg: 8 })\n })\n n++\n }\n if (o.rails !== false)\n [-1, 1].forEach(function (s) {\n c.rod(new V3(o.x0 + 0.2, ceil - 0.12, s * (aisle / 2 + 0.05)), new V3(o.x1 - 0.4, ceil - 0.12, s * (aisle / 2 + 0.05)), 0.014, pm, {\n seg: 8,\n })\n })\n c.roundBox(o.x0 - o.x1 + 1.0, 0.03, zi * 2, 0.01, MATERIALS.carpet, (o.x0 + o.x1) / 2, o.floor, 0)\n return n\n }\n\n Object.assign(I, { consoleBox })\n}\n","/** Hoods, engine bays and hinge helpers. */\nimport type { Kit } from './types'\n\nexport function installHood(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, MATERIALS, crease, cutGeometry } = I\n\n /* ================= hood and engine bay ================= */\n /* Hood made from the skin cut out of the hull (shell holes with a tag). o: { x0 (hinge), col, open (rad), hole (extra hole, e.g. blower) } */\n kit.makeHood = function (c: any, geo: any, o: any) {\n o = o || {}\n if (!geo || !geo.attributes.position.count) return null\n if (o.hole) geo = cutGeometry(geo, [o.hole]).geo\n geo.computeBoundingBox()\n const bb = geo.boundingBox.clone()\n const p = geo.attributes.position\n const hx = o.x0 != null ? o.x0 : bb.min.x\n let hy = -1e9\n for (let i = 0; i < p.count; i++) if (p.getX(i) < bb.min.x + 0.08) hy = Math.max(hy, p.getY(i))\n const cx = (bb.min.x + bb.max.x) / 2\n const sx = 1 - 0.022 / Math.max(0.3, bb.max.x - bb.min.x)\n const sz = 1 - 0.022 / Math.max(0.3, bb.max.z - bb.min.z)\n for (let i = 0; i < p.count; i++) {\n p.setX(i, cx + (p.getX(i) - cx) * sx)\n p.setZ(i, p.getZ(i) * sz)\n p.setY(i, p.getY(i) + 0.008)\n }\n geo.translate(-hx, -hy, 0)\n const under = geo.clone()\n under.translate(0, -0.022, 0)\n crease(under, 42)\n crease(geo, 42)\n const piv = new THREE.Group()\n piv.position.set(hx, hy, 0)\n c.vehicle.add(piv)\n const top = new THREE.Mesh(geo, c.paint(o.col || c.meta.color || '#6a6a6a'))\n top.castShadow = true\n top.receiveShadow = true\n piv.add(top)\n const bot = new THREE.Mesh(under, MATERIALS.hoodLiner)\n piv.add(bot)\n c.deform.push(top, bot)\n c.hood = {\n piv: piv,\n ang: 0,\n target: 0,\n open: o.open || 1.05,\n latch: 0,\n x0: hx,\n x1: bb.max.x,\n y: hy,\n yMin: bb.min.y,\n zw: bb.max.z,\n label: o.label,\n noLatch: !!o.noLatch,\n }\n c.part('hood', { key: 'hood' }, piv, new V3((hx + bb.max.x) / 2, hy, 0), 0.9)\n return c.hood\n }\n /* Turns any set of meshes into a hinged hood (tractor, truck). pivot in c.vehicle; axis \"z\" (front rises). */\n kit.hinge = function (c: any, objs: any, pivot: any, o: any) {\n o = o || {}\n const piv = new THREE.Group()\n piv.position.copy(pivot)\n c.vehicle.add(piv)\n objs.forEach(function (m: any) {\n if (m.parent) m.parent.remove(m)\n m.position.sub(pivot)\n piv.add(m)\n })\n c.hood = {\n piv: piv,\n ang: 0,\n target: 0,\n open: o.open || 1.0,\n latch: 0,\n x0: pivot.x,\n x1: pivot.x + (o.len || 1),\n y: pivot.y,\n yMin: pivot.y,\n zw: o.zw || 0.5,\n sign: o.sign || 1,\n label: o.bayLabel,\n noLatch: !!o.noLatch,\n }\n c.part('hood', o.label || { key: 'hood' }, piv, pivot.clone().add(new V3((o.len || 1) / 2, 0, 0)), 0.9)\n return c.hood\n }\n /* Engine bay. o: { x0 (firewall), x1 (front), zw (half width), floor, top (free height under the hood), motor: gasoline|diesel|electric|v8 (with blower)|v8_na (naturally aspirated V8), axle (axle x, strut towers), col, frunk } */\n kit.engineBay = function (c: any, o: any) {\n const x0 = o.x0\n const x1 = o.x1\n const zw = o.zw\n const fl = o.floor\n const top = Math.max(o.top, fl + 0.22)\n const mot = o.motor || 'gasoline'\n const L = x1 - x0\n const H = top - fl\n const cx = (x0 + x1) / 2\n const paint = c.paint(o.col || c.meta.color || '#666')\n const out: any = {}\n c.roundBox(L, 0.03, 2 * zw, 0.01, MATERIALS.bay, cx, fl, 0)\n c.roundBox(0.03, H + 0.04, 2 * zw, 0.01, MATERIALS.bay, x0 + 0.015, fl + H / 2, 0)\n ;[1, -1].forEach(function (s) {\n c.roundBox(L, H * 0.75, 0.03, 0.01, MATERIALS.bay, cx, fl + H * 0.37, s * zw)\n })\n const rx = x1 - 0.06\n const rh = H * 0.82\n const rad = c.roundBox(0.05, rh, zw * 1.5, 0.012, MATERIALS.radiator, rx, fl + rh / 2 + 0.02, 0)\n for (let f = 0; f < 6; f++) c.roundBox(0.054, 0.006, zw * 1.46, 0.002, MATERIALS.steel, rx, fl + 0.06 + (f * (rh - 0.06)) / 6, 0)\n c.roundBox(0.07, 0.04, zw * 1.5, 0.015, MATERIALS.plastic, rx, fl + rh + 0.03, 0)\n out.rad = new V3(rx, fl + rh / 2, 0)\n const fanR = Math.min(rh * 0.42, zw * 0.45)\n const fg = new THREE.Group()\n fg.position.set(rx - 0.06, fl + rh / 2 + 0.02, 0)\n c.vehicle.add(fg)\n c.add(new THREE.TorusGeometry(fanR, 0.012, 6, 24), MATERIALS.plastic, 0, 0, 0, fg).rotation.y = PI / 2\n for (let b = 0; b < 7; b++) {\n const bl = c.roundBox(\n 0.012,\n fanR * 0.85,\n 0.06,\n 0.006,\n MATERIALS.plastic,\n 0,\n Math.cos((b / 7) * PI * 2) * fanR * 0.45,\n Math.sin((b / 7) * PI * 2) * fanR * 0.45,\n { parent: fg },\n )\n bl.rotation.x = (-b / 7) * PI * 2\n bl.rotation.y = 0.35\n }\n c.cylinder(fanR * 0.2, fanR * 0.2, 0.05, MATERIALS.steel, 0, 0, 0, 'x', { parent: fg })\n if (o.axle != null && o.axle > x0 && o.axle < x1)\n [1, -1].forEach(function (s) {\n c.cylinder(0.09, 0.12, H * 0.7, paint, o.axle, fl + H * 0.35, s * (zw - 0.12), null, { seg: 16 })\n for (let k = 0; k < 3; k++) {\n const a = (k / 3) * PI * 2\n c.cylinder(0.012, 0.012, 0.02, MATERIALS.steel, o.axle + Math.cos(a) * 0.055, fl + H * 0.7 + 0.01, s * (zw - 0.12) + Math.sin(a) * 0.055)\n }\n })\n function reservoir(x: any, y: any, z: any, w: any, h: any, d: any, shell: any, liq: any, cap: any) {\n c.roundBox(w, h, d, 0.02, shell, x, y, z).castShadow = false\n if (liq) c.roundBox(w * 0.85, h * 0.55, d * 0.85, 0.015, liq, x, y - h * 0.18, z)\n c.cylinder(0.026, 0.026, 0.025, cap, x, y + h / 2 + 0.012, z)\n }\n function battery(x: any, y: any, z: any, sc?: any) {\n sc = sc || 1\n c.roundBox(0.2 * sc, 0.15 * sc, 0.15 * sc, 0.015, makeMaterial('#1a1b1c', { roughness: 0.5 }), x, y, z)\n c.roundBox(0.2 * sc, 0.012, 0.15 * sc, 0.005, makeMaterial('#2e3a6a', { roughness: 0.5 }), x, y + 0.04 * sc, z)\n c.cylinder(0.016, 0.018, 0.03, MATERIALS.postRed, x + 0.06 * sc, y + 0.09 * sc, z + 0.045 * sc)\n c.cylinder(0.016, 0.018, 0.03, MATERIALS.postBlack, x + 0.06 * sc, y + 0.09 * sc, z - 0.045 * sc)\n c.tube(\n [\n [x + 0.06 * sc, y + 0.1 * sc, z + 0.045 * sc],\n [x + 0.1, y + 0.13, z + 0.1],\n [x + 0.2, y + 0.05, z + 0.12],\n ],\n 0.01,\n MATERIALS.postRed,\n { seg: 12, rs: 5 },\n )\n return new V3(x, y, z)\n }\n const uy = Math.min(top - 0.03, fl + H * 0.75)\n reservoir(x0 + 0.12, uy - 0.04, -zw * 0.55, 0.07, 0.06, 0.07, MATERIALS.coolant, makeMaterial('#c9b26a', { roughness: 0.3 }), MATERIALS.yellow)\n reservoir(x1 - 0.2, fl + H * 0.45, zw * 0.72, 0.12, 0.13, 0.1, MATERIALS.washer, makeMaterial('#3f8fc0', { roughness: 0.3 }), MATERIALS.capBlue)\n c.roundBox(0.12, 0.07, 0.13, 0.015, MATERIALS.plastic, x0 + 0.18, uy - 0.02, -zw * 0.78)\n c.roundBox(0.12, 0.006, 0.13, 0.003, MATERIALS.dark, x0 + 0.18, uy + 0.017, -zw * 0.78)\n if (mot === 'electric') {\n const fx0 = x0 + L * 0.4\n const fx1 = x1 - 0.14\n const fw = zw * 1.5\n const fh = H * 0.65\n const fy = fl + 0.02\n c.roundBox(fx1 - fx0, 0.02, fw, 0.01, MATERIALS.carpet, (fx0 + fx1) / 2, fy + 0.02, 0)\n ;[\n [fx0, 0],\n [fx1, 0],\n ].forEach(function (p) {\n c.roundBox(0.025, fh, fw, 0.01, MATERIALS.plastic, p[0], fy + fh / 2, 0)\n })\n ;[1, -1].forEach(function (s) {\n c.roundBox(fx1 - fx0, fh, 0.025, 0.01, MATERIALS.plastic, (fx0 + fx1) / 2, fy + fh / 2, (s * fw) / 2)\n })\n const ix = x0 + L * 0.2\n const iy = fl + H * 0.35\n c.roundBox(L * 0.24, H * 0.42, zw * 0.9, 0.03, makeMaterial('#9aa1a6', { metalness: 0.7, roughness: 0.35 }), ix, iy, zw * 0.1)\n for (let fin = 0; fin < 5; fin++)\n c.roundBox(\n L * 0.22,\n 0.03,\n 0.012,\n 0.004,\n makeMaterial('#b8bec2', { metalness: 0.7, roughness: 0.3 }),\n ix,\n iy + H * 0.21 + 0.012,\n zw * 0.1 - zw * 0.36 + fin * zw * 0.18,\n )\n c.text(kit.t('texts.high_voltage'), L * 0.2, 0.05, ix, iy + H * 0.215 + 0.008, zw * 0.1, '+y', {\n fg: '#121212',\n bg: '#f0a01e',\n w: 512,\n h: 128,\n size: 0.55,\n })\n ;[-0.12, 0.12].forEach(function (dz) {\n c.tube(\n [\n [ix - L * 0.1, iy - H * 0.1, zw * 0.1 + dz],\n [ix - L * 0.14, fl + 0.06, zw * 0.1 + dz * 1.5],\n [x0 + 0.04, fl + 0.03, dz * 2],\n ],\n 0.022,\n MATERIALS.hv,\n { seg: 16, rs: 6 },\n )\n })\n c.tube(\n [\n [ix + L * 0.12, iy, zw * 0.5],\n [fx0 - 0.03, iy + 0.02, zw * 0.7],\n [rx - 0.1, fl + rh * 0.8, zw * 0.6],\n ],\n 0.016,\n MATERIALS.hose,\n { seg: 16, rs: 6 },\n )\n battery(x0 + 0.14, fl + H * 0.25, -zw * 0.55, 0.65)\n reservoir(x0 + 0.13, fl + H * 0.62, zw * 0.72, 0.1, 0.1, 0.08, MATERIALS.coolant, MATERIALS.coolantLiq, MATERIALS.postBlack)\n out.motor = new V3(ix, iy, 0)\n out.inverter = new V3(ix, iy, 0)\n out.frunk = new V3((fx0 + fx1) / 2, fy, 0)\n } else if (mot === 'v8' || mot === 'v8_na') {\n const bx = cx - L * 0.05\n const by = fl + H * 0.3\n const bl = L * 0.55\n c.roundBox(bl, H * 0.45, zw * 0.7, 0.04, makeMaterial('#2f5a8a', { metalness: 0.5, roughness: 0.4 }), bx, by, 0)\n ;[1, -1].forEach(function (s) {\n c.roundBox(bl * 0.9, 0.07, zw * 0.32, 0.03, MATERIALS.chrome, bx, by + H * 0.25, s * zw * 0.3, { rot: [s * 0.5, 0, 0] })\n for (let h2 = 0; h2 < 4; h2++)\n c.tube(\n [\n [bx - bl * 0.35 + h2 * bl * 0.23, by, s * zw * 0.38],\n [bx - bl * 0.35 + h2 * bl * 0.23, by - 0.08, s * zw * 0.7],\n [bx - bl * 0.3, fl + 0.05, s * zw * 0.85],\n ],\n 0.02,\n MATERIALS.chrome,\n { seg: 12, rs: 6 },\n )\n })\n let bly = top - 0.02\n if (mot === 'v8') {\n c.roundBox(bl * 0.75, 0.22, zw * 0.42, 0.04, MATERIALS.chrome, bx, bly, 0)\n for (let rb2 = 0; rb2 < 6; rb2++) c.roundBox(bl * 0.75, 0.012, 0.012, 0.004, MATERIALS.steel, bx, bly + 0.03, -zw * 0.18 + rb2 * zw * 0.072)\n c.roundBox(0.2, 0.16, 0.24, 0.03, MATERIALS.chrome, bx + 0.02, bly + 0.19, 0)\n ;[-0.06, 0.06].forEach(function (dz) {\n c.roundBox(0.07, 0.1, 0.09, 0.02, MATERIALS.dark, bx + 0.09, bly + 0.2, dz)\n })\n } else {\n /* modern naturally aspirated V8: low intake manifold with plastic cover, throttle body and duct to the air filter box */\n bly = Math.min(top - 0.06, by + H * 0.42)\n c.roundBox(bl * 0.62, 0.09, zw * 0.4, 0.035, MATERIALS.cover, bx, bly, 0)\n c.roundBox(bl * 0.5, 0.012, zw * 0.3, 0.005, MATERIALS.plastic, bx, bly + 0.05, 0)\n c.cylinder(0.055, 0.055, 0.06, MATERIALS.steel, bx + bl * 0.36, bly, 0, 'x')\n c.tube(\n [\n [bx + bl * 0.39, bly, 0],\n [bx + bl * 0.5, bly + 0.02, zw * 0.25],\n [x0 + L * 0.82, fl + H * 0.55, zw * 0.55],\n ],\n 0.045,\n MATERIALS.hose,\n { seg: 14, rs: 8 },\n )\n c.roundBox(0.26, 0.14, 0.22, 0.03, MATERIALS.plastic, x0 + L * 0.82, fl + H * 0.5, zw * 0.62)\n }\n c.cylinder(0.07, 0.07, 0.04, MATERIALS.steel, bx + bl * 0.4, by + H * 0.2, 0, 'x')\n c.tube(\n [\n [bx + bl * 0.42, by + H * 0.2 + 0.07, 0],\n [bx + bl * 0.42, bly + 0.06, 0],\n ],\n 0.012,\n MATERIALS.hose,\n { seg: 4, rs: 5 },\n )\n battery(x0 + 0.16, fl + 0.1, zw * 0.62)\n out.motor = new V3(bx, by, 0)\n if (mot === 'v8') out.blower = new V3(bx, bly, 0)\n } else {\n const ex = x0 + L * 0.48\n const bh = H * 0.5\n const bz = zw * 0.95\n const ey = fl + 0.04 + bh / 2\n const eb = Math.min(0.42, L * 0.36)\n c.roundBox(eb, bh, bz, 0.03, MATERIALS.block, ex, ey, -zw * 0.1)\n const cover = mot === 'diesel' ? makeMaterial('#2b2d30', { metalness: 0.3, roughness: 0.4 }) : MATERIALS.cover\n c.roundBox(eb * 0.82, 0.07, bz * 0.92, 0.03, cover, ex, ey + bh / 2 + 0.03, -zw * 0.1)\n for (let rib = 0; rib < 4; rib++)\n c.roundBox(eb * 0.7, 0.012, 0.014, 0.004, MATERIALS.steel, ex, ey + bh / 2 + 0.07, -zw * 0.1 - bz * 0.36 + rib * bz * 0.24)\n c.cylinder(0.03, 0.03, 0.028, MATERIALS.yellow, ex - eb * 0.2, ey + bh / 2 + 0.08, -zw * 0.1 + bz * 0.28)\n const plx = ex + eb / 2 + 0.07\n const ply = ey + bh * 0.1\n c.roundBox(0.07, bh * 0.4, bz * 0.7, 0.02, MATERIALS.block, plx, ply, -zw * 0.1)\n for (let rn = 0; rn < 4; rn++) {\n const rz = -zw * 0.1 - bz * 0.3 + rn * bz * 0.2\n c.tube(\n [\n [ex + eb * 0.3, ey + bh / 2 + 0.02, rz],\n [plx - 0.02, ey + bh / 2 + 0.03, rz],\n [plx, ply + bh * 0.15, rz],\n ],\n 0.018,\n MATERIALS.block,\n { seg: 10, rs: 6 },\n )\n }\n const afx = x1 - L * 0.32\n const afy = Math.min(top - 0.07, fl + H * 0.7)\n c.roundBox(0.22, 0.1, 0.26, 0.03, MATERIALS.plastic, afx, afy, zw * 0.5)\n c.roundBox(0.22, 0.012, 0.26, 0.004, MATERIALS.dark, afx, afy + 0.01, zw * 0.5)\n c.tube(\n [\n [afx - 0.11, afy, zw * 0.4],\n [plx + 0.02, afy, zw * 0.15],\n [plx, ply + bh * 0.2, -zw * 0.1 + bz * 0.35],\n ],\n 0.04,\n MATERIALS.hose,\n { seg: 16, rs: 8 },\n )\n out.batt = battery(x0 + L * 0.2, fl + 0.1, zw * 0.62)\n reservoir(x0 + L * 0.22, fl + H * 0.6, -zw * 0.65, 0.12, 0.12, 0.1, MATERIALS.coolant, MATERIALS.coolantLiq, MATERIALS.postBlack)\n c.tube(\n [\n [rx - 0.03, fl + rh * 0.85, -zw * 0.3],\n [ex + eb * 0.6, ey + bh * 0.3, -zw * 0.4],\n [ex + eb / 2, ey + bh * 0.2, -zw * 0.3],\n ],\n 0.025,\n MATERIALS.hose,\n { seg: 14, rs: 6 },\n )\n c.tube(\n [\n [rx - 0.03, fl + 0.06, zw * 0.2],\n [ex + eb * 0.7, fl + 0.05, 0],\n [ex + eb / 2, ey - bh * 0.3, -zw * 0.2],\n ],\n 0.025,\n MATERIALS.hose,\n { seg: 14, rs: 6 },\n )\n if (mot === 'diesel' && o.turbo !== false) {\n const tx = ex - eb * 0.1\n const ty = ey + bh * 0.1\n const tz = zw * 0.35\n const snail = c.add(new THREE.TorusGeometry(0.06, 0.035, 10, 20), makeMaterial('#8a8478', { metalness: 0.7, roughness: 0.5 }), tx, ty, tz)\n snail.rotation.x = PI / 2\n c.cylinder(0.045, 0.05, 0.08, makeMaterial('#7b756b', { metalness: 0.7, roughness: 0.5 }), tx, ty + 0.05, tz)\n const icx = ex + eb * 0.1\n const icy = ey + bh / 2 + 0.13\n c.roundBox(0.22, 0.05, bz * 0.6, 0.015, makeMaterial('#a7adb1', { metalness: 0.7, roughness: 0.35 }), icx, Math.min(icy, top - 0.04), -zw * 0.05)\n c.tube(\n [\n [tx, ty + 0.09, tz],\n [tx + 0.05, Math.min(icy, top - 0.04), tz],\n [icx - 0.08, Math.min(icy, top - 0.04), zw * 0.15],\n ],\n 0.025,\n MATERIALS.steel,\n { seg: 10, rs: 6 },\n )\n out.turbo = new V3(tx, ty, tz)\n }\n out.motor = new V3(ex, ey, -zw * 0.1)\n }\n c.part('engine', { key: mot === 'electric' ? 'engine_electric' : 'engine' }, null, out.motor, 1.0)\n c.part('radiator', { key: 'radiator' }, rad, out.rad, 0.9)\n c.meta.bay = {\n x0: x0,\n x1: x1,\n zw: zw,\n floor: fl,\n top: top,\n motor: mot,\n center: new V3(cx, fl + H * 0.5, 0),\n label: o.label,\n turbo: o.turbo,\n view: o.view,\n }\n return out\n }\n\n Object.assign(I, {})\n}\n","/** The generic car builder: shell, glasshouse, lights, wheels, interior and engine bay in one call. */\nimport type { Kit } from './types'\n\nexport function installCar(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, MATERIALS } = I\n\n /* ================= generic car ================= */\n /* spec of kit.car(c, spec). Lengths in metres; +x is the front of the vehicle.\n W body width\n col, roofCol paint colour (and optional roof colour)\n bottomY height of the lower edge of the body; noseY / tailY: height at which the front / rear ends are measured\n lower side profile of the lower body: [[x, y, cornerRadius], ...] from rear to front\n arches wheel arches: [[x, wheelCentreY, radius], ...]\n gh glasshouse (the greenhouse): { rb, rt: x of the rear base / top, ft, fb: x of the front top / base, belt: beltline height,\n roof: roof height, Wg: glasshouse width, k: corner softness, pillars: [x, ...], r1, r2 }\n seams, handles optional panel seams and door handles\n hl, tl headlights / taillights: { style, w, h, y, in, yaw }\n grille { style, w, h, y } or false\n interior { rows, col, trim } or false\n hood { motor, front } | true | false (engine bay under an opening hood)\n wheels [[x, radius, width, options], ...]\n bodyBumper, mirrorCol, noAntenna, plateRearY misc. options */\n kit.car = function (c: any, s: any) {\n const W = s.W\n const gh = s.gh\n const bev = 0.05\n const T = { belt: gh.belt, top: gh.roof + bev, k: gh.k }\n const m = c.meta\n m.color = s.col\n m.kind = m.kind || 'car'\n const front = I.profX(s.lower, s.noseY, true)\n const rear = I.profX(s.lower, s.tailY, false)\n const intr = s.interior === false ? null : Object.assign({ rows: 2 }, s.interior || {})\n const hoodO = s.hood ? Object.assign({ motor: 'gasoline' }, s.hood === true ? {} : s.hood) : null\n let tireW = 0.2\n ;(s.wheels || []).forEach(function (w: any) {\n tireW = Math.max(tireW, w[2])\n })\n const low = []\n if (intr) low.push(kit.holeTop(gh.rb + 0.05, gh.fb - 0.03, gh.Wg / 2 - 0.05, gh.belt - 0.3))\n const hx0 = gh.fb + 0.08\n const hx1 = front - (hoodO && hoodO.front != null ? hoodO.front : 0.2)\n const zH = W / 2 - 0.13\n if (hoodO) low.push(kit.holeTop(hx0, hx1, zH, s.bottomY + 0.2, 'hood'))\n ;(s.holes || []).forEach(function (h: any) {\n low.push(h)\n })\n const lowMesh = I.shell(c, {\n items: s.lower,\n bottomY: s.bottomY,\n arches: s.arches,\n W: W,\n col: s.col,\n holes: low,\n archInner: intr || hoodO ? W / 2 - tireW - 0.16 : null,\n })\n const ghItems = [\n [gh.rb, gh.belt - 0.1, 0],\n [gh.rt, gh.roof, gh.r1 || 0.12],\n [gh.ft, gh.roof, gh.r2 || 0.2],\n [gh.fb, gh.belt - 0.1, 0],\n ]\n const polys = I.autoWindows(gh)\n const qf = kit.quadDef([gh.fb, gh.belt], [gh.ft, gh.roof], gh.Wg, T, 'front', bev)\n const qr = kit.quadDef([gh.rb, gh.belt], [gh.rt, gh.roof], gh.Wg, T, 'rear', bev)\n const gHoles = []\n if (intr) {\n polys.forEach(function (p: any) {\n gHoles.push(kit.holeSide(p))\n })\n gHoles.push(\n kit.holeQuad(qf),\n kit.holeQuad(qr),\n kit.holeWhere(function (n: any, ce: any) {\n return n.y < -0.7 && ce.y < gh.belt + 0.02\n }),\n )\n }\n I.shell(c, { items: ghItems, W: gh.Wg, col: s.roofCol || s.col, T: T, holes: gHoles, sub: intr ? 0.12 : 0.2 })\n kit.sideWindows(\n c,\n polys,\n gh.Wg,\n T,\n function (i: any, n: any) {\n return { key: i === 0 && n > 2 ? 'quarter_glass' : i === n - 1 ? 'window_front' : 'window_rear' }\n },\n { see: !!intr },\n )\n kit.glassQuad(c, qf, { key: 'windshield' }, { see: !!intr })\n kit.glassQuad(c, qr, { key: 'rear_window' }, { see: !!intr, mat: intr ? MATERIALS.rearTint : MATERIALS.glassDark })\n m.length = front - rear\n m.width = W\n m.front = front\n m.rear = rear\n m.clearance = s.bottomY\n m.belt = gh.belt\n m.top = gh.roof + bev\n m.bodyHeight = gh.belt - s.bottomY\n m.roof = { x0: gh.rt + 0.1, x1: gh.ft - 0.1, w: I.halfAt(gh.Wg, T, gh.roof) * 1.7, y: gh.roof + bev }\n m.glasshouse = gh\n m.tumble = T\n m.frontQuad = qf\n if (intr)\n kit.interior(\n c,\n Object.assign(\n {\n x0: gh.fb,\n ft: gh.ft,\n rb: gh.rb,\n rt: gh.rt,\n roof: gh.roof,\n belt: gh.belt,\n floor: s.bottomY + 0.1,\n zIn: gh.Wg / 2 - 0.09,\n zRoof: I.halfAt(gh.Wg, T, gh.roof) - 0.12,\n xRear: gh.rb + 0.06,\n },\n intr,\n ),\n )\n if (hoodO) {\n let fa = -1e9\n ;(s.arches || []).forEach(function (a: any) {\n fa = Math.max(fa, a[0])\n })\n const bxv8 = hx0 + (hx1 - hx0) * 0.45\n const hood = kit.makeHood(c, lowMesh.userData.cut.hood, {\n x0: hx0,\n col: s.col,\n hole: hoodO.motor === 'v8' ? kit.holeBox([bxv8 - 0.2, -9, -0.16], [bxv8 + 0.24, 9, 0.16]) : null,\n })\n if (hood)\n kit.engineBay(c, {\n x0: hx0 + 0.02,\n x1: hx1,\n zw: zH - 0.02,\n floor: s.bottomY + 0.12,\n top: hood.yMin - 0.035,\n motor: hoodO.motor,\n axle: fa,\n col: s.col,\n })\n }\n kit.carDetails(c, s)\n m.arches = s.arches || null\n if (s.bed) m.bed = s.bed\n if (s.under !== false)\n kit.underbody(c, {\n W: W,\n bottomY: s.bottomY,\n wheels: s.wheels || [],\n motor: hoodO ? hoodO.motor : s.motor || 'gasoline',\n spare: s.spareUnder,\n })\n if (s.warp) I.applyWarp(c, typeof s.warp === 'function' ? s.warp : I.makeWarp(s.warp))\n }\n /* Underbody visible when rolled over: axles, arms, oil pan, differential (rear-wheel drive), exhaust with muffler, tank, spare wheel.\n o: { W, bottomY, wheels: [[x, r, w]..], motor, spare (true = spare wheel under the rear) } */\n kit.underbody = function (c: any, o: any) {\n const m = c.meta\n const W = o.W\n const by = o.bottomY\n const ws = o.wheels\n .map(function (w: any) {\n return w\n })\n .sort(function (a: any, b: any) {\n return b[0] - a[0]\n })\n if (ws.length < 2) return\n const fx = ws[0][0]\n const rx = ws[ws.length - 1][0]\n const rr = ws[ws.length - 1][1]\n const tw = ws[0][2]\n const zW = W / 2 - tw - 0.04\n const yU = Math.max(0.12, by - 0.035)\n const ug = new THREE.Group()\n ug.userData.rigid = true\n c.vehicle.add(ug)\n m.underbodyGroup = ug\n const DK = makeMaterial('#1a1b1c', { roughness: 0.75, metalness: 0.3 })\n const ST = MATERIALS.steel\n function box(w: any, h: any, d: any, mat: any, x: any, y: any, z: any) {\n return c.roundBox(w, h, d, Math.min(0.02, h * 0.4), mat, x, y, z, { parent: ug })\n }\n function rod(a: any, b: any, r: any, mat: any) {\n return c.rod(a, b, r, mat, { parent: ug, seg: 8 })\n }\n const diesel = o.motor === 'diesel' || o.motor === 'v8' || o.motor === 'v8_na'\n const ev = o.motor === 'electric'\n /* front axle: half shafts and wishbones */\n ;[1, -1].forEach(function (sd) {\n rod(new V3(fx, ws[0][1], sd * 0.12), new V3(fx, ws[0][1], sd * zW), 0.028, ST)\n rod(new V3(fx - 0.25, yU + 0.02, sd * 0.3), new V3(fx, ws[0][1] - 0.1, sd * zW), 0.022, DK)\n rod(new V3(rx + 0.35, yU + 0.02, sd * 0.25), new V3(rx, rr - 0.08, sd * zW), 0.026, DK)\n })\n if (diesel) {\n rod(new V3(rx, rr, -zW), new V3(rx, rr, zW), 0.045, ST)\n c.sphere(0.13, ST, rx, rr, 0, 1, 0.85, 1, { parent: ug })\n rod(new V3(rx + 0.1, rr, 0), new V3(fx - 0.6, yU + 0.04, 0), 0.035, ST)\n } else box(0.09, 0.08, zW * 2, DK, rx + 0.08, Math.max(yU, rr - 0.12), 0)\n if (!ev) {\n box(Math.min(0.5, (fx - rx) * 0.2), 0.1, 0.38, DK, fx - 0.25, yU + 0.01, -0.05)\n const tz = W * 0.3\n const mx = rx - 0.15\n const ty = Math.max(0.14, by - 0.06)\n c.tube(\n [\n [fx - 0.35, yU, 0.12],\n [fx - 0.9, ty, 0.14],\n [(fx + rx) / 2, ty, 0.16],\n [rx + 0.5, ty, tz * 0.5],\n [mx + 0.3, ty, tz * 0.8],\n ],\n 0.03,\n ST,\n { parent: ug, seg: 30, rs: 6 },\n )\n c.cylinder(0.1, 0.1, 0.42, ST, mx, ty + 0.02, tz, 'x', { parent: ug })\n box(0.24, 0.06, 0.2, DK, (fx + rx) / 2 + 0.1, ty, 0.16)\n box(0.55, 0.18, W * 0.5, makeMaterial('#232527', { roughness: 0.7 }), rx + 0.62, Math.max(0.16, by - 0.02), -W * 0.1)\n } else {\n box(\n (fx - rx) * 0.72,\n 0.1,\n W - 0.4,\n makeMaterial('#2a2e31', { roughness: 0.6, metalness: 0.4 }),\n (fx + rx) / 2,\n Math.max(0.14, by - 0.03),\n 0,\n )\n for (let k = 0; k < 6; k++) box(0.03, 0.02, W - 0.45, ST, rx + 0.4 + (k * (fx - rx - 0.8)) / 5, Math.max(0.14, by - 0.03) - 0.06, 0)\n }\n if (o.spare && m.rear < rx - 0.7) {\n c.cylinder(0.32, 0.32, 0.2, MATERIALS.rubber, rx - 0.55, Math.max(0.2, by - 0.05), 0, null, { parent: ug })\n c.cylinder(0.2, 0.2, 0.21, ST, rx - 0.55, Math.max(0.2, by - 0.05), 0, null, { parent: ug })\n }\n ug.traverse(function (x: any) {\n x.castShadow = false\n })\n return ug\n }\n kit.carDetails = function (c: any, s: any) {\n const m = c.meta\n const W = m.width\n const by = s.bottomY\n const it = s.lower\n const bumperY = by + 0.14\n const bf = I.profX(it, bumperY, true)\n const br = I.profX(it, bumperY, false)\n const bumper = s.bodyBumper ? c.paint(s.col) : MATERIALS.trim\n m.frontBumper = c.roundBox(0.24, 0.22, W + 0.03, 0.09, bumper, bf - 0.04, bumperY, 0, { def: true })\n c.part('bumper', { key: 'bumper_front' }, m.frontBumper, new V3(bf, bumperY, 0), 1.1)\n m.rearBumper = c.roundBox(0.24, 0.22, W + 0.03, 0.09, bumper, br + 0.04, bumperY, 0, { def: true })\n c.part('bumper', { key: 'bumper_rear' }, m.rearBumper, new V3(br, bumperY, 0), 1.1)\n const hl = Object.assign(\n { style: s.headMat === MATERIALS.led ? 'slim' : 'rect', w: s.headW || 0.34, h: s.headH || 0.12, in: 0.06, yaw: 0.16 },\n s.hl || {},\n )\n const hy = hl.y || s.headY || s.noseY - 0.06\n const hx = I.profX(it, hy, true)\n const hz = W / 2 - hl.in - hl.w / 2\n ;[1, -1].forEach(function (sd) {\n kit.headlight(c, {\n style: hl.style,\n x: hx + 0.02 + (hl.dx || 0),\n y: hy,\n z: sd * hz,\n w: hl.w,\n h: hl.h,\n side: sd,\n yaw: hl.yaw,\n mat: hl.mat,\n })\n })\n if (hl.style === 'ledbar') kit.lightBar(c, hx + 0.03, hy + hl.h * 0.3, -hz + hl.w / 2, hz - hl.w / 2, 0.018, 1)\n if (s.grille !== false && !s.noGrille) {\n const gr = Object.assign({ style: 'bars', w: W * 0.44, h: Math.max(0.08, hy - bumperY - 0.12) }, s.grille || {})\n const gy = gr.y || (bumperY + hy) / 2 + 0.02\n const gx = I.profX(it, gy, true)\n kit.grille(c, { style: gr.style, x: gx + 0.025, y: gy, w: gr.w, h: gr.h, col: s.col, emblem: gr.emblem })\n } else kit.emblem(c, I.profX(it, hy + 0.02, true) + 0.055, hy + 0.02, 0, 0.04)\n const tl = Object.assign({ style: 'wrap', w: s.tailW || 0.3, h: s.tailH || 0.14, in: 0.05 }, s.tl || {})\n const ty = tl.y || s.tailLightY || s.tailY - 0.05\n const tx = I.profX(it, ty, false)\n const tz = W / 2 - tl.in - tl.w / 2\n ;[1, -1].forEach(function (sd) {\n kit.taillight(c, { style: tl.style, x: tx - 0.02, y: ty, z: sd * tz, w: tl.w, h: tl.h, side: sd, wrap: tl.wrap })\n })\n if (tl.style === 'bar') kit.lightBar(c, tx - 0.03, ty + tl.h * 0.15, -tz + tl.w / 2, tz - tl.w / 2, Math.min(0.04, tl.h * 0.4), -1)\n ;[1, -1].forEach(function (sd) {\n if (m.glasshouse && m.glasshouse.Wg) {\n const mx = m.glasshouse.fb - 0.12\n const my = m.glasshouse.belt + 0.1\n const mz = sd * (I.halfAt(m.glasshouse.Wg, m.tumble, my) + 0.13)\n c.roundBox(0.13, 0.11, 0.07, 0.035, c.paint(s.mirrorCol || s.col), mx, my, mz)\n c.roundBox(0.02, 0.08, 0.05, 0.01, MATERIALS.chrome, mx - 0.07, my, mz)\n c.rod(new V3(mx + 0.02, my - 0.02, mz - sd * 0.04), new V3(mx + 0.04, my - 0.05, sd * (W / 2 - 0.02)), 0.015, MATERIALS.trim)\n }\n ;(s.seams || []).forEach(function (x: any) {\n c.roundBox(0.012, m.belt - by - 0.14, 0.006, 0.003, MATERIALS.dark, x, (m.belt + by) / 2 + 0.04, sd * (W / 2 + 0.002))\n })\n ;(s.handles || []).forEach(function (x: any) {\n c.roundBox(0.13, 0.035, 0.025, 0.012, MATERIALS.chrome, x, m.belt - 0.12, sd * (W / 2 + 0.01))\n })\n if (s.arches && s.arches.length > 1) {\n const x0 = Math.min(s.arches[0][0], s.arches[1][0]) + s.arches[0][2]\n const x1 = Math.max(s.arches[0][0], s.arches[1][0]) - s.arches[0][2]\n c.roundBox(x1 - x0, 0.07, 0.03, 0.012, MATERIALS.trim, (x0 + x1) / 2, by + 0.06, sd * (W / 2 + 0.008))\n }\n })\n c.plate(bf + 0.085, bumperY + 0.01, 0, '+x')\n const pry = s.plateRearY || by + 0.42\n c.plate(I.profX(it, pry, false) - 0.025, pry, 0, '-x')\n if (m.glasshouse && m.glasshouse.Wg) {\n const wy = m.glasshouse.belt + 0.07\n const wx = m.glasshouse.fb - 0.05\n ;[-0.25, 0.25].forEach(function (z) {\n c.rod(new V3(wx + 0.03, wy, z - 0.02), new V3(wx - 0.18, wy + 0.17, z - 0.3), 0.01, MATERIALS.trim)\n })\n }\n c.cylinder(0.035, 0.035, 0.22, MATERIALS.steel, br - 0.05, by + 0.04, W * 0.3, 'x')\n m.exhaust = new V3(br - 0.17, by + 0.04, W * 0.3)\n if (!s.noAntenna && m.roof) c.rod(new V3(m.roof.x0 + 0.1, m.top, 0), new V3(m.roof.x0 - 0.05, m.top + 0.22, 0), 0.008, MATERIALS.trim)\n /* s.track (or w[3].track): track width from tyre centre to tyre centre; without it the tyre touches the body edge */\n ;(s.wheels || []).forEach(function (w: any) {\n const tk = (w[3] && w[3].track) || s.track\n ;[1, -1].forEach(function (sd) {\n c.wheel(w[0], sd * (tk ? tk / 2 : W / 2 - w[2] / 2 + 0.03), w[1], w[2], w[3] || {})\n })\n })\n if (\n !c.parts.some(function (p: any) {\n return p.kind === 'engine'\n })\n )\n c.part('engine', { key: 'engine' }, null, new V3(m.front - 0.6, by + 0.45, 0), 1.0)\n if (\n !c.parts.some(function (p: any) {\n return p.kind === 'radiator'\n }) &&\n !s.noRadiator\n )\n c.part('radiator', { key: 'radiator' }, null, new V3(m.front - 0.15, by + 0.35, 0), 0.9)\n c.part('fuel_tank', s.tankLabel || { key: 'fuel_tank' }, null, new V3(m.rear + 0.75, by + 0.15, -W * 0.22), 1.0)\n }\n /* Fender flare: an arched strip over the wheel arch, on both sides.\n x, y: wheel centre; r: arch radius; z: half width where it attaches; o: { w (strip width), t (thickness), mat, a0 (start angle), sides } */\n kit.archFlare = function (c: any, x: any, y: any, r: any, z: any, o: any) {\n o = o || {}\n const w = o.w || 0.07\n const t = o.t || 0.03\n const mat = o.mat || MATERIALS.trim\n const a0 = o.a0 == null ? 0.12 : o.a0\n const out: any = []\n ;(o.sides || [1, -1]).forEach(function (sd: any) {\n const shp = new THREE.Shape()\n const N = 24\n for (let i = 0; i <= N; i++) {\n const a = a0 + ((PI - 2 * a0) * i) / N\n shp[i ? 'lineTo' : 'moveTo'](Math.cos(a) * (r + w), Math.sin(a) * (r + w))\n }\n for (let j = N; j >= 0; j--) {\n const b = a0 + ((PI - 2 * a0) * j) / N\n shp.lineTo(Math.cos(b) * r, Math.sin(b) * r)\n }\n const g = new THREE.ExtrudeGeometry(shp, {\n depth: t,\n bevelEnabled: true,\n bevelThickness: 0.008,\n bevelSize: 0.008,\n bevelSegments: 2,\n curveSegments: 4,\n })\n g.translate(0, 0, sd > 0 ? 0 : -t)\n const m = c.add(g, mat, x, y, sd * z)\n out.push(m)\n })\n return out\n }\n\n Object.assign(I, {})\n}\n","/** Truck cab and chassis builders. */\nimport type { Kit } from './types'\n\nexport function installTrucks(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n const { makeMaterial, MATERIALS } = I\n\n /* ================= trucks ================= */\n /* Forward cab. o: { f (front x), W, col, len (2.05), roofY (2.92), belt (1.75), floor (1.25), wheelR (0.52), wheelW (0.32), int:{col,trim}, hl, grille, sleeper } */\n kit.truckCab = function (c: any, o: any) {\n const f = o.f\n const W = o.W\n const col = o.col\n const len = o.len || 2.05\n const ry = o.roofY || 2.92\n const belt = o.belt || 1.75\n const fl = o.floor || 1.25\n const wr = o.wheelR || 0.52\n const ww = o.wheelW || 0.32\n const T = { belt: belt, top: ry + 0.03, k: 0.04 }\n const items = [\n [f - len, 0.95, 0.05],\n [f - len - 0.01, ry - 0.07, 0.15],\n [f - 0.25, ry, 0.2],\n [f - 0.04, ry - 0.32, 0.12],\n [f + 0.03, 1.05, 0.1],\n [f, 0.88, 0.05],\n ]\n const m = c.meta\n m.color = col\n m.kind = m.kind || 'truck'\n const ax = f - 0.85\n const q = kit.quadDef([f + 0.01, belt + 0.03], [f - 0.06, ry - 0.26], W, T, 'front', 0.05, { inset: 0.04, side: 0.12 })\n const poly = [\n [f - len * 0.66, belt + 0.05],\n [f - 0.18, belt + 0.05],\n [f - 0.22, ry - 0.3],\n [f - len * 0.66, ry - 0.3],\n ]\n const holes = [kit.holeSide(poly), kit.holeQuad(q)]\n I.shell(c, {\n items: items,\n bottomY: 0.88,\n arches: [[ax, wr, wr + 0.08]],\n W: W,\n col: col,\n T: T,\n holes: holes,\n archInner: W / 2 - ww - 0.2,\n })\n kit.glassQuad(c, q, { key: 'windshield' })\n kit.sideWindows(c, [poly], W, T, function () {\n return { key: 'cab_window' }\n })\n Object.assign(m, {\n width: W,\n front: f + 0.03,\n clearance: 0.88,\n belt: belt,\n top: ry + 0.03,\n bodyHeight: 1.0,\n tumble: T,\n glasshouse: { fb: f, belt: belt + 0.03, Wg: W },\n cabRear: f - len,\n })\n const ic = o.int || {}\n const fab = makeMaterial(ic.col || '#3a3b3d', { roughness: 0.88 })\n const trim = makeMaterial(ic.trim || '#202124', { roughness: 0.7 })\n const zi = W / 2 - 0.1\n c.roundBox(len - 0.2, 0.04, zi * 2, 0.015, MATERIALS.carpet, f - len / 2 - 0.05, fl, 0)\n kit.dashboard(c, { x: f - 0.12, y: belt + 0.02, w: zi * 2, d: 0.45, h: belt - fl - 0.05, drv: -0.55, mat: trim, top: fab })\n kit.steeringWheel(c, f - 0.7, belt + 0.08, -0.55, { r: 0.24, tilt: 1.05, col: 0.5, mat: trim })\n const sx = f - 1.2\n kit.seat(c, sx, fl, -0.55, { w: 0.52, mat: fab, h: 0.45, back: 0.62 })\n kit.seat(c, sx, fl, 0.45, { w: 0.86, n: 2, mat: fab, h: 0.45, back: 0.6 })\n c.roundBox(0.03, ry - fl - 0.1, zi * 2, 0.01, trim, f - len + 0.08, (ry + fl) / 2, 0)\n c.roundBox(len - 0.4, 0.02, zi * 2 * 0.95, 0.01, MATERIALS.headliner, f - len / 2, ry - 0.06, 0).castShadow = false\n const rim = makeMaterial('#c8c4b8', { metalness: 0.4 })\n ;[1, -1].forEach(function (s) {\n c.roundBox(0.012, 1.5, 0.006, 0.003, MATERIALS.dark, f - len * 0.68, belt, s * (W / 2 + 0.002))\n c.roundBox(0.012, 1.5, 0.006, 0.003, MATERIALS.dark, f - 0.15, belt, s * (W / 2 + 0.002))\n c.roundBox(0.14, 0.04, 0.03, 0.012, MATERIALS.chrome, f - len * 0.6, belt - 0.1, s * (W / 2 + 0.012))\n c.roundBox(0.5, 0.05, 0.25, 0.02, MATERIALS.steel, f - 1.62, 0.62, s * (W / 2 - 0.1))\n c.roundBox(0.5, 0.05, 0.25, 0.02, MATERIALS.steel, f - 1.62, 0.32, s * (W / 2 - 0.1))\n c.tube(\n [\n [f - 0.2, 2.4, s * (W / 2)],\n [f + 0.1, 2.5, s * (W / 2 + 0.25)],\n [f + 0.1, 2.0, s * (W / 2 + 0.32)],\n ],\n 0.02,\n MATERIALS.trim,\n )\n c.roundBox(0.06, 0.45, 0.22, 0.03, MATERIALS.trim, f + 0.1, 2.1, s * (W / 2 + 0.33))\n c.roundBox(0.01, 0.4, 0.18, 0.01, MATERIALS.chrome, f + 0.065, 2.1, s * (W / 2 + 0.33))\n kit.headlight(c, Object.assign({ style: 'truck', x: f + 0.1, y: 0.74, z: s * (W / 2 - 0.32), w: 0.38, h: 0.18, side: s }, o.hl || {}))\n c.wheel(ax, s * (W / 2 - 0.2), wr, ww, { rim: rim, spokes: 8 })\n })\n kit.grille(c, Object.assign({ style: 'truck', x: f + 0.05, y: 1.35, w: W * 0.66, h: 0.56, col: col }, o.grille || {}))\n m.frontBumper = c.roundBox(0.22, 0.32, W + 0.04, 0.06, MATERIALS.trim, f + 0.06, 0.72, 0, { def: true })\n c.part('bumper', { key: 'bumper_front' }, m.frontBumper, new V3(f + 0.1, 0.72, 0), 1.1)\n c.plate(f + 0.175, 0.56, 0, '+x')\n c.part('engine', { key: 'engine' }, null, new V3(f - 1.0, 0.95, 0), 1.0)\n c.part('radiator', { key: 'radiator' }, null, new V3(f - 0.1, 1.2, 0), 0.9)\n if (o.visor !== false) c.roundBox(0.9, 0.3, W * 0.92, 0.12, c.paint(col), f - 1.2, ry + 0.16, 0, { taper: { sx: 0.6, shift: -0.25 } })\n return m\n }\n /* Chassis, rear axles, tank and fenders. o: { f, L, W, axles:[x..], dual, tank ('left'|'right'|false), wheelR, wheelW } */\n kit.truckChassis = function (c: any, o: any) {\n const f = o.f\n const L = o.L\n const W = o.W\n const rear = f - L\n const m = c.meta\n const rim = makeMaterial('#c8c4b8', { metalness: 0.4 })\n const wr = o.wheelR || 0.52\n const ww = o.wheelW || 0.32\n ;[0.42, -0.42].forEach(function (z) {\n c.roundBox(L - 0.3, 0.25, 0.12, 0.03, MATERIALS.trim, (f + rear) / 2 - 0.1, 0.68, z)\n })\n const axles = o.axles || [rear + 1.9, rear + 0.85]\n axles.forEach(function (x: any) {\n ;[1, -1].forEach(function (s) {\n c.wheel(x, s * (W / 2 - 0.2), wr, ww, { rim: rim, spokes: 8 })\n if (o.dual !== false) c.wheel(x, s * (W / 2 - 0.55), wr, ww - 0.02, { rim: rim, spokes: 8, noPart: true })\n })\n })\n const ts = o.tank === 'right' ? 1 : -1\n if (o.tank !== false) {\n c.cylinder(0.3, 0.3, 1.1, MATERIALS.chrome, f - 2.8, 0.55, ts * (W / 2 - 0.35), 'x', { seg: 24 })\n c.cylinder(0.08, 0.08, 0.04, MATERIALS.trim, f - 2.6, 0.86, ts * (W / 2 - 0.35))\n c.part('fuel_tank', { key: 'diesel_tank' }, null, new V3(f - 2.8, 0.55, ts * (W / 2 - 0.35)), 0.8)\n }\n c.roundBox(0.6, 0.45, 0.5, 0.04, MATERIALS.trim, f - 2.8, 0.55, -ts * (W / 2 - 0.35))\n ;[1, -1].forEach(function (s) {\n c.roundBox(0.02, 0.5, 0.55, 0.01, MATERIALS.rubber, rear + 0.35, 0.45, s * (W / 2 - 0.35))\n })\n c.roundBox(0.1, 0.12, W * 0.9, 0.03, MATERIALS.steel, rear + 0.05, 0.5, 0)\n c.plate(rear - 0.01, 0.7, 0, '-x')\n ;[1, -1].forEach(function (s) {\n kit.taillight(c, { style: 'vertical', x: rear + 0.06, y: 0.66, z: s * (W / 2 - 0.25), w: 0.12, h: 0.24, side: s })\n })\n m.rear = rear\n m.length = L\n }\n\n Object.assign(I, {})\n}\n","/** Spoked wheels and track assemblies. */\nimport type { Kit } from './types'\n\nexport function installWheels(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, MATERIALS, mergeGeometries, roundedBoxGeometry } = I\n\n /* ================= special wheels ================= */\n /* Spoked wheel for motorcycle/bicycle. o: { spokes, knobby, disc, cast (5-spoke alloy), z, label } */\n kit.spokedWheel = function (c: any, x: any, r: any, tireR: any, o: any) {\n o = o || {}\n const g = new THREE.Group()\n g.position.set(x, r, o.z || 0)\n c.vehicle.add(g)\n const t = new THREE.Mesh(new THREE.TorusGeometry(r - tireR, tireR, 12, 40), MATERIALS.rubber)\n t.castShadow = true\n g.add(t)\n if (o.knobby) {\n const kn = []\n for (let i = 0; i < 30; i++) {\n const a = (i / 30) * PI * 2\n const k = roundedBoxGeometry(0.04, 0.03, tireR * 1.6, 0.01)\n k.applyMatrix4(new THREE.Matrix4().makeRotationZ(a).setPosition(Math.cos(a) * r, Math.sin(a) * r, 0))\n kn.push(k)\n }\n g.add(new THREE.Mesh(mergeGeometries(kn), MATERIALS.rubber))\n }\n const rim = new THREE.Mesh(new THREE.TorusGeometry(r - tireR * 2 - 0.005, 0.012, 6, 40), o.cast ? MATERIALS.trim : MATERIALS.chrome)\n g.add(rim)\n const sl = r - tireR * 2\n if (o.cast) {\n for (let j = 0; j < 5; j++) {\n const sp = new THREE.Mesh(roundedBoxGeometry(sl, 0.03, 0.025, 0.01), MATERIALS.trim)\n const a3 = (j / 5) * PI * 2\n sp.position.set((Math.cos(a3) * sl) / 2, (Math.sin(a3) * sl) / 2, 0)\n sp.rotation.z = a3\n g.add(sp)\n }\n } else {\n const ns = o.spokes || 28\n const list = []\n for (let jj = 0; jj < ns; jj++) {\n const a2 = (jj / ns) * PI * 2\n const cg = new THREE.CylinderGeometry(0.0025, 0.0025, sl, 4)\n cg.applyMatrix4(\n new THREE.Matrix4()\n .makeRotationZ(a2 - PI / 2)\n .setPosition((Math.cos(a2) * sl) / 2, (Math.sin(a2) * sl) / 2, (jj % 2 ? 1 : -1) * 0.012),\n )\n list.push(cg)\n }\n g.add(new THREE.Mesh(mergeGeometries(list), MATERIALS.chrome))\n }\n const hub = new THREE.Mesh(new THREE.CylinderGeometry(0.035, 0.035, 0.1, 12), MATERIALS.steel)\n hub.rotation.x = PI / 2\n g.add(hub)\n if (o.disc) {\n const dsk = new THREE.Mesh(new THREE.CylinderGeometry(0.12, 0.12, 0.008, 24), MATERIALS.steel)\n dsk.rotation.x = PI / 2\n dsk.position.z = 0.06\n g.add(dsk)\n }\n g.userData.r = r\n c.wheels.push(g)\n c.part('wheel', o.label || { key: x > 0 ? 'bike_tire_front' : 'bike_tire_rear' }, g, new V3(x, r, o.z || 0), 0.8)\n return g\n }\n /* Simple track (tank). o: { x0 (drive wheel, rear), x1 (idler wheel, front), z, w, r (road wheels), n, top, mat } */\n kit.tracks = function (c: any, o: any) {\n const x0 = o.x0\n const x1 = o.x1\n const z = o.z\n const w = o.w || 0.55\n const r = o.r || 0.33\n const n = o.n || 6\n const top = o.top || 1.0\n const th = 0.06\n const mat = o.mat || makeMaterial('#2b2c2a', { metalness: 0.5, roughness: 0.6 })\n const wheelMat = o.wheelMat || makeMaterial('#3f4a36', { roughness: 0.7 })\n const rs = (top - th) / 2 - 0.02\n const rsY = top - rs - th\n const sp = ((x1 - x0 - 2 * rs) / Math.max(1, n - 1)) * 0.92\n const firstX = x0 + rs + 0.1\n const gs: any = []\n function road(x: any, y: any, rr: any) {\n const g = new THREE.Group()\n g.position.set(x, y, z)\n c.vehicle.add(g)\n const wm = new THREE.Mesh(new THREE.CylinderGeometry(rr, rr, w * 0.8, 22), wheelMat)\n wm.rotation.x = PI / 2\n wm.castShadow = true\n g.add(wm)\n const rb2 = new THREE.Mesh(new THREE.TorusGeometry(rr - 0.03, 0.03, 6, 22), MATERIALS.rubber)\n g.add(rb2)\n const hb = new THREE.Mesh(new THREE.CylinderGeometry(rr * 0.3, rr * 0.3, w * 0.84, 10), MATERIALS.steel)\n hb.rotation.x = PI / 2\n g.add(hb)\n gs.push(g)\n c.spin.push({ o: g, axis: 'z', v: 0, track: true })\n return g\n }\n for (let i = 0; i < n; i++) road(firstX + i * sp, r + th, r)\n const spr = road(x0, rsY, rs)\n const idl = road(x1, rsY, rs)\n for (let k = 0; k < 3; k++) road(x0 + (x1 - x0) * (0.25 + k * 0.25), top - th - 0.07, 0.07)\n const path = []\n const segs = 40\n function arc(cx: any, cy: any, rr: any, a0: any, a1: any) {\n for (let s = 0; s <= segs / 4; s++) {\n const a = a0 + ((a1 - a0) * s) / (segs / 4)\n path.push([cx + Math.cos(a) * rr, cy + Math.sin(a) * rr])\n }\n }\n path.push([firstX - 0.05, th / 2])\n path.push([firstX + (n - 1) * sp + 0.05, th / 2])\n arc(x1, rsY, rs + th / 2, -PI / 2 + 0.6, PI / 2)\n arc(x0, rsY, rs + th / 2, PI / 2, PI * 1.5 - 0.6)\n const pts = path.map(function (p) {\n return new THREE.Vector2(p[0], p[1])\n })\n const curve = new THREE.SplineCurve(pts.concat([pts[0]]))\n const lenT = curve.getLength()\n const nl = Math.round(lenT / 0.15)\n const links = []\n for (let l = 0; l < nl; l++) {\n const t = l / nl\n const p = curve.getPointAt(t)\n const tg = curve.getTangentAt(t)\n const ang = Math.atan2(tg.y, tg.x)\n const lg = roundedBoxGeometry(0.13, th, w, 0.015)\n lg.applyMatrix4(new THREE.Matrix4().makeRotationZ(ang).setPosition(p.x, p.y, 0))\n links.push(lg)\n const gh2 = roundedBoxGeometry(0.05, 0.05, 0.05, 0.01)\n gh2.applyMatrix4(new THREE.Matrix4().makeRotationZ(ang).setPosition(p.x - Math.sin(ang) * 0.04, p.y + Math.cos(ang) * 0.04, 0))\n links.push(gh2)\n }\n const tm = c.add(mergeGeometries(links), mat, 0, 0, z)\n tm.userData.noFollow = true\n c.part('track', kit.t('parts.track', { s: z > 0 ? 1 : -1 }), tm, new V3((x0 + x1) / 2, 0.3, z), 1.4)\n return { mesh: tm, wheels: gs, sprocket: spr, idler: idl }\n }\n\n Object.assign(I, {})\n}\n","/** Particle system: smoke, fire, sparks, shards, dust and water. */\nimport type { Kit } from './types'\nimport { clamp, hash, smooth } from './util'\n\nexport function installParticles(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const document = kit.document\n const { makeMaterial } = I\n\n /* ================= particles ================= */\n const PARTICLE_LIMIT = 400\n const PARTICLE_GEOMETRIES: any = {\n spark: new THREE.BoxGeometry(0.012, 0.012, 0.1),\n shard: new THREE.TetrahedronGeometry(0.028, 0),\n cube: new THREE.BoxGeometry(0.014, 0.014, 0.014),\n lens: new THREE.TetrahedronGeometry(0.022, 0),\n scrap: new THREE.BoxGeometry(0.07, 0.008, 0.05),\n plastic: new THREE.BoxGeometry(0.06, 0.014, 0.04),\n water: new THREE.SphereGeometry(0.03, 6, 4),\n droplet: new THREE.SphereGeometry(0.012, 6, 4),\n }\n const PARTICLE_MATERIALS: any = {\n spark: new THREE.MeshBasicMaterial({ color: 0xffc46a, blending: THREE.AdditiveBlending, transparent: true, depthWrite: false }),\n shard: makeMaterial('#cfe3e8', { roughness: 0.05, metalness: 0.4, transparent: true, opacity: 0.8 }),\n cube: makeMaterial('#d6e8ec', { roughness: 0.08, metalness: 0.4, transparent: true, opacity: 0.85 }),\n lensclear: makeMaterial('#f2f6f7', { roughness: 0.05, transparent: true, opacity: 0.7 }),\n lensred: makeMaterial('#c0281c', { roughness: 0.05, transparent: true, opacity: 0.8 }),\n plastic: makeMaterial('#18191b', { roughness: 0.7 }),\n water: new THREE.MeshBasicMaterial({ color: 0xbfd8e0, transparent: true, opacity: 0.7, depthWrite: false }),\n droplet: makeMaterial('#0b0908', { roughness: 0.05, metalness: 0.7 }),\n }\n /* ---- smoke, fire and dust: sprite puffs with a noise texture; they grow, drift with the wind and dissolve by noise ---- */\n function valueNoise(seed: any) {\n const N = 16\n const g: any = []\n for (let i = 0; i < N * N; i++) g.push(hash(i % N, (i / N) | 0, seed))\n return function (x: any, y: any) {\n const xi = Math.floor(x)\n const yi = Math.floor(y)\n const fx = x - xi\n const fy = y - yi\n const sx = fx * fx * (3 - 2 * fx)\n const sy = fy * fy * (3 - 2 * fy)\n function G(a: any, b: any) {\n return g[(((a % N) + N) % N) + (((b % N) + N) % N) * N]\n }\n const a = G(xi, yi) + (G(xi + 1, yi) - G(xi, yi)) * sx\n const b = G(xi, yi + 1) + (G(xi + 1, yi + 1) - G(xi, yi + 1)) * sx\n return a + (b - a) * sy\n }\n }\n function puffTexture(seed: any, fire: any) {\n const S = 96\n const cv = document.createElement('canvas')\n cv.width = cv.height = S\n const x: any = cv.getContext('2d')\n const img = x.createImageData(S, S)\n const nz = valueNoise(seed)\n for (let j = 0; j < S; j++)\n for (let i = 0; i < S; i++) {\n const u = (i / S) * 2 - 1\n const v = (j / S) * 2 - 1\n const r = Math.hypot(u, v)\n const f = nz(i / 12, j / 12) * 0.5 + nz(i / 6 + 7, j / 6 + 3) * 0.3 + nz(i / 3 + 11, j / 3 + 5) * 0.2\n const edge = 1 - smooth((r - 0.25 - f * 0.35) / 0.45)\n const a = clamp(edge * (0.55 + f * 0.6), 0, 1)\n const k = (j * S + i) * 4\n if (fire) {\n const hot = clamp(1 - r * 1.3 + f * 0.3, 0, 1)\n img.data[k] = 255\n img.data[k + 1] = Math.round(90 + 165 * hot)\n img.data[k + 2] = Math.round(30 + 170 * hot * hot * hot)\n } else {\n const sh = Math.round(150 + 105 * clamp(f * 1.1 - v * 0.25, 0, 1))\n img.data[k] = img.data[k + 1] = img.data[k + 2] = sh\n }\n img.data[k + 3] = Math.round(a * 255)\n }\n x.putImageData(img, 0, 0)\n const t = new THREE.CanvasTexture(cv)\n return t\n }\n let SMOKE_TEXTURES: any = null\n let FIRE_TEXTURES: any = null\n function puffMaterial(fire: any, col: any, op: any) {\n if (!SMOKE_TEXTURES) {\n SMOKE_TEXTURES = [1, 2, 3, 4].map(function (k) {\n return puffTexture(k * 13, false)\n })\n FIRE_TEXTURES = [5, 6, 7].map(function (k) {\n return puffTexture(k * 17, true)\n })\n }\n const list = fire ? FIRE_TEXTURES : SMOKE_TEXTURES\n const mat = new THREE.SpriteMaterial({\n map: list[Math.floor(Math.random() * list.length)],\n color: new THREE.Color(col),\n transparent: true,\n depthWrite: false,\n opacity: op,\n blending: fire ? THREE.AdditiveBlending : THREE.NormalBlending,\n })\n const dis = { value: 0 }\n mat.userData.dis = dis\n mat.onBeforeCompile = function (sh: any) {\n sh.uniforms.uDis = dis\n /* the sampled texel is called texelColor up to r152 and sampledDiffuseColor from r153 */\n const texel = parseInt(THREE.REVISION, 10) >= 153 ? 'sampledDiffuseColor' : 'texelColor'\n sh.fragmentShader =\n 'uniform float uDis;\\n' +\n sh.fragmentShader.replace(\n '#include <alphatest_fragment>',\n 'diffuseColor.a *= smoothstep(uDis, uDis + 0.2, ' + texel + '.a); if (diffuseColor.a < 0.003) discard;',\n )\n }\n return mat\n }\n const SPRITE_TYPES: any = { smoke: 1, fire: 1, dust: 1 }\n const PUFF_COLORS: any = {\n smokewhite: ['#9aa1a7', 0.42],\n smokeblack: ['#1b1b1c', 0.62],\n smokegray: ['#55595c', 0.5],\n smokesteam: ['#b6bcc1', 0.3],\n dust: ['#6e6658', 0.34],\n fire: ['#ffffff', 0.9],\n }\n const WIND = new V3(-0.45, 0, 0.16)\n const PARTICLE_LIFE: any = { spark: 0.6, dust: 1.6, smoke: 2.8, fire: 0.7, water: 1.2, droplet: 1.0 }\n const TRANSIENT_TYPES: any = { spark: 1, dust: 1, smoke: 1, fire: 1, water: 1, droplet: 1 }\n function killParticle(c: any, i: any) {\n const P = c.particles[i]\n c.effects.remove(P.m)\n if (P.own) P.m.material.dispose()\n c.particles.splice(i, 1)\n }\n /* Particle in the sibling group c.effects (vehicle world coordinates). type: spark|shard|cube|lens|scrap|plastic|dust|smoke|fire|water|droplet */\n kit.spawn = function (c: any, type: any, pos: any, vel: any, o: any) {\n o = o || {}\n if (c.particles.length >= PARTICLE_LIMIT) {\n const idx = c.particles.findIndex(function (q: any) {\n return TRANSIENT_TYPES[q.type]\n })\n killParticle(c, idx >= 0 ? idx : 0)\n }\n let m\n let own = false\n let op = 1\n if (SPRITE_TYPES[type]) {\n const pc = PUFF_COLORS[type + (o.variant || '')] || PUFF_COLORS[type] || PUFF_COLORS.smokewhite\n const opv = o.op != null ? o.op : pc[1]\n m = new THREE.Sprite(puffMaterial(type === 'fire', o.col || pc[0], opv))\n m.raycast = function () {}\n own = true\n op = opv\n if (o.nofog) m.material.fog = false\n m.material.rotation = c.rand() * PI * 2\n m.scale.setScalar(0.01)\n } else {\n const mat = o.mat || PARTICLE_MATERIALS[type + (o.variant || '')] || PARTICLE_MATERIALS[type]\n m = new THREE.Mesh(PARTICLE_GEOMETRIES[type], mat)\n m.castShadow = false\n m.receiveShadow = false\n op = mat.opacity\n if (o.s) m.scale.setScalar(o.s)\n m.rotation.set(c.rand() * 6, c.rand() * 6, c.rand() * 6)\n }\n m.position.copy(pos)\n c.effects.add(m)\n const P = {\n m: m,\n v: vel.clone(),\n type: type,\n age: 0,\n life: o.life || PARTICLE_LIFE[type] || 99,\n rest: false,\n w: new V3(c.rand() - 0.5, c.rand() - 0.5, c.rand() - 0.5).multiplyScalar(14),\n s0: o.s || 1,\n op: op,\n own: own,\n r: o.r || 0.01,\n spin: (c.rand() - 0.5) * 1.2,\n ph: c.rand() * 6.28,\n grow: o.grow || 1,\n }\n c.particles.push(P)\n return P\n }\n const _q = new THREE.Quaternion()\n const _z = new V3(0, 0, 1)\n const _t = new V3()\n function tickParticles(c: any, dt: any) {\n for (let i = c.particles.length - 1; i >= 0; i--) {\n const P = c.particles[i]\n if (P.rest) continue\n P.age += dt\n const m = P.m\n const t = P.age / P.life\n if (t >= 1 && TRANSIENT_TYPES[P.type]) {\n killParticle(c, i)\n continue\n }\n if (P.type === 'spark') {\n P.v.y -= 9.8 * dt\n m.position.addScaledVector(P.v, dt)\n if (m.position.y < 0.005) {\n m.position.y = 0.005\n P.v.y *= -0.35\n P.v.x *= 0.6\n P.v.z *= 0.6\n }\n const sp = P.v.length()\n if (sp > 0.01) {\n m.quaternion.setFromUnitVectors(_z, _t.copy(P.v).divideScalar(sp))\n m.scale.set(1, 1, clamp(sp * 0.25, 0.3, 1.6) * (1 - t))\n }\n } else if (P.type === 'smoke' || P.type === 'dust') {\n /* thrust that fades, drag towards the wind speed, soft turbulence */\n const k = Math.min(1, dt * (P.type === 'dust' ? 2.5 : 0.9))\n P.v.x += (WIND.x - P.v.x) * k\n P.v.z += (WIND.z - P.v.z) * k\n P.v.y = P.type === 'dust' ? P.v.y * Math.max(0, 1 - 2.5 * dt) : P.v.y * Math.max(0, 1 - 0.7 * dt) + 0.08 * dt\n m.position.addScaledVector(P.v, dt)\n m.position.x += Math.sin(P.age * 1.7 + P.ph) * 0.08 * dt\n m.position.z += Math.cos(P.age * 1.3 + P.ph) * 0.08 * dt\n const gs = P.s0 * P.grow * (0.18 + 1.5 * (1 - Math.exp(-P.age * 1.1)) + P.age * 0.12)\n m.scale.set(gs, gs, 1)\n m.material.rotation += P.spin * dt\n m.material.opacity = P.op * Math.min(1, P.age / 0.3)\n m.material.userData.dis.value = Math.pow(t, 1.3) * 0.95\n } else if (P.type === 'fire') {\n P.v.x += (WIND.x * 0.6 - P.v.x) * Math.min(1, dt * 1.5)\n P.v.z += (WIND.z * 0.6 - P.v.z) * Math.min(1, dt * 1.5)\n m.position.addScaledVector(P.v, dt)\n const fs =\n P.s0 * (0.35 + 0.5 * Math.sin(Math.min(1, t * 1.4) * PI * 0.5)) * (1 - t * 0.55) * (0.9 + 0.2 * Math.sin(P.age * 25 + P.ph))\n m.scale.set(fs * 0.85, fs * 1.25, 1)\n m.material.rotation += P.spin * dt * 2\n m.material.color.setHSL(0.11 - t * 0.09, 1, 0.62 - t * 0.3)\n m.material.userData.dis.value = Math.pow(t, 1.1) * 0.9\n } else if (P.type === 'water') {\n P.v.y -= 9.8 * dt\n m.position.addScaledVector(P.v, dt)\n if (m.position.y < -0.05) killParticle(c, i)\n } else if (P.type === 'droplet') {\n P.v.y -= 9.8 * dt\n m.position.addScaledVector(P.v, dt)\n if (m.position.y < 0.012) killParticle(c, i)\n } else {\n P.v.y -= 9.8 * dt\n m.position.addScaledVector(P.v, dt)\n m.rotation.x += P.w.x * dt\n m.rotation.y += P.w.y * dt\n m.rotation.z += P.w.z * dt\n const floor = P.floor != null ? P.floor : 0.006\n if (m.position.y < floor) {\n m.position.y = floor\n if (Math.abs(P.v.y) < 1.1) {\n P.rest = true\n m.rotation.x = (c.rand() - 0.5) * 0.3\n m.rotation.z = (c.rand() - 0.5) * 0.3\n } else {\n P.v.y *= -0.32\n P.v.x *= 0.5\n P.v.z *= 0.5\n P.w.multiplyScalar(0.5)\n }\n }\n }\n }\n }\n function burst(c: any, type: any, pFx: any, n: any, o: any) {\n o = o || {}\n const d = o.dir || new V3(0, 1, 0)\n const spd = o.speed || 2\n const spread = o.spread == null ? 1 : o.spread\n for (let i = 0; i < n; i++) {\n const v = new V3(c.rand() - 0.5, c.rand() * 0.8, c.rand() - 0.5).multiplyScalar(spread * spd).addScaledVector(d, spd * (0.5 + c.rand()))\n kit.spawn(\n c,\n type,\n pFx\n .clone()\n .add(new V3((c.rand() - 0.5) * (o.jitter || 0.08), (c.rand() - 0.5) * (o.jitter || 0.08), (c.rand() - 0.5) * (o.jitter || 0.08))),\n v,\n o,\n )\n }\n }\n kit.burst = burst\n /* Continuous emitter. p in c.vehicle (or in the vehicle world with o.world). kind: white|black|fire|exhaust (exhaust follows c.engineHealth) */\n kit.addEmitter = function (c: any, p: any, kind: any, o: any) {\n o = o || {}\n if (\n c.emitters.some(function (e: any) {\n return e.kind === kind && e.p.distanceTo(p) < 0.3\n })\n )\n return null\n const e = {\n p: p.clone(),\n kind: kind,\n world: !!o.world,\n rate: o.rate || (kind === 'fire' ? 14 : kind === 'exhaust' ? 7 : 6),\n acc: 0,\n s: o.s || 1,\n dir: o.dir || null,\n gap: 0,\n }\n c.emitters.push(e)\n return e\n }\n /* colour and opacity of the exhaust smoke by engine condition: 100% almost invisible, 60% grey, 30% dark grey, 10% black with misfires */\n function exhaustLook(h: any) {\n if (h >= 0.85) return ['#a7adb2', 0.05]\n if (h >= 0.45) return ['#7b8084', 0.2 + (0.85 - h) * 0.3]\n if (h >= 0.2) return ['#3f4245', 0.42]\n return ['#141414', 0.66]\n }\n kit.exhaustLook = exhaustLook\n function tickEmit(c: any, dt: any) {\n c.emitters.forEach(function (e: any) {\n if (e.kind === 'exhaust') {\n const h = c.engineHealth == null ? 1 : c.engineHealth\n if (h <= 0 || c.flipped || c.rollState) return\n if (h < 0.2) {\n e.gap -= dt\n if (e.gap < -0.5 && c.rand() < dt * 1.5) e.gap = 0.25 + c.rand() * 0.35\n if (e.gap > 0) return\n }\n }\n e.acc += e.rate * dt\n while (e.acc >= 1) {\n e.acc -= 1\n const p = e.world ? e.p.clone() : c.toEffects(e.p)\n if (e.kind !== 'exhaust') {\n p.x += (c.rand() - 0.5) * 0.15\n p.z += (c.rand() - 0.5) * 0.15\n }\n if (e.kind === 'fire') {\n kit.spawn(c, 'fire', p, new V3((c.rand() - 0.5) * 0.3, 1.1 + c.rand() * 0.8, (c.rand() - 0.5) * 0.3), {\n s: (0.45 + c.rand() * 0.45) * e.s,\n life: 0.55 + c.rand() * 0.35,\n })\n if (c.rand() < 0.45)\n kit.spawn(c, 'smoke', p.clone().add(new V3(0, 0.7 * e.s, 0)), new V3(0, 1.0, 0), { variant: 'black', s: 0.9 * e.s, life: 3.2 })\n if (c.rand() < 0.15)\n kit.spawn(\n c,\n 'spark',\n p.clone().add(new V3(0, 0.2, 0)),\n new V3((c.rand() - 0.5) * 0.6, 1.6 + c.rand(), (c.rand() - 0.5) * 0.6),\n { life: 0.9 },\n )\n } else if (e.kind === 'exhaust') {\n const lk = exhaustLook(c.engineHealth == null ? 1 : c.engineHealth)\n const d = e.dir ? c.dirToEffects(e.dir) : c.dirToEffects(new V3(-1, 0, 0))\n kit.spawn(c, 'smoke', p, d.multiplyScalar(1.1 + c.rand() * 0.4).add(new V3(0, 0.15, 0)), {\n col: lk[0],\n op: lk[1],\n s: 0.35 + c.rand() * 0.15,\n life: 1.4 + c.rand() * 0.5,\n })\n } else {\n const preta = e.kind === 'black'\n kit.spawn(\n c,\n 'smoke',\n p,\n new V3((c.rand() - 0.5) * 0.2, preta ? 0.9 + c.rand() * 0.3 : 1.1 + c.rand() * 0.3, (c.rand() - 0.5) * 0.2),\n { variant: preta ? 'black' : 'steam', s: (preta ? 0.75 : 0.6) * e.s * (0.8 + c.rand() * 0.4), life: preta ? 3.2 : 2.0 },\n )\n }\n }\n })\n }\n\n Object.assign(I, {\n PARTICLE_LIMIT,\n PARTICLE_GEOMETRIES,\n PARTICLE_MATERIALS,\n valueNoise,\n puffTexture,\n puffMaterial,\n SPRITE_TYPES,\n PUFF_COLORS,\n WIND,\n PARTICLE_LIFE,\n TRANSIENT_TYPES,\n killParticle,\n _q,\n _z,\n _t,\n tickParticles,\n burst,\n exhaustLook,\n tickEmit,\n })\n}\n","/** Fluid types (oil, stains, rain...) and the splat/puddle system. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installFluids(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { DOUBLE_SIDE } = I\n\n /* ================= fluids ================= */\n /* Splat fluid types. A game registers its own with kit.defineFluid(key, def) or configure({ fluids }).\n def: { fresh, dry (hex colours), dryTime (s until dry), roughFresh, roughDry, metalFresh, metalDry, wipeable (wiper/rain remove the fresh one) }\n Types without \"fresh\" (def.update(c, f, dt, i) returning true removes it) become fully custom fluids of the plugin. */\n kit.fluidTypes = {}\n kit.defineFluid = function (key: any, def: any) {\n const d = Object.assign({ dryTime: 600, roughFresh: 0.12, roughDry: 0.92, metalFresh: 0.15, metalDry: 0, wipeable: false }, def || {})\n d.key = key\n d.freshC = new THREE.Color(d.fresh || '#444444')\n d.dryC = new THREE.Color(d.dry || d.fresh || '#222222')\n kit.fluidTypes[key] = d\n return d\n }\n kit.defineFluid('stain', { fresh: '#4a4a44', dry: '#26241f', wipeable: false })\n const _fr = new THREE.Raycaster()\n /* Liquid splat: a flat stain glued to the surface, irregular outline, satellite drops and a trickle that runs down,\n thins and ends in a bulb. The trickle stops when the volume runs out. Glossy when fresh, dries matte in the fluid type's time.\n o: { fluid (key of kit.fluidTypes; default config.defaultSplat), glass, obj (mesh to attach to; the trickle follows its curve) } */\n kit.splat = function (c: any, p: any, n: any, r: any, o: any) {\n o = o || {}\n n = n.clone().normalize()\n const fdef = kit.fluidTypes[o.fluid || kit.config.defaultSplat] || kit.fluidTypes.stain\n const mat = new THREE.MeshStandardMaterial({\n color: fdef.freshC.clone(),\n roughness: fdef.roughFresh,\n metalness: fdef.metalFresh,\n side: DOUBLE_SIDE,\n polygonOffset: true,\n polygonOffsetFactor: -2,\n polygonOffsetUnits: -4,\n })\n const grp = new THREE.Group()\n grp.position.copy(p)\n c.vehicle.add(grp)\n const g = new V3(0, -1, 0).addScaledVector(n, n.y)\n if (g.lengthSq() < 1e-4) g.set(1, 0, 0)\n g.normalize()\n const side = new V3().crossVectors(g, n).normalize()\n const M = new THREE.Matrix4().makeBasis(g, n, side)\n grp.quaternion.setFromRotationMatrix(M)\n const rnd = c.rand\n const nz = I.valueNoise(Math.floor(rnd() * 1000))\n function blobShape(cx: any, cz: any, rr: any, k: any, ph: any) {\n const sh = new THREE.Shape()\n const N = 28\n for (let i = 0; i <= N; i++) {\n const a = (i / N) * PI * 2\n const q = rr * (0.72 + 0.42 * nz(Math.cos(a) * k + ph, Math.sin(a) * k + ph) + 0.12 * Math.max(0, Math.cos(a)))\n const x = cx + Math.cos(a) * q\n const y = cz + Math.sin(a) * q\n if (i === 0) sh.moveTo(x, y)\n else sh.lineTo(x, y)\n }\n return sh\n }\n const shapes = [blobShape(0, 0, r, 2.2, rnd() * 9)]\n const nsat = 4 + Math.floor(rnd() * 4)\n for (let i = 0; i < nsat; i++) {\n const a = rnd() * PI * 2\n const d = r * (1.15 + rnd() * 1.1)\n shapes.push(blobShape(Math.cos(a) * d, Math.sin(a) * d, r * (0.07 + rnd() * 0.12), 3, rnd() * 9))\n }\n const bg = new THREE.ShapeGeometry(shapes, 2)\n bg.rotateX(PI / 2)\n const blob = new THREE.Mesh(bg, mat)\n blob.castShadow = false\n blob.receiveShadow = true\n blob.position.y = 0.004\n grp.add(blob)\n /* trickle path: samples along the descent, glued to the surface by ray against the source mesh */\n const Lmax = r * (2.2 + rnd() * 2.2)\n const NS = 10\n const off = []\n c.root.updateMatrixWorld(true)\n for (let k = 0; k <= NS; k++) {\n const xl = r * 0.55 + (Lmax * k) / NS\n let h = 0.004\n if (o.obj && o.obj.isMesh && k > 0) {\n const lp = p.clone().addScaledVector(g, xl)\n const wo = lp.clone().addScaledVector(n, 0.2).applyMatrix4(c.vehicle.matrixWorld)\n const wd = n.clone().negate().transformDirection(c.vehicle.matrixWorld)\n _fr.set(wo, wd)\n _fr.far = 0.45\n const hit = _fr.intersectObject(o.obj, false)[0]\n if (hit) {\n const hl = hit.point.clone().applyMatrix4(new THREE.Matrix4().copy(c.vehicle.matrixWorld).invert())\n h = hl.sub(p).dot(n) + 0.004\n if (h < -0.15) h = off[k - 1]\n } else h = off[k - 1]\n }\n off.push(h)\n }\n const drip = new THREE.Mesh(new THREE.BufferGeometry(), mat)\n drip.castShadow = false\n grp.add(drip)\n const f = {\n kind: fdef.key,\n def: fdef,\n grp: grp,\n mat: mat,\n drip: drip,\n r: r,\n t: 0,\n onGlass: !!o.glass,\n Lmax: Lmax,\n off: off,\n len: -1,\n w0: r * (0.26 + rnd() * 0.1),\n }\n buildDrip(f, 0.02)\n c.fluids.push(f)\n return f\n }\n function buildDrip(f: any, L: any) {\n const pos = []\n const NS = 12\n const r = f.r\n const x0 = r * 0.55\n function hAt(x: any) {\n const u = clamp((x - x0) / f.Lmax, 0, 1) * (f.off.length - 1)\n const i = Math.min(f.off.length - 2, Math.floor(u))\n const t = u - i\n return f.off[i] + (f.off[i + 1] - f.off[i]) * t\n }\n let prev = null\n for (let k = 0; k <= NS; k++) {\n const t = k / NS\n const x = x0 - r * 0.25 + (L + r * 0.25) * t\n const hw = f.w0 * (1 - 0.72 * Math.pow(t, 0.7)) * (1 + 0.08 * Math.sin(t * 9 + r * 50))\n const y = hAt(x) + 0.0005\n const cur = [\n [x, y, -hw],\n [x, y, hw],\n ]\n if (prev)\n pos.push(\n prev[0][0],\n prev[0][1],\n prev[0][2],\n prev[1][0],\n prev[1][1],\n prev[1][2],\n cur[0][0],\n cur[0][1],\n cur[0][2],\n prev[1][0],\n prev[1][1],\n prev[1][2],\n cur[1][0],\n cur[1][1],\n cur[1][2],\n cur[0][0],\n cur[0][1],\n cur[0][2],\n )\n prev = cur\n }\n const bx = x0 + L + r * 0.02\n const by = hAt(bx) + 0.0008\n const rb = f.w0 * 0.62 * Math.min(1, 0.4 + L / (f.Lmax * 0.5))\n for (let q = 0; q < 14; q++) {\n const a0 = (q / 14) * PI * 2\n const a1 = ((q + 1) / 14) * PI * 2\n pos.push(bx, by, 0, bx + Math.cos(a1) * rb * 1.2, by, Math.sin(a1) * rb, bx + Math.cos(a0) * rb * 1.2, by, Math.sin(a0) * rb)\n }\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n g.computeVertexNormals()\n f.drip.geometry.dispose()\n f.drip.geometry = g\n f.len = L\n }\n /* Ground puddles: outline irregular by noise, lobes that advance towards the lower side and stop.\n oil: mirror-black centre, rainbow only on a thin edge with hue varying along it, never dries, drop that swells and makes a crown.\n diesel: like oil, lighter and slower, does not catch fire. gasoline: nearly transparent, darkens the asphalt ~45%, shimmering air, evaporates from the edge in 60 s. */\n const DOWNHILL = new V3(-0.55, 0, 0.83).normalize()\n const PN = 72\n function puddleGeometry() {\n const g = new THREE.BufferGeometry()\n const pos = new Float32Array((PN + 1) * 3)\n const nor = new Float32Array((PN + 1) * 3)\n const idx = []\n for (let i = 0; i <= PN; i++) nor[3 * i + 1] = 1\n for (let k = 0; k < PN; k++) idx.push(0, 1 + ((k + 1) % PN), 1 + k)\n g.setAttribute('position', new THREE.BufferAttribute(pos, 3))\n g.setAttribute('normal', new THREE.BufferAttribute(nor, 3))\n g.setIndex(idx)\n return g\n }\n function rimGeometry() {\n const g = new THREE.BufferGeometry()\n const pos = new Float32Array(PN * 2 * 3)\n const col = new Float32Array(PN * 2 * 3)\n const idx = []\n for (let k = 0; k < PN; k++) {\n const a = 2 * k\n const b = 2 * k + 1\n const c2 = 2 * ((k + 1) % PN)\n const d = c2 + 1\n idx.push(a, c2, b, b, c2, d)\n }\n g.setAttribute('position', new THREE.BufferAttribute(pos, 3))\n g.setAttribute('color', new THREE.BufferAttribute(col, 3))\n g.setIndex(idx)\n return g\n }\n function puddle(c: any, kind: any, pLocal: any, maxR: any) {\n const q = c.toEffects(pLocal)\n const oily = kind === 'oil' || kind === 'diesel'\n const mat =\n kind === 'oil'\n ? new THREE.MeshStandardMaterial({\n color: 0x050404,\n roughness: 0.04,\n metalness: 0.85,\n polygonOffset: true,\n polygonOffsetFactor: -1,\n polygonOffsetUnits: -2,\n })\n : kind === 'diesel'\n ? new THREE.MeshStandardMaterial({\n color: 0x15110a,\n roughness: 0.06,\n metalness: 0.6,\n transparent: true,\n opacity: 0.9,\n depthWrite: false,\n })\n : new THREE.MeshStandardMaterial({\n color: 0x000000,\n roughness: 0.03,\n metalness: 0.5,\n transparent: true,\n opacity: 0.45,\n depthWrite: false,\n })\n const m = new THREE.Mesh(puddleGeometry(), mat)\n m.position.set(q.x, kind === 'oil' ? 0.013 : 0.016, q.z)\n m.receiveShadow = true\n m.castShadow = false\n m.raycast = function () {}\n c.effects.add(m)\n const rnd = c.rand\n const lobes = []\n const nl = 5 + Math.floor(rnd() * 3)\n const down = Math.atan2(DOWNHILL.z, DOWNHILL.x)\n for (let i = 0; i < nl; i++) {\n const a = i < 2 ? down + (rnd() - 0.5) * 0.9 : rnd() * PI * 2\n const dh = Math.max(0, Math.cos(a - down))\n lobes.push({ a: a, w: 0.22 + rnd() * 0.3, amp: (0.1 + rnd() * 0.16) * (1 + 1.1 * dh), stop: 0.35 + rnd() * 0.65 })\n }\n const f: any = { kind: kind, m: m, t: 0, max: maxR, x0: q.x, z0: q.z, lobes: lobes, nz: I.valueNoise(Math.floor(rnd() * 999)), ph: rnd() * 10 }\n if (oily) {\n const rim = new THREE.Mesh(\n rimGeometry(),\n new THREE.MeshBasicMaterial({\n vertexColors: true,\n transparent: true,\n opacity: kind === 'oil' ? 0.55 : 0.4,\n blending: THREE.AdditiveBlending,\n depthWrite: false,\n }),\n )\n rim.position.set(q.x, m.position.y + 0.002, q.z)\n rim.raycast = function () {}\n c.effects.add(rim)\n f.rim = rim\n }\n if (kind === 'oil') {\n const drop = new THREE.Mesh(new THREE.SphereGeometry(0.02, 10, 8), I.PARTICLE_MATERIALS.droplet)\n drop.raycast = function () {}\n c.effects.add(drop)\n f.drop = drop\n f.dy0 = Math.max(0.15, q.y - 0.1)\n drop.position.set(q.x, f.dy0, q.z)\n const crown = new THREE.Mesh(\n new THREE.CylinderGeometry(1, 0.7, 1, 18, 1, true),\n new THREE.MeshStandardMaterial({\n color: 0x0b0908,\n roughness: 0.05,\n metalness: 0.7,\n transparent: true,\n opacity: 0,\n side: DOUBLE_SIDE,\n depthWrite: false,\n }),\n )\n crown.position.set(q.x, 0.02, q.z)\n crown.visible = false\n crown.raycast = function () {}\n c.effects.add(crown)\n f.crown = crown\n f.phase = 0\n } else if (kind === 'gasoline') {\n const haze = new THREE.Mesh(\n puddleGeometry(),\n new THREE.MeshBasicMaterial({ color: 0x9fb2be, transparent: true, opacity: 0.035, depthWrite: false, side: DOUBLE_SIDE }),\n )\n haze.position.set(q.x, 0.22, q.z)\n haze.raycast = function () {}\n c.effects.add(haze)\n f.haze = haze\n }\n f.R = new Float32Array(PN)\n shapePuddle(f)\n c.fluids.push(f)\n return f\n }\n kit.puddle = puddle\n function shapePuddle(f: any) {\n const t = f.t\n let g\n let evap = 1\n if (f.kind === 'gasoline') {\n g = f.max * (1 - Math.exp(-f.t * 1.4))\n } else if (f.kind === 'diesel') g = f.max * Math.min(1, Math.sqrt(f.t / 70))\n else g = f.max * Math.min(1, Math.sqrt(f.t / 40))\n const grow = f.kind === 'gasoline' ? clamp(t / 6, 0, 1) : clamp(t / (f.kind === 'diesel' ? 90 : 60), 0, 1)\n const pos = f.m.geometry.attributes.position\n for (let k = 0; k < PN; k++) {\n const a = (k / PN) * PI * 2\n let rr =\n 0.68 + 0.22 * f.nz(Math.cos(a) * 2.3 + f.ph, Math.sin(a) * 2.3 + f.ph) + 0.08 * f.nz(Math.cos(a) * 6 + 3, Math.sin(a) * 6 + 3)\n f.lobes.forEach(function (L: any) {\n const d = Math.atan2(Math.sin(a - L.a), Math.cos(a - L.a)) / L.w\n rr += L.amp * Math.exp(-d * d) * Math.min(1, grow / L.stop)\n })\n if (f.kind === 'gasoline' && t > 6) {\n /* evaporates from the edge: each stretch recedes at its own pace, the puddle vanishes in 60 s */\n const e = clamp((t - 6) / 54, 0, 1)\n evap = clamp(1 - e * (0.75 + 0.5 * f.nz(Math.cos(a) * 3 + 9, Math.sin(a) * 3 + 9)) - e * e * 0.4, 0, 1)\n rr *= evap\n }\n f.R[k] = g * rr\n pos.setXYZ(k + 1, Math.cos(a) * f.R[k], 0, Math.sin(a) * f.R[k])\n }\n pos.needsUpdate = true\n f.m.geometry.computeBoundingSphere()\n if (f.haze) {\n const hp = f.haze.geometry.attributes.position\n for (let j = 0; j < PN; j++) {\n const aa = (j / PN) * PI * 2\n const w = f.R[j] * (1 + 0.08 * Math.sin(t * 11 + j))\n hp.setXYZ(j + 1, Math.cos(aa) * w, 0.03 * Math.sin(t * 9 + j * 0.7), Math.sin(aa) * w)\n }\n hp.needsUpdate = true\n f.haze.geometry.computeBoundingSphere()\n }\n if (f.rim) {\n const rp = f.rim.geometry.attributes.position\n const rc = f.rim.geometry.attributes.color\n const col = new THREE.Color()\n for (let q = 0; q < PN; q++) {\n const an = (q / PN) * PI * 2\n const R = f.R[q]\n const band = Math.min(0.085, R * 0.16)\n rp.setXYZ(2 * q, Math.cos(an) * (R - band), 0, Math.sin(an) * (R - band))\n rp.setXYZ(2 * q + 1, Math.cos(an) * (R + 0.004), 0, Math.sin(an) * (R + 0.004))\n col.setHSL((an / PI + f.nz(Math.cos(an) * 4, Math.sin(an) * 4) * 0.8 + t * 0.01) % 1, 0.8, f.kind === 'oil' ? 0.5 : 0.36)\n rc.setXYZ(2 * q, 0, 0, 0)\n rc.setXYZ(2 * q + 1, col.r, col.g, col.b)\n }\n rp.needsUpdate = true\n rc.needsUpdate = true\n f.rim.geometry.computeBoundingSphere()\n }\n return evap\n }\n function updateFluids(c: any, dt: any) {\n for (let i = c.fluids.length - 1; i >= 0; i--) {\n const f = c.fluids[i]\n f.t += dt\n if (f.kind === 'gasoline') {\n shapePuddle(f)\n f.m.material.opacity = 0.45 * (f.t > 50 ? Math.max(0, (60 - f.t) / 10) : 1)\n if (f.t > 60) {\n c.effects.remove(f.m)\n c.effects.remove(f.haze)\n f.m.geometry.dispose()\n f.haze.geometry.dispose()\n c.fluids.splice(i, 1)\n }\n } else if (f.kind === 'oil' || f.kind === 'diesel') {\n if (f.t < 95 || (f.rimT = (f.rimT || 0) + dt) > 0.25) {\n f.rimT = 0\n shapePuddle(f)\n }\n if (f.drop) {\n /* the drop swells (0.9 s), detaches, falls and makes a crown when it hits the puddle */\n f.phase += dt\n const fall = Math.sqrt((2 * Math.max(0.05, f.dy0 - 0.015)) / 9.8)\n const cyc = 0.9 + fall + 0.5\n const ph = f.phase % cyc\n if (ph < 0.9) {\n const sw = 0.35 + (0.75 * ph) / 0.9\n f.drop.visible = true\n f.drop.position.y = f.dy0 - 0.01 * sw\n f.drop.scale.set(sw, sw * (1 + (0.5 * ph) / 0.9), sw)\n f.splashed = false\n } else if (ph < 0.9 + fall) {\n const tf = ph - 0.9\n f.drop.position.y = f.dy0 - 0.5 * 9.8 * tf * tf\n f.drop.scale.set(0.85, 1.5, 0.85)\n } else {\n f.drop.visible = false\n if (!f.splashed) {\n f.splashed = true\n f.crownT = 0\n for (let s = 0; s < 6; s++) {\n const a = (s / 6) * PI * 2 + c.rand()\n kit.spawn(\n c,\n 'droplet',\n new V3(f.x0 + Math.cos(a) * 0.02, 0.02, f.z0 + Math.sin(a) * 0.02),\n new V3(Math.cos(a) * 0.5, 0.9 + c.rand() * 0.4, Math.sin(a) * 0.5),\n { s: 0.5 + c.rand() * 0.4 },\n )\n }\n }\n }\n if (f.crownT != null) {\n f.crownT += dt\n const ct = f.crownT / 0.3\n if (ct < 1) {\n f.crown.visible = true\n f.crown.scale.set(0.015 + 0.05 * ct, 0.03 * Math.sin(ct * PI), 0.015 + 0.05 * ct)\n f.crown.position.y = 0.015 + f.crown.scale.y / 2\n f.crown.material.opacity = 0.9 * (1 - ct)\n } else {\n f.crown.visible = false\n f.crownT = null\n }\n }\n }\n } else if (f.def && f.def.update) {\n if (f.def.update(c, f, dt, i) === true) {\n c.fluids.splice(i, 1)\n }\n } else if (f.def) {\n const dry = Math.min(1, f.t / f.def.dryTime)\n f.mat.color.copy(f.def.freshC).lerp(f.def.dryC, dry)\n f.mat.roughness = f.def.roughFresh + dry * (f.def.roughDry - f.def.roughFresh)\n f.mat.metalness = f.def.metalFresh + (f.def.metalDry - f.def.metalFresh) * dry\n const L = f.Lmax * (1 - Math.exp(-f.t / 5))\n if (L - f.len > 0.004) buildDrip(f, L)\n }\n }\n }\n kit.updateFluids = updateFluids\n /* The wiper (glass only) and rain clean only fresh stains (less than half dry) of the types with wipeable. */\n kit.wipe = function (c: any, mode: any) {\n let n = 0\n for (let i = c.fluids.length - 1; i >= 0; i--) {\n const f = c.fluids[i]\n if (!f.def || !f.def.wipeable) continue\n if (f.t / f.def.dryTime < 0.5 && (mode === 'rain' || f.onGlass)) {\n if (f.grp.parent) f.grp.parent.remove(f.grp)\n c.fluids.splice(i, 1)\n n++\n }\n }\n return n\n }\n\n Object.assign(I, { _fr, buildDrip, DOWNHILL, PN, puddleGeometry, rimGeometry, puddle, shapePuddle, updateFluids })\n}\n","/** Glass cracks, shattering and tempered or laminated breakage textures. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installGlassDamage(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const document = kit.document\n const { DOUBLE_SIDE, MATERIALS, crease, cutGeometry, mergeGeometries, subdivide, tumble } = I\n\n /* ================= glass: cracks and shattering ================= */\n function glassUV(msh: any, pLocal: any) {\n const pos = msh.geometry.attributes.position\n const uv = msh.geometry.attributes.uv\n if (!uv) return [0.5, 0.5]\n const inv = new THREE.Matrix4().copy(msh.matrix).invert()\n const q = pLocal.clone().applyMatrix4(inv)\n let best = 1e9\n let bi = 0\n const v = new V3()\n for (let i = 0; i < pos.count; i++) {\n v.fromBufferAttribute(pos, i)\n const d = v.distanceToSquared(q)\n if (d < best) {\n best = d\n bi = i\n }\n }\n return [uv.getX(bi), uv.getY(bi)]\n }\n /* Crack web: thick opaque lines at the centre, thinning outward, with a dark outline so it reads from afar. */\n function drawWeb(x: any, cx: any, cy: any, s: any, ax: any, rnd: any) {\n const n = 16 + Math.floor(rnd() * 8)\n const spokes: any = []\n for (let i = 0; i < n; i++) {\n const a = (i / n) * PI * 2 + (rnd() - 0.5) * 0.35\n const L = (70 + rnd() * 95) * s\n const pts = [[cx, cy]]\n for (let k = 1; k <= 6; k++) {\n const aa = a + (rnd() - 0.5) * 0.28\n const rr = (L * k) / 6\n pts.push([cx + (Math.cos(aa) * rr) / ax, cy + Math.sin(aa) * rr])\n }\n spokes.push(pts)\n }\n x.lineCap = 'round'\n x.lineJoin = 'round'\n function seg(p: any, q: any, wd: any, col: any) {\n x.strokeStyle = col\n x.lineWidth = wd\n x.beginPath()\n x.moveTo(p[0], p[1])\n x.lineTo(q[0], q[1])\n x.stroke()\n }\n ;[\n ['rgba(8,12,14,0.55)', 2.2],\n ['rgba(244,248,250,0.97)', 0],\n ].forEach(function (pass: any) {\n spokes.forEach(function (pts: any) {\n for (let k = 1; k < pts.length; k++) {\n const t = k / pts.length\n seg(pts[k - 1], pts[k], Math.max(0.8, 4.2 * (1 - t) + 0.6) + pass[1], pass[0])\n }\n })\n for (let r = 1; r <= 4; r++) {\n x.lineWidth = Math.max(0.8, 2.6 - r * 0.45) + pass[1] * 0.6\n x.strokeStyle = pass[0]\n x.beginPath()\n spokes.forEach(function (sp: any, j: any) {\n const p = sp[Math.min(r, sp.length - 1)]\n const q = spokes[(j + 1) % spokes.length][Math.min(r, sp.length - 1)]\n if (rnd() < 0.8) {\n x.moveTo(p[0], p[1])\n x.quadraticCurveTo((p[0] + q[0]) / 2 + (rnd() - 0.5) * 6, (p[1] + q[1]) / 2 + (rnd() - 0.5) * 6, q[0], q[1])\n }\n })\n x.stroke()\n }\n })\n const gr = x.createRadialGradient(cx, cy, 0, cx, cy, 26 * s)\n gr.addColorStop(0, 'rgba(248,250,252,1)')\n gr.addColorStop(0.45, 'rgba(236,242,244,0.75)')\n gr.addColorStop(1, 'rgba(236,242,244,0)')\n x.fillStyle = gr\n x.beginPath()\n x.arc(cx, cy, 26 * s, 0, PI * 2)\n x.fill()\n }\n function crackGlass(c: any, msh: any, p: any, force: any, sc?: any) {\n const G = msh.userData.glass\n if (!G.cv) {\n G.cv = document.createElement('canvas')\n G.cv.width = G.cv.height = 256\n const x0 = G.cv.getContext('2d')\n x0.fillStyle = 'rgba(48,66,72,0.5)'\n x0.fillRect(0, 0, 256, 256)\n G.tex = new THREE.CanvasTexture(G.cv)\n msh.material = new THREE.MeshStandardMaterial({\n color: 0xffffff,\n map: G.tex,\n emissive: 0x6a7276,\n emissiveMap: G.tex,\n transparent: true,\n roughness: 0.25,\n metalness: 0.1,\n side: DOUBLE_SIDE,\n depthWrite: false,\n })\n }\n const uv = glassUV(msh, p)\n const x = G.cv.getContext('2d')\n drawWeb(x, uv[0] * 256, (1 - uv[1]) * 256, sc != null ? sc : 0.6 + force * 0.5, Math.max(0.4, G.aspect || 1), c.rand)\n G.tex.needsUpdate = true\n G.hits++\n }\n /* irregular edge attached to the frame for glass without an outline (cut from the shell): only the strip near the open edges remains */\n function glassRim(geo: any, rnd: any) {\n const src = geo.index ? geo.toNonIndexed() : geo\n const p = src.attributes.position\n const cnt: any = {}\n const toColor: any = []\n function key(i: any) {\n return Math.round(p.getX(i) * 1000) + ',' + Math.round(p.getY(i) * 1000) + ',' + Math.round(p.getZ(i) * 1000)\n }\n for (let f = 0; f < p.count; f += 3)\n for (let k = 0; k < 3; k++) {\n const a = f + k\n const b = f + ((k + 1) % 3)\n const ka = key(a)\n const kb = key(b)\n const e = ka < kb ? ka + '|' + kb : kb + '|' + ka\n if (!cnt[e]) cnt[e] = { n: 0, a: a, b: b }\n cnt[e].n++\n }\n Object.keys(cnt).forEach(function (e) {\n const q = cnt[e]\n if (q.n === 1) toColor.push([new V3().fromBufferAttribute(p, q.a), new V3().fromBufferAttribute(p, q.b)])\n })\n if (toColor.length < 3 || toColor.length > 900) return null\n const nz = I.valueNoise(Math.floor(rnd() * 999))\n const ab = new V3()\n const ap = new V3()\n const q2 = new V3()\n function dist(x: any, y: any, z: any) {\n let best = 1e9\n q2.set(x, y, z)\n for (let i = 0; i < toColor.length; i++) {\n const A = toColor[i][0]\n const B = toColor[i][1]\n ab.subVectors(B, A)\n ap.subVectors(q2, A)\n const t = clamp(ap.dot(ab) / (ab.lengthSq() || 1), 0, 1)\n ap.addScaledVector(ab, -t)\n const d = ap.lengthSq()\n if (d < best) best = d\n }\n return Math.sqrt(best)\n }\n const sub = subdivide(src, 0.03)\n const r = cutGeometry(sub, [\n {\n sdf: function (x: any, y: any, z: any) {\n return 0.02 + 0.07 * nz(x * 9 + z * 5, y * 9 + z * 3) * nz(x * 23, y * 23 + z * 17) - dist(x, y, z)\n },\n },\n ])\n if (!r.geo.attributes.position.count) return null\n return crease(r.geo, 60)\n }\n function shatterGlass(c: any, msh: any, force: any, dir: any) {\n const G = msh.userData.glass\n if (G.broken) return\n G.broken = true\n const cubesAt = []\n if (G.outline && G.T !== undefined) {\n const out = G.outline\n let cx = 0\n let cy = 0\n out.forEach(function (p: any) {\n cx += p.x\n cy += p.y\n })\n cx /= out.length\n cy /= out.length\n const shp = new THREE.Shape(\n out.map(function (p: any) {\n return new THREE.Vector2(p.x, p.y)\n }),\n )\n const hole = new THREE.Path()\n out.forEach(function (p: any, i: any) {\n const dx = cx - p.x\n const dy = cy - p.y\n const d = Math.hypot(dx, dy) || 1\n const k = Math.min(d * 0.45, 0.025 + c.rand() * (i % 3 === 0 ? 0.11 : 0.05))\n const q = [p.x + (dx / d) * k, p.y + (dy / d) * k]\n if (i === 0) hole.moveTo(q[0], q[1])\n else hole.lineTo(q[0], q[1])\n })\n shp.holes.push(hole)\n const geo = new THREE.ShapeGeometry(shp)\n geo.translate(0, 0, G.zpos + 0.004)\n tumble(geo, G.T)\n geo.computeVertexNormals()\n msh.geometry.dispose()\n msh.geometry = geo\n msh.material = MATERIALS.glassEdge\n let minx = 1e9\n let maxx = -1e9\n let miny = 1e9\n let maxy = -1e9\n out.forEach(function (p: any) {\n minx = Math.min(minx, p.x)\n maxx = Math.max(maxx, p.x)\n miny = Math.min(miny, p.y)\n maxy = Math.max(maxy, p.y)\n })\n for (let i = 0; i < 46; i++) {\n const x = minx + (maxx - minx) * (0.1 + c.rand() * 0.8)\n const y = miny + (maxy - miny) * (0.1 + c.rand() * 0.8)\n cubesAt.push(new V3(x, y, G.side * I.halfAt(G.Wg, G.T, y)))\n }\n } else {\n msh.geometry.computeBoundingBox()\n const bb = msh.geometry.boundingBox.clone().applyMatrix4(msh.matrix)\n const rim = glassRim(msh.geometry, c.rand)\n if (rim) {\n msh.geometry.dispose()\n msh.geometry = rim\n msh.material = MATERIALS.glassEdge\n } else msh.visible = false\n for (let j = 0; j < 36; j++)\n cubesAt.push(\n new V3(\n bb.min.x + (bb.max.x - bb.min.x) * c.rand(),\n bb.min.y + (bb.max.y - bb.min.y) * c.rand(),\n bb.min.z + (bb.max.z - bb.min.z) * c.rand(),\n ),\n )\n }\n const seatGeo: any = []\n const d = dir.clone().normalize()\n cubesAt.forEach(function (p, i) {\n if (i % 3 === 0 && c.seatTops.length && !c.rollState && !c.flipped) {\n let best: any = null\n let bd = 1e9\n c.seatTops.forEach(function (s: any) {\n const dd = Math.hypot(s.x - p.x, s.z - p.z)\n if (dd < bd) {\n bd = dd\n best = s\n }\n })\n if (best && bd < 1.6) {\n const g = new THREE.BoxGeometry(0.014, 0.014, 0.014)\n g.rotateY(c.rand() * 3)\n g.translate(best.x + (c.rand() - 0.5) * best.l * 0.8, best.y + 0.007, best.z + (c.rand() - 0.5) * best.w * 0.8)\n seatGeo.push(g)\n return\n }\n }\n const v = d\n .clone()\n .multiplyScalar(0.4 + force * c.rand() * 1.4)\n .add(new V3((c.rand() - 0.5) * 0.8, c.rand() * 0.6, (c.rand() - 0.5) * 0.8))\n kit.spawn(c, 'cube', c.toEffects(p), c.dirToEffects(v))\n })\n if (seatGeo.length) {\n const sm = new THREE.Mesh(mergeGeometries(seatGeo), I.PARTICLE_MATERIALS.cube)\n sm.castShadow = false\n c.vehicle.add(sm)\n }\n }\n function hitGlass(c: any, msh: any, p: any, dir: any, force: any) {\n const G = msh && msh.userData.glass\n if (!G || G.broken) return\n if (G.type === 'laminated') {\n crackGlass(c, msh, p, force)\n I.burst(c, 'shard', c.toEffects(p), 4 + Math.round(force * 4), { dir: c.dirToEffects(dir.clone().negate()), speed: 1.2 })\n } else shatterGlass(c, msh, force, dir)\n }\n kit.hitGlass = hitGlass\n function breakLight(c: any, L: any, dir: any) {\n if (!L || L.broken) return\n L.broken = true\n L.lens.forEach(function (m: any) {\n m.visible = false\n })\n L.inner.forEach(function (m: any) {\n m.material = MATERIALS.bulbBroken\n })\n ;(L.halo || []).forEach(function (h: any) {\n h.visible = false\n })\n const p = L.group ? L.group.position.clone() : L.inner[0] ? L.inner[0].position.clone() : new V3()\n I.burst(c, 'lens', c.toEffects(p), 10, { dir: c.dirToEffects(dir.clone().negate()), speed: 1.4, variant: L.tint === 'red' ? 'red' : 'clear' })\n I.burst(c, 'plastic', c.toEffects(p), 2, { dir: c.dirToEffects(dir.clone().negate()), speed: 1.0 })\n }\n kit.breakLight = breakLight\n\n Object.assign(I, { glassUV, drawWeb, crackGlass, glassRim, shatterGlass, hitGlass, breakLight })\n}\n","/** Impact resolution: direction, surface lookup, deformation, shards and sparks. */\nimport type { Kit } from './types'\nimport { clamp, hash, markDecal } from './util'\n\nexport function installImpact(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, DOUBLE_SIDE, crease, paintColor } = I\n\n /* ================= impact ================= */\n /* Dent field: smooth falloff (smoothstep), low-frequency ripple (<= 0.015), never crosses the centre plane. */\n function dentField(v: any, H: any) {\n const d = v.distanceTo(H.p)\n if (d >= H.R) return 0\n const t = 1 - d / H.R\n const f = t * t * (3 - 2 * t)\n const a = H.depth * f + 0.015 * f * Math.sin(v.x * 2.1 + v.z * 1.7 + H.ph) * Math.cos(v.y * 1.9)\n const lim = -((v.x - H.C.x) * H.dir.x + (v.y - H.C.y) * H.dir.y + (v.z - H.C.z) * H.dir.z) - 0.03\n return Math.max(0, Math.min(a, lim))\n }\n /* The bumper comes loose on the side of the hit and hangs from the other side (does not fly): the real part rotates around the attached end,\n without swapping the geometry, and the angle is limited so the loose end touches the ground without going through it (and does not become a pole on a tall vehicle). */\n function hangBumper(c: any, o: any, p: any) {\n if (!o || o.userData.hung || !o.parent || c.meta.noBumper) return\n o.userData.hung = true\n const di = c.deform.indexOf(o)\n if (di >= 0) c.deform.splice(di, 1)\n o.updateMatrix()\n o.geometry.computeBoundingBox()\n const bb = o.geometry.boundingBox.clone().applyMatrix4(o.matrix)\n const wz = (bb.max.z - bb.min.z) * 0.97\n const hh = (bb.max.y - bb.min.y) / 2\n if (wz < 0.2) return\n const att = p.z >= (bb.min.z + bb.max.z) / 2 ? -1 : 1\n const par = o.parent\n const sx = o.position.x >= 0 ? 1 : -1\n const zc = (bb.min.z + bb.max.z) / 2\n const piv = new THREE.Group()\n piv.position.set(o.position.x, o.position.y, zc + (att * wz) / 2)\n par.add(piv)\n par.remove(o)\n piv.add(o)\n o.position.set(0, 0, o.position.z - piv.position.z)\n piv.userData.rigid = true\n piv.userData.noFollow = true\n const drop = Math.max(0.0, piv.position.y - hh - 0.01)\n const th = Math.min(Math.asin(Math.min(0.98, drop / wz)), 0.42)\n piv.rotation.x = -att * th\n piv.rotation.y = -0.1 * sx * att\n }\n /* fuel of the tank that was hit: the part label wins (\"diesel\"), otherwise the vehicle sheet */\n function tankFuel(c: any, pt: any) {\n const lb = (pt.label || '').toLowerCase()\n const fu = c.spec && c.spec.fuel\n if (pt.fuel === 'diesel' || kit.matchers.diesel.test(lb)) return 'diesel'\n if ((pt.fuel === 'gasoline' || kit.matchers.fuel.test(lb)) && fu !== 'diesel') return 'gasoline'\n return fu === 'diesel' ? 'diesel' : fu === 'electric' || fu === 'none' ? null : 'gasoline'\n }\n function hurtEngine(c: any, h: any) {\n c.engineHealth = Math.min(c.engineHealth == null ? 1 : c.engineHealth, h)\n }\n kit.hurtEngine = hurtEngine\n function igniteFuel(c: any, pd: any) {\n if (!pd || pd.kind !== 'gasoline' || pd.fire) return\n pd.fire = true\n for (let k = 0; k < 3; k++) {\n const a = (k / 3) * PI * 2 + c.rand()\n const r = pd.max * 0.35 * c.rand()\n kit.addEmitter(c, new V3(pd.x0 + Math.cos(a) * r, 0.05, pd.z0 + Math.sin(a) * r), 'fire', { world: true, rate: 9, s: 1.2 })\n }\n I.burst(c, 'spark', new V3(pd.x0, 0.1, pd.z0), 14, { speed: 2.5 })\n }\n kit.igniteFuel = igniteFuel\n function applyPart(c: any, pt: any, force: any, dir: any, p: any) {\n const k = pt.kind\n const o = pt.obj\n const m = c.meta\n if (pt.onHit) return pt.onHit(c, pt, force, dir, p)\n if (k === 'headlight' || k === 'taillight') I.breakLight(c, pt.light, dir)\n else if (k === 'glass') I.hitGlass(c, o, p, dir, force)\n else if (k === 'wheel') {\n if (o && !o.userData.flat) {\n o.userData.flat = true\n o.scale.y = 0.74\n o.position.y -= o.userData.r * 0.24\n o.rotation.y += (hash(o.position.x, 1, 1) - 0.5) * 0.25\n }\n } else if (k === 'bumper') {\n if (o && force > 0.6) hangBumper(c, o, p)\n } else if (k === 'radiator') {\n kit.addEmitter(c, pt.pos.clone().add(new V3(-0.1, 0.25, 0)), 'white')\n hurtEngine(c, 0.6)\n } else if (k === 'engine') {\n kit.addEmitter(c, pt.pos.clone().add(new V3(0, 0.3, 0)), 'black')\n hurtEngine(c, force > 1.1 ? 0.1 : 0.3)\n if (c.hood && force > 0.5 && !c.hood.noLatch) {\n c.hood.latch = Math.max(c.hood.latch, 0.15)\n }\n if (m.kind !== 'boat' && m.kind !== 'plane' && m.kind !== 'heli')\n I.puddle(c, 'oil', pt.pos.clone().setY(Math.max(0.2, m.clearance || 0.3)), 0.55 + force * 0.25)\n } else if (k === 'hood') {\n if (c.hood && force > 0.4 && !c.hood.noLatch) c.hood.latch = Math.max(c.hood.latch, 0.15)\n } else if (k === 'fuel_tank') {\n const fu = tankFuel(c, pt)\n if (m.kind !== 'boat' && fu) {\n const pd = I.puddle(c, fu, pt.pos, (fu === 'diesel' ? 1.0 : 0.9) + force * 0.7)\n if (fu === 'gasoline' && force >= 1.0) igniteFuel(c, pd)\n }\n if (fu === 'gasoline' && force >= 1.0) kit.blastDamage(c, force * 180)\n } else if (k === 'battery') {\n kit.addEmitter(c, pt.pos.clone().add(new V3(0, 0.15, 0)), 'fire')\n kit.addEmitter(c, pt.pos.clone().add(new V3(0, 0.7, 0)), 'black', { rate: 3 })\n } else if (k === 'hull') {\n c.sunk = Math.max((c.sunk || 0) - 0.3 * force, -(m.belt || 0.5) * 0.45)\n c.vehicle.rotation.x += 0.06 * force\n I.burst(c, 'water', c.toEffects(p).setY(0.05), 20, { speed: 2.5 })\n } else if (k === 'armor') {\n I.burst(c, 'spark', c.toEffects(p), 18, { dir: c.dirToEffects(dir.clone().negate()), speed: 3.5, spread: 1.5 })\n } else if (k === 'stern') {\n if (o) {\n o.rotation.z = 0.5\n o.position.y -= 0.1\n }\n } else if (k === 'propeller' || k === 'rotor' || k === 'tail_rotor') {\n if (o) {\n o.children.forEach(function (ch: any, i: any) {\n if (ch.type === 'Group') {\n ch.rotation.z += -0.15 - hash(i, 1, 1) * 0.25\n ch.rotation.x += i % 2 ? 0.2 : -0.2\n }\n })\n c.spin = c.spin.filter(function (s: any) {\n return s.o !== o\n })\n }\n } else if (k === 'landing_gear') {\n c.vehicle.rotation.x += (m.kind === 'plane' ? 0.2 : 0.13) * (pt.pos.z < 0 ? -1 : 1)\n c.vehicle.position.y -= 0.12\n }\n }\n kit.applyPart = applyPart\n const SCRATCH_MATERIAL = makeMaterial('#9da3a6', { metalness: 0.85, roughness: 0.35 })\n const SOOT_MATERIAL = makeMaterial('#141312', {\n roughness: 1,\n transparent: true,\n opacity: 0.38,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -1,\n polygonOffsetUnits: -2,\n })\n const _ray = new THREE.Raycaster()\n function findSurface(c: any, p: any, dir: any) {\n c.root.updateMatrixWorld(true)\n const Mw = c.vehicle.matrixWorld\n const o = p.clone().addScaledVector(dir, -1.2).applyMatrix4(Mw)\n const d = dir.clone().transformDirection(Mw)\n _ray.set(o, d)\n _ray.far = 1.2 + 0.45\n const hits = _ray.intersectObject(c.vehicle, true)\n for (let i = 0; i < hits.length; i++) {\n const h = hits[i]\n const ob = h.object\n let vis = true\n for (let q = ob; q && q !== c.vehicle; q = q.parent)\n if (!q.visible) {\n vis = false\n break\n }\n if (!vis || ob.userData.decal || ob.userData.ghost || !h.face) continue\n const inv = new THREE.Matrix4().copy(Mw).invert()\n const lp = h.point.clone().applyMatrix4(inv)\n const n = h.face.normal.clone().transformDirection(ob.matrixWorld).transformDirection(inv)\n if (n.dot(dir) > 0) n.negate()\n return { p: lp, n: n, obj: ob }\n }\n return null\n }\n function scratches(c: any, p: any, dir: any, force: any) {\n const d = dir.clone().normalize()\n const t1 = new V3().crossVectors(d, Math.abs(d.y) > 0.9 ? new V3(1, 0, 0) : new V3(0, 1, 0)).normalize()\n const t2 = new V3().crossVectors(d, t1)\n const q = new THREE.Quaternion().setFromUnitVectors(new V3(1, 0, 0), t1)\n const n = 3 + Math.round(force * 3)\n for (let i = 0; i < n; i++) {\n const a = hash(p.x * 7 + i, p.y * 5, p.z * 3) - 0.5\n const b = hash(i, p.x * 3, p.z * 7) - 0.5\n const len = 0.22 + force * 0.3 * hash(i, 9, p.y)\n const m = c.add(new THREE.BoxGeometry(len, 0.01, 0.005), SCRATCH_MATERIAL, 0, 0, 0)\n m.castShadow = false\n m.userData.decal = true\n m.position\n .copy(p)\n .addScaledVector(t1, a * 0.5)\n .addScaledVector(t2, b * 0.35)\n .addScaledVector(d, -0.008)\n m.quaternion.copy(q)\n m.rotation.z += (a - b) * 0.25\n }\n const sr = 0.12 + force * 0.1\n const ss = new THREE.Shape()\n const nzs = I.valueNoise(Math.floor(hash(p.x, p.y, p.z) * 997))\n for (let k = 0; k <= 20; k++) {\n const an = (k / 20) * PI * 2\n const rr = sr * (0.6 + 0.6 * nzs(Math.cos(an) * 2 + 5, Math.sin(an) * 2 + 5))\n ss[k ? 'lineTo' : 'moveTo'](Math.cos(an) * rr * 1.3, Math.sin(an) * rr)\n }\n const soot = c.add(new THREE.ShapeGeometry(ss), SOOT_MATERIAL, 0, 0, 0)\n soot.castShadow = false\n soot.userData.decal = true\n soot.position.copy(p).addScaledVector(d, -0.005)\n soot.lookAt(soot.position.clone().sub(d))\n }\n /* Impact at point p (c.vehicle coordinates), direction dir (into the vehicle), force 0.3..1.4. Returns the parts hit. */\n function impact(c: any, p: any, dir: any, force: any, opts?: any) {\n opts = opts || {}\n dir = dir.clone().normalize()\n const m = c.meta\n const air = m.kind === 'plane' || m.kind === 'heli'\n const Wref = air ? m.fuselageWidth || 1.3 : m.width || 1.7\n const R0 = (0.55 + 0.45 * force) * (air ? 1.25 : 1)\n /* depth: up to 18% of the width, never more than 0.3 m nor 35% of the dent radius; meta.stiff (0..1) hardens armour */\n const maxD = Math.min(0.18 * Wref, 0.26, R0 * 0.32, opts.maxDepth || 9) * (1 - 0.85 * clamp(m.stiff || 0, 0, 1))\n const H = {\n p: p,\n dir: dir,\n R: R0,\n depth: Math.min(maxD, (0.04 + 0.15 * force) * (1 - 0.85 * clamp(m.stiff || 0, 0, 1))),\n ph: hash(p.x, p.y, p.z) * 6,\n C: new V3(((m.front || 1) + (m.rear || -1)) / 2, (m.clearance || 0.3) + (m.bodyHeight || 0.6) * 0.5, 0),\n }\n c.root.updateMatrixWorld(true)\n const gInv = new THREE.Matrix4().copy(c.vehicle.matrixWorld).invert()\n const rel = new THREE.Matrix4()\n const irel = new THREE.Matrix4()\n const v = new V3()\n const v0 = new V3()\n const w = new V3()\n const sc = new V3()\n const cab = m.cabin && !c.flipped && !c.rollState ? m.cabin : null\n c.deform.forEach(function (msh: any) {\n if (!msh.parent || !msh.visible) return\n rel.multiplyMatrices(gInv, msh.matrixWorld)\n const g = msh.geometry\n const pos = g.attributes.position\n let changed = false\n if (!g.boundingSphere) g.computeBoundingSphere()\n sc.setFromMatrixScale(rel)\n v.copy(g.boundingSphere.center).applyMatrix4(rel)\n if (v.distanceTo(p) > H.R + g.boundingSphere.radius * Math.max(sc.x, sc.y, sc.z)) return\n irel.copy(rel).invert()\n if (!g.userData.p0) g.userData.p0 = new Float32Array(pos.array)\n const p0 = g.userData.p0\n for (let i = 0; i < pos.count; i++) {\n v.fromBufferAttribute(pos, i).applyMatrix4(rel)\n const a = dentField(v, H)\n if (a <= 0) continue\n v.addScaledVector(dir, a)\n v0.set(p0[3 * i], p0[3 * i + 1], p0[3 * i + 2]).applyMatrix4(rel)\n w.subVectors(v, v0)\n if (w.length() > maxD) v.copy(v0).add(w.setLength(maxD))\n /* the bodywork does not enter the cabin: it stops at the outer face of the liner (meta.cabin) */\n if (cab && v0.x > cab.x0 && v0.x < cab.x1 && v0.y > cab.y0 && v0.y < cab.y1 && Math.abs(v0.z) >= cab.z && Math.abs(v.z) < cab.z)\n v.z = (v0.z > 0 ? 1 : -1) * cab.z\n v.applyMatrix4(irel)\n pos.setXYZ(i, v.x, v.y, v.z)\n changed = true\n }\n if (changed) {\n pos.needsUpdate = true\n if (g.userData.crease) crease(g, 42)\n else g.computeVertexNormals()\n g.computeBoundingSphere()\n g.computeBoundingBox()\n }\n })\n const dset = new Set(c.deform)\n const box = new THREE.Box3()\n c.vehicle.children.forEach(function (o: any) {\n if (dset.has(o) || o.userData.noFollow) return\n if (!(o.isMesh || (o.isGroup && o.userData.rigid))) return\n if (!o.userData.c0) {\n if (o.isMesh) {\n if (!o.geometry.boundingSphere) o.geometry.computeBoundingSphere()\n o.userData.c0 = o.geometry.boundingSphere.center.clone().applyMatrix4(o.matrix)\n if (!o.geometry.boundingBox) o.geometry.computeBoundingBox()\n o.userData.bb0 = o.geometry.boundingBox.clone().applyMatrix4(o.matrix)\n } else {\n box.setFromObject(o)\n box.applyMatrix4(gInv)\n o.userData.c0 = box.getCenter(new V3())\n o.userData.bb0 = box.clone()\n }\n o.userData.pos0 = o.position.clone()\n }\n const sh = new V3().subVectors(o.position, o.userData.pos0)\n let cen = o.userData.c0.clone().add(sh)\n const bb0 = o.userData.bb0\n /* thin panel along the impact direction (door liner, trim, plate): follows the dent from the point nearest the impact, so it does not stick out of the bodywork */\n if (bb0) {\n const ext = new V3().subVectors(bb0.max, bb0.min)\n if (Math.abs(ext.x * dir.x) + Math.abs(ext.y * dir.y) + Math.abs(ext.z * dir.z) < 0.1) {\n const bq = bb0.clone().translate(sh)\n cen = bq.clampPoint(p, new V3())\n }\n }\n const a = dentField(cen, H)\n if (a <= 0) return\n o.position.addScaledVector(dir, a)\n w.subVectors(o.position, o.userData.pos0)\n if (w.length() > maxD) o.position.copy(o.userData.pos0).add(w.setLength(maxD))\n })\n const hit: any = []\n c.parts.forEach(function (pt: any) {\n if (pt.done) return\n if (pt.pos.distanceTo(p) < H.R * pt.reach + 0.1) {\n pt.done = true\n applyPart(c, pt, force, dir, p)\n hit.push(pt)\n }\n })\n const pf = c.toEffects(p)\n const df = c.dirToEffects(dir.clone().negate())\n if (!opts.noFx) {\n if (m.kind === 'boat' && p.y < (m.belt || 0.5))\n I.burst(c, 'water', pf.clone().setY(Math.max(0.05, pf.y)), 18, { dir: df, speed: 2.2 })\n else I.burst(c, 'spark', pf, Math.round(8 + force * 16), { dir: df, speed: 2.5 + force * 2, spread: 1.4, jitter: 0.05 })\n if (force > 0.6) {\n I.burst(c, 'scrap', pf, Math.round(force * 5), {\n dir: df,\n speed: 1.4,\n mat: makeMaterial(paintColor(m.color || '#777', c.state), { roughness: 0.5, metalness: 0.3, side: DOUBLE_SIDE }),\n })\n I.burst(c, 'plastic', pf, 2, { dir: df, speed: 1.2 })\n }\n }\n /* stain (config.impactStain) and scratches only where there is bodywork (bikes and motorcycles are hollow) */\n const surf = findSurface(c, p, dir)\n if (surf) {\n if (kit.config.impactStain && !opts.noStain && force > 0.45 && !air && m.kind !== 'boat') {\n const sp = surf.p.clone().addScaledVector(surf.n, 0.002)\n markDecal(\n kit.splat(c, sp, surf.n, 0.08 + force * 0.04, {\n fluid: kit.config.impactStain,\n obj: surf.obj,\n glass: !!(surf.obj && surf.obj.userData.glass),\n }).grp,\n )\n }\n scratches(c, surf.p, surf.n.clone().negate(), force)\n }\n hit.forEach(function (pt: any) {\n c.log.push(pt)\n })\n return hit\n }\n kit.impact = impact\n /* Effect text per part kind (crash report). Empty in the SDK; the game plugin fills it (configure({ partEffects })). */\n kit.partEffects = {}\n /* ray in c.vehicle coordinates against the visible meshes of the vehicle (no decals); returns the first point */\n const _pr = new THREE.Raycaster()\n function probe(c: any, o: any, d: any, far: any) {\n c.root.updateMatrixWorld(true)\n const Mw = c.vehicle.matrixWorld\n const inv = new THREE.Matrix4().copy(Mw).invert()\n _pr.set(o.clone().applyMatrix4(Mw), d.clone().transformDirection(Mw))\n _pr.far = far || 10\n const hits = _pr.intersectObject(c.vehicle, true)\n for (let i = 0; i < hits.length; i++) {\n const h = hits[i]\n const ob = h.object\n let ok = !!h.face\n for (let q = ob; ok && q && q !== c.vehicle; q = q.parent) if (!q.visible || q.userData.decal || q.userData.ghost) ok = false\n if (ok) return { p: h.point.clone().applyMatrix4(inv), obj: ob }\n }\n return null\n }\n kit.probe = probe\n function zoneImpact(c: any, zone: any, force: any) {\n const m = c.meta\n const mid = m.clearance + (m.bodyHeight || 0.6) * 0.5\n let p\n let dir\n const land = m.kind !== 'plane' && m.kind !== 'heli' && m.kind !== 'boat'\n if (zone === 'rolled') {\n kit.roll(c, 1)\n return []\n }\n if (zone === 'front') {\n p = new V3(m.front, mid, m.width * 0.15)\n dir = new V3(-1, 0, 0)\n } else if (zone === 'rear') {\n p = new V3(m.rear, mid, -m.width * 0.15)\n dir = new V3(1, 0, 0)\n } else if (zone === 'left') {\n p = new V3((m.front + m.rear) * 0.5 + m.length * 0.12, mid + 0.1, -m.width / 2)\n dir = new V3(0, 0, 1)\n } else {\n p = new V3((m.front + m.rear) * 0.5 - m.length * 0.1, mid + 0.1, m.width / 2)\n dir = new V3(0, 0, -1)\n }\n if (m.kind === 'plane' && (zone === 'left' || zone === 'right')) {\n p.set(0.2, m.top - 0.1, (zone === 'left' ? -1 : 1) * 4.2)\n dir.set(0, -0.6, 0)\n }\n if ((m.kind === 'plane' || m.kind === 'heli') && (zone === 'left' || zone === 'right') && m.fuselageWidth) {\n if (m.kind === 'heli') p.z = ((zone === 'left' ? -1 : 1) * m.fuselageWidth) / 2\n }\n if (m.kind === 'boat' && (zone === 'left' || zone === 'right')) p.y = m.belt - 0.2\n if (land && (zone === 'left' || zone === 'right') && !m.zoneFixed) {\n /* height from the real bodywork: buses and trucks aim between the belt line and the roof (windows); the others, at mid side.\n Tries several heights and keeps the first that finds bodywork on the outside. */\n const sd = zone === 'left' ? -1 : 1\n const tall = m.kind === 'bus' || m.kind === 'truck' || (m.belt > 1.5 && m.top - m.belt > 0.9)\n const yPref = tall ? m.belt + (m.top - m.belt) * 0.3 : mid + 0.1\n const ys = []\n for (let y = Math.max(0.12, m.clearance * 0.6); y < m.top - 0.04; y += 0.07) ys.push(y)\n ys.sort(function (a, b) {\n return Math.abs(a - yPref) - Math.abs(b - yPref)\n })\n for (let k = 0; k < ys.length; k++) {\n const h = probe(c, new V3(p.x, ys[k], sd * (m.width / 2 + 3)), new V3(0, 0, -sd), 3 + m.width * 0.45)\n if (h && Math.abs(h.p.z) > m.width * 0.22 && !(h.obj.parent && h.obj.parent.userData.r && c.wheels.indexOf(h.obj.parent) >= 0)) {\n p = h.p\n break\n }\n }\n }\n const hit = impact(c, p, dir, force)\n if (zone === 'front' && force > 0.7 && land) {\n /* a hard frontal impact cracks the windshield from its base (the body hits the glass) */\n const ws = c.parts.find(function (pt: any) {\n return (\n pt.kind === 'glass' &&\n !pt.done &&\n (pt.key ? pt.key === 'windshield' : kit.matchers.windshield.test(pt.label)) &&\n pt.obj &&\n pt.obj.userData.glass &&\n pt.obj.userData.glass.type === 'laminated'\n )\n })\n if (ws) {\n const g = ws.obj\n g.geometry.computeBoundingBox()\n const bb = g.geometry.boundingBox.clone().applyMatrix4(g.matrix)\n const pb = new V3(\n bb.max.x - (bb.max.x - bb.min.x) * 0.25,\n bb.min.y + (bb.max.y - bb.min.y) * 0.28,\n (bb.min.z + bb.max.z) / 2 + (bb.max.z - bb.min.z) * 0.18,\n )\n ws.done = true\n I.hitGlass(c, g, pb, new V3(-1, -0.2, 0), force * 0.9)\n hit.push(ws)\n c.log.push(ws)\n }\n }\n return hit\n }\n kit.zoneImpact = zoneImpact\n\n Object.assign(I, {\n dentField,\n hangBumper,\n tankFuel,\n hurtEngine,\n igniteFuel,\n applyPart,\n SCRATCH_MATERIAL,\n SOOT_MATERIAL,\n _ray,\n findSurface,\n scratches,\n impact,\n _pr,\n probe,\n zoneImpact,\n })\n}\n","/** Fuel tank explosion, fireball, flying debris and burnt-out state. */\nimport type { Kit } from './types'\n\nexport function installExplosion(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, DOUBLE_SIDE, MATERIALS, paintColor, textTexture } = I\n\n /* ================= explosion ================= */\n /* Chain: the engine catches fire with black smoke (3 to 8 s), the vehicle jumps ~1.5 m, hood, doors, trunk and a wheel fly off with a fire trail,\n the glass bursts into shards and the burnt-out shell is left with a low fire. Fuel tank explosion damage: > 200 fire, > 400 explodes in 0.6 s.\n The tanker truck (meta.bigBlast) makes a gas station tank explosion: lethal radius 12 m, injury radius 30 m, 16 m mushroom cloud. */\n const BURNT = ['#1d1a17', '#26211c', '#171514', '#2e2620'].map(function (h, i) {\n return makeMaterial(h, { roughness: 1, metalness: i === 3 ? 0.35 : 0.15 })\n })\n const BURNT_RUB = makeMaterial('#0b0b0b', { roughness: 1 })\n function boomMat(hex: any, op: any, add?: any) {\n return new THREE.MeshBasicMaterial({\n color: new THREE.Color(hex),\n transparent: true,\n opacity: op,\n depthWrite: false,\n side: DOUBLE_SIDE,\n fog: false,\n blending: add ? THREE.AdditiveBlending : THREE.NormalBlending,\n })\n }\n function enginePos(c: any) {\n const mot = c.parts.find(function (p: any) {\n return p.kind === 'engine'\n })\n if (mot) return mot.pos.clone()\n const m = c.meta\n return new V3(m.front - 0.6, (m.clearance || 0.3) + 0.3, 0)\n }\n kit.explode = function (c: any, o: any) {\n o = o || {}\n if (c.blast || c.exploded) return false\n const fuse = o.now ? 0 : o.delay != null ? o.delay : 3 + c.rand() * 5\n c.blast = { phase: 'fire', t: 0, T: fuse }\n if (fuse > 0) {\n const ep = enginePos(c)\n kit.addEmitter(c, ep.clone().add(new V3(0, 0.25, 0)), 'fire', { rate: 10, s: 0.9 })\n kit.addEmitter(c, ep.clone().add(new V3(0, 0.6, 0)), 'black', { rate: 6, s: 1.2 })\n I.hurtEngine(c, 0.1)\n }\n if (c.hood) c.hood.target = 0\n return fuse\n }\n /* explosion damage on the tank (sum). Returns \"fire\", \"explosion\" or null */\n kit.blastDamage = function (c: any, amount: any) {\n c.tankDamage = (c.tankDamage || 0) + amount\n if (c.tankDamage > 400 && !c.exploded && (!c.blast || c.blast.phase === 'fire')) {\n c.blast = { phase: 'fire', t: 0, T: 0.6 }\n return 'explosion'\n }\n if (c.tankDamage > 200 && !c.tankFire) {\n c.tankFire = true\n const tk = c.parts.find(function (p: any) {\n return p.kind === 'fuel_tank'\n })\n const tp = tk ? tk.pos.clone() : enginePos(c)\n kit.addEmitter(c, tp.clone().setY(Math.max(0.15, tp.y)), 'fire', { rate: 12, s: 1.1 })\n kit.addEmitter(c, tp.clone().setY(tp.y + 0.8), 'black', { rate: 5, s: 1.4 })\n return 'fire'\n }\n return null\n }\n function fling(c: any, obj: any, v: any, w: any) {\n if (!obj || !obj.parent) return null\n c.root.updateMatrixWorld(true)\n const bb = new THREE.Box3().setFromObject(obj)\n if (bb.isEmpty()) return null\n const cen = bb.getCenter(new V3())\n const holder = new THREE.Group()\n c.root.worldToLocal(cen)\n holder.position.copy(cen)\n c.effects.add(holder)\n c.effects.updateMatrixWorld(true)\n holder.attach(obj)\n const sz = bb.getSize(new V3())\n const piece = { o: holder, v: v, w: w, r: Math.max(0.08, Math.min(sz.x, sz.y, sz.z) * 0.5 + 0.02), landed: false, trail: 2.2 }\n c.flying = c.flying || []\n c.flying.push(piece)\n obj.traverse(function (x: any) {\n x.userData.noFollow = true\n })\n const di = c.deform.indexOf(obj)\n if (di >= 0) c.deform.splice(di, 1)\n return piece\n }\n function burnAll(c: any) {\n let i = 0\n c.vehicle.traverse(function (o: any) {\n if (o.isSprite) {\n o.visible = false\n return\n }\n if (!o.isMesh || o.userData.decal) return\n const mt = o.material\n if (!mt || Array.isArray(mt)) return\n if (mt === MATERIALS.rubber) {\n o.material = BURNT_RUB\n return\n }\n if (mt.transparent && mt.opacity < 0.7) {\n if (!o.userData.glass) o.visible = false\n return\n }\n o.material = BURNT[i++ % BURNT.length]\n })\n c.lights.forEach(function (L: any) {\n L.broken = true\n L.lens.forEach(function (m: any) {\n m.visible = false\n })\n ;(L.halo || []).forEach(function (h: any) {\n h.visible = false\n })\n })\n }\n function bigBoomFx(c: any) {\n const g = new THREE.Group()\n c.effects.add(g)\n c.bigFx = { g: g, t: 0, rings: [], col: [] }\n ;[\n [12, '#d8322a', kit.t('blast.lethal', { m: 12 })],\n [30, '#e0a548', kit.t('blast.injury', { m: 30 })],\n ].forEach(function (r: any) {\n const ring = new THREE.Mesh(new THREE.RingGeometry(r[0] - 0.25, r[0], 96), boomMat(r[1], 0.85))\n ring.rotation.x = -PI / 2\n ring.position.y = 0.06\n ring.renderOrder = 5\n g.add(ring)\n const fill = new THREE.Mesh(new THREE.CircleGeometry(r[0], 96), boomMat(r[1], 0.07))\n fill.rotation.x = -PI / 2\n fill.position.y = 0.05\n g.add(fill)\n const lb = new THREE.Mesh(\n new THREE.PlaneGeometry(r[0] * 0.45, r[0] * 0.08),\n new THREE.MeshBasicMaterial({\n map: textTexture(r[2], { w: 1024, h: 160, fg: r[1], size: 0.62 }),\n transparent: true,\n depthWrite: false,\n fog: false,\n }),\n )\n lb.rotation.x = -PI / 2\n lb.position.set(0, 0.08, r[0] + r[0] * 0.06)\n g.add(lb)\n c.bigFx.rings.push(ring, fill, lb)\n })\n }\n function detonate(c: any) {\n const m = c.meta\n const B = c.blast\n const ep = enginePos(c)\n const cen = c.toEffects(new V3(((m.front || 1) + (m.rear || -1)) / 2, (m.clearance || 0.3) + (m.bodyHeight || 0.6) * 0.5, 0))\n const big = !!m.bigBlast\n B.phase = 'flight'\n B.t = 0\n B.vy = Math.sqrt(2 * 9.8 * (big ? 1.0 : 1.5))\n B.y0 = c.vehicle.position.y\n B.rx = (c.rand() - 0.5) * 0.5\n B.rz = (c.rand() - 0.5) * 0.35\n c.exploded = true\n c.engineHealth = 0\n c.emitters = c.emitters.filter(function (e: any) {\n return e.kind !== 'exhaust'\n })\n /* flash, fireball, smoke, shock wave on the ground */\n const fl = new THREE.Sprite(\n new THREE.SpriteMaterial({\n map: I.glowTexture(),\n color: 0xffd9a0,\n blending: THREE.AdditiveBlending,\n transparent: true,\n depthWrite: false,\n fog: false,\n }),\n )\n fl.raycast = function () {}\n fl.position.copy(cen)\n fl.scale.setScalar(0.1)\n c.effects.add(fl)\n B.flash = fl\n const sw = new THREE.Mesh(new THREE.RingGeometry(0.8, 1, 64), boomMat('#ffcf8a', 0.6, true))\n sw.rotation.x = -PI / 2\n sw.position.set(cen.x, 0.07, cen.z)\n c.effects.add(sw)\n B.shock = sw\n const k = big ? 1.8 : 1\n for (let i = 0; i < (big ? 70 : 46); i++) {\n const d = new V3(c.rand() - 0.5, c.rand() * 0.9, c.rand() - 0.5).normalize()\n kit.spawn(c, 'fire', cen.clone().addScaledVector(d, 0.3), d.multiplyScalar((2.5 + c.rand() * 4) * k), {\n s: (1.0 + c.rand() * 1.4) * k,\n life: 0.8 + c.rand() * 0.7,\n })\n }\n for (let j = 0; j < (big ? 30 : 18); j++) {\n const d2 = new V3(c.rand() - 0.5, 0.4 + c.rand(), c.rand() - 0.5).normalize()\n kit.spawn(c, 'smoke', cen.clone().addScaledVector(d2, 0.6), d2.multiplyScalar(1.5 + c.rand() * 2), {\n variant: 'black',\n s: (1.4 + c.rand()) * k,\n life: 4 + c.rand() * 2,\n })\n }\n I.burst(c, 'spark', cen, 40, { speed: 7, spread: 1.6 })\n I.burst(c, 'scrap', cen, 14, {\n speed: 5,\n spread: 1.5,\n mat: makeMaterial(paintColor(m.color || '#777', c.state), { roughness: 0.5, metalness: 0.3, side: DOUBLE_SIDE }),\n })\n I.burst(c, 'plastic', cen, 8, { speed: 4 })\n /* the glass bursts into shards */\n c.glass.slice().forEach(function (gm2: any) {\n const G = gm2.userData.glass\n if (!G || G.broken || !gm2.visible || !gm2.parent) return\n if (G.type === 'laminated') {\n G.type = 'tempered'\n }\n I.shatterGlass(c, gm2, 1.4, new V3(0, 1, 0))\n })\n /* parts that fly off with a fire trail */\n function rv(a: any, b: any) {\n return a + c.rand() * (b - a)\n }\n if (c.hood) {\n fling(c, c.hood.piv, new V3(rv(1, 3), rv(6, 8.5), rv(-1.5, 1.5)), new V3(rv(-4, 4), rv(-2, 2), rv(3, 7)))\n c.hood = null\n }\n const W = m.width || 1.6\n const gh = m.glasshouse\n if (m.kind === 'car' && gh) {\n ;[1, -1].forEach(function (sd) {\n const dh = Math.max(0.35, (m.belt || 1) - (m.clearance || 0.3) - 0.08)\n const dx = gh.fb - 0.55\n const door = c.roundBox(0.95, dh, 0.045, 0.03, c.paint(m.color || '#777'), dx, (m.clearance || 0.3) + dh / 2 + 0.04, sd * (W / 2 + 0.01))\n const hole = c.roundBox(0.9, dh * 0.95, 0.02, 0.02, MATERIALS.dark, dx, (m.clearance || 0.3) + dh / 2 + 0.04, sd * (W / 2 - 0.01))\n hole.userData.noFollow = true\n fling(c, door, c.dirToEffects(new V3(rv(-1, 1), rv(3.5, 6), sd * rv(4, 6.5))), new V3(rv(-5, 5), rv(-4, 4), rv(-5, 5)))\n })\n }\n if (m.rearBumper && m.rearBumper.parent)\n fling(\n c,\n m.rearBumper.parent.isGroup && m.rearBumper.parent !== c.vehicle ? m.rearBumper.parent : m.rearBumper,\n c.dirToEffects(new V3(rv(-5, -3), rv(4, 6), rv(-1, 1))),\n new V3(rv(-3, 3), rv(-6, 6), rv(-3, 3)),\n )\n if (c.wheels.length) {\n const wi = Math.floor(c.rand() * c.wheels.length)\n const wh = c.wheels[wi]\n c.wheels.splice(wi, 1)\n c.parts.forEach(function (p: any) {\n if (p.obj === wh) p.done = true\n })\n fling(\n c,\n wh,\n c.dirToEffects(new V3(rv(-2, 2), rv(5, 7.5), (wh.position.z >= 0 ? 1 : -1) * rv(3, 5))),\n new V3(rv(-8, 8), rv(-3, 3), rv(-8, 8)),\n )\n }\n burnAll(c)\n /* low fire that stays on the shell */\n c.emitters = c.emitters.filter(function (e: any) {\n return e.kind === 'exhaust' ? false : true\n })\n c.emitters.forEach(function (e: any) {\n if (e.kind === 'fire') e.rate = Math.min(e.rate, 7)\n })\n kit.addEmitter(c, ep.clone().add(new V3(0, 0.15, 0)), 'fire', { rate: 8, s: 0.8 })\n kit.addEmitter(c, new V3(((m.front || 1) + (m.rear || -1)) / 2, (m.clearance || 0.3) + 0.35, 0), 'fire', { rate: 6, s: 0.7 })\n kit.addEmitter(c, ep.clone().add(new V3(0, 0.9, 0)), 'black', { rate: 4, s: 1.4 })\n c.parts.forEach(function (p: any) {\n if (p.kind === 'glass' || p.kind === 'headlight' || p.kind === 'taillight' || p.kind === 'hood') p.done = true\n })\n c.log.push({ kind: 'explosion', label: kit.t(big ? 'blast.tank_explosion' : 'blast.explosion') })\n if (big) bigBoomFx(c)\n }\n function tickBoom(c: any, dt: any) {\n const B = c.blast\n B.t += dt\n if (B.phase === 'fire') {\n if (B.t >= B.T) detonate(c)\n return\n }\n if (B.phase === 'flight') {\n B.vy -= 9.8 * dt\n c.vehicle.position.y += B.vy * dt\n c.vehicle.rotation.x += B.rx * dt * (B.vy > 0 ? 1 : -1)\n c.vehicle.rotation.z += B.rz * dt * (B.vy > 0 ? 1 : -1)\n if (c.vehicle.position.y <= B.y0 && B.vy < 0) {\n c.vehicle.position.y = B.y0\n if (B.vy < -2.5) {\n B.vy *= -0.18\n I.burst(c, 'dust', c.toEffects(new V3(0, 0.1, 0)).setY(0.1), 10, { speed: 1.5, spread: 2.5, jitter: 1.0, s: 1.6 })\n } else {\n B.phase = 'burnt'\n c.vehicle.rotation.x *= 0.3\n c.vehicle.rotation.z *= 0.3\n }\n }\n }\n if (B.flash) {\n const ft = B.t / 0.6\n if (ft < 1) {\n const sc = (c.meta.bigBlast ? 22 : 9) * Math.sin(Math.min(1, ft * 4) * PI * 0.5)\n B.flash.scale.set(sc, sc, 1)\n B.flash.material.opacity = 1 - ft\n } else {\n c.effects.remove(B.flash)\n B.flash.material.dispose()\n B.flash = null\n }\n }\n if (B.shock) {\n const st = B.t / 0.7\n if (st < 1) {\n const r = (c.meta.bigBlast ? 18 : 7) * st + 0.5\n B.shock.scale.set(r, r, 1)\n B.shock.material.opacity = 0.6 * (1 - st)\n } else {\n c.effects.remove(B.shock)\n B.shock.geometry.dispose()\n B.shock = null\n }\n }\n }\n function tickFlying(c: any, dt: any) {\n ;(c.flying || []).forEach(function (P: any) {\n if (P.landed) {\n if (P.trail > 0) {\n P.trail -= dt\n if (c.rand() < dt * 8) kit.spawn(c, 'fire', P.o.position.clone(), new V3(0, 0.8, 0), { s: 0.35, life: 0.5 })\n }\n return\n }\n P.v.y -= 9.8 * dt\n P.o.position.addScaledVector(P.v, dt)\n P.o.rotation.x += P.w.x * dt\n P.o.rotation.y += P.w.y * dt\n P.o.rotation.z += P.w.z * dt\n if (P.trail > 0 && c.rand() < dt * 30) {\n kit.spawn(c, 'fire', P.o.position.clone(), P.v.clone().multiplyScalar(-0.1), { s: 0.45 + c.rand() * 0.3, life: 0.45 })\n if (c.rand() < 0.4) kit.spawn(c, 'smoke', P.o.position.clone(), new V3(0, 0.6, 0), { variant: 'black', s: 0.5, life: 2 })\n }\n if (P.o.position.y < P.r) {\n P.o.position.y = P.r\n if (P.v.y < -2) {\n P.v.y *= -0.3\n P.v.x *= 0.5\n P.v.z *= 0.5\n P.w.multiplyScalar(0.5)\n I.burst(c, 'spark', P.o.position.clone().setY(0.05), 8, { speed: 2 })\n } else {\n P.landed = true\n P.o.rotation.x = Math.round(P.o.rotation.x / (PI / 2)) * (PI / 2) * 0 + P.o.rotation.x * 0.2\n P.o.rotation.z *= 0.2\n }\n }\n })\n if (c.bigFx) {\n const F = c.bigFx\n F.t += dt\n /* mushroom: a column that rises and a cap that opens to ~16 m */\n if (F.t < 4.5) {\n const cen = c.toEffects(new V3(((c.meta.front || 1) + (c.meta.rear || -1)) / 2, 1.5, 0))\n if (c.rand() < dt * 40)\n kit.spawn(\n c,\n 'fire',\n cen.clone().add(new V3((c.rand() - 0.5) * 1.5, c.rand() * 2, (c.rand() - 0.5) * 1.5)),\n new V3(c.rand() - 0.5, 7 + c.rand() * 3, c.rand() - 0.5),\n { s: 2.6 + c.rand() * 1.5, life: 1.8, nofog: true },\n )\n if (c.rand() < dt * 18)\n kit.spawn(\n c,\n 'smoke',\n cen.clone().add(new V3(0, 2, 0)),\n new V3((c.rand() - 0.5) * 0.6, 8 + c.rand() * 2, (c.rand() - 0.5) * 0.6),\n { variant: 'gray', s: 2.6, life: 2.0, grow: 1.6, nofog: true },\n )\n if (F.t > 1.0 && c.rand() < dt * 30) {\n const a = c.rand() * PI * 2\n kit.spawn(\n c,\n 'smoke',\n cen.clone().add(new V3(Math.cos(a) * 2, 14.5 + c.rand() * 2, Math.sin(a) * 2)),\n new V3(Math.cos(a) * 3.2, 0.6, Math.sin(a) * 3.2),\n { variant: 'gray', s: 3.6, life: 5, grow: 2.2, nofog: true },\n )\n }\n if (F.t > 0.8 && c.rand() < dt * 10) {\n const a2 = c.rand() * PI * 2\n kit.spawn(\n c,\n 'fire',\n cen.clone().add(new V3(Math.cos(a2) * 1.5, 15 + c.rand(), Math.sin(a2) * 1.5)),\n new V3(Math.cos(a2) * 2.5, 0.4, Math.sin(a2) * 2.5),\n { s: 3.8, life: 1.3, nofog: true },\n )\n }\n }\n const fade = F.t < 6 ? 1 : Math.max(0, 1 - (F.t - 6) / 2)\n F.rings.forEach(function (r: any, i: any) {\n r.material.opacity = (i % 3 === 1 ? 0.07 : 0.85) * fade * Math.min(1, F.t * 3)\n })\n if (fade <= 0) {\n c.effects.remove(F.g)\n c.bigFx = null\n }\n }\n }\n\n Object.assign(I, { BURNT, BURNT_RUB, boomMat, enginePos, fling, burnAll, bigBoomFx, detonate, tickBoom, tickFlying })\n}\n","/** Rollover physics and the rolled-over state. */\nimport type { Kit } from './types'\nimport { hash } from './util'\n\nexport function installRollover(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { MATERIALS } = I\n\n /* ================= rollover ================= */\n /* Rolls the vehicle sideways around the longitudinal axis (x). s = +1 falls to the right, -1 to the left.\n The support comes from the real shape: the convex hull (y, z) of all visible meshes (except decals, particles and thin rods),\n plus meta.rollRest [[y, z]...] and meta.rollTop if declared. The contact point stays still on the ground while the vehicle turns. */\n function rollMeshes(c: any) {\n const list: any = []\n const thin: any = []\n c.root.updateMatrixWorld(true)\n const inv = new THREE.Matrix4().copy(c.vehicle.matrixWorld).invert()\n c.vehicle.traverse(function (ob: any) {\n if (!ob.isMesh || !ob.geometry || !ob.geometry.attributes.position) return\n for (let q = ob; q && q !== c.vehicle; q = q.parent) if (!q.visible || q.userData.decal || q.userData.ghost) return\n const M = new THREE.Matrix4().multiplyMatrices(inv, ob.matrixWorld)\n if (!ob.geometry.boundingBox) ob.geometry.computeBoundingBox()\n const sz = ob.geometry.boundingBox.getSize(new V3())\n const sc = new V3().setFromMatrixScale(M)\n const d = [sz.x * sc.x, sz.y * sc.y, sz.z * sc.z].sort(function (a, b) {\n return a - b\n })\n /* `antena` is the original spelling of the flag */\n if (ob.userData.antenna || ob.userData.antena || (d[1] < 0.045 && d[2] > 0.2)) {\n thin.push({ o: ob, M: M })\n return\n }\n list.push({ o: ob, M: M })\n })\n return { list: list, thin: thin }\n }\n function convexHull(pts: any) {\n pts.sort(function (a: any, b: any) {\n return a[1] - b[1] || a[0] - b[0]\n })\n function cr(o: any, a: any, b: any) {\n return (a[1] - o[1]) * (b[0] - o[0]) - (a[0] - o[0]) * (b[1] - o[1])\n }\n const lo: any = []\n const up = []\n pts.forEach(function (p: any) {\n while (lo.length >= 2 && cr(lo[lo.length - 2], lo[lo.length - 1], p) <= 0) lo.pop()\n lo.push(p)\n })\n for (let i = pts.length - 1; i >= 0; i--) {\n const p = pts[i]\n while (up.length >= 2 && cr(up[up.length - 2], up[up.length - 1], p) <= 0) up.pop()\n up.push(p)\n }\n up.pop()\n lo.pop()\n return lo.concat(up)\n }\n kit.roll = function (c: any, s: any) {\n if (c.rollState || c.flipped) return false\n s = s || 1\n const m = c.meta\n const bike = m.kind === 'bike'\n const R = rollMeshes(c)\n let pts: any = []\n const v = new V3()\n let yc = 0\n let zc = 0\n let n = 0\n R.list.forEach(function (e: any) {\n const pos = e.o.geometry.attributes.position\n const st = Math.max(1, Math.floor(pos.count / 600))\n for (let i = 0; i < pos.count; i += st) {\n v.fromBufferAttribute(pos, i).applyMatrix4(e.M)\n pts.push([v.y, v.z])\n yc += v.y\n zc += v.z\n n++\n }\n })\n ;(m.rollRest || []).forEach(function (q: any) {\n pts.push([q[0], q[1]])\n })\n if (m.rollTop)\n [-1, 1].forEach(function (k) {\n pts.push([m.rollTop, k * m.width * 0.3])\n })\n if (pts.length < 3)\n pts = [\n [0, -m.width / 2],\n [0, m.width / 2],\n [m.top, m.width / 2],\n [m.top, -m.width / 2],\n ]\n const S = convexHull(pts)\n c.rollState = {\n t: 0,\n dur: bike ? 0.9 : m.kind === 'bus' || m.kind === 'truck' ? 2.0 : 1.6,\n s: s,\n S: S,\n last: -1,\n cz: c.vehicle.position.z,\n target: bike ? PI / 2 : PI,\n x: ((m.front || 1) + (m.rear || -1)) / 2,\n L: m.length || 2,\n bounce: 0,\n cen: [n ? yc / n : m.top / 2, n ? zc / n : 0],\n hitAt: null,\n hits: 0,\n thin: R.thin,\n y0: c.vehicle.position.y,\n }\n if (c.hood) c.hood.target = 0\n return true\n }\n function rollContact(c: any, A: any, q: any) {\n const m = c.meta\n const list: any = []\n const dy = A.cen[0] - q[0]\n const dz = A.cen[1] - q[1]\n const dl = Math.hypot(dy, dz) || 1\n const dir = new V3(0, dy / dl, dz / dl)\n const f = 0.75\n const bike = m.kind === 'bike'\n ;(bike ? [0] : [-0.28, 0, 0.28]).forEach(function (k) {\n list.push([new V3(A.x + k * A.L, q[0], q[1]), dir])\n })\n /* lying on its side: the window strip touches the ground too */\n if (!bike && Math.abs(dir.z) > 0.75 && m.top - m.belt > 0.25 && A.hits < 3) {\n const sd = -Math.sign(dir.z)\n const yw = m.belt + (m.top - m.belt) * 0.45\n ;[-0.25, 0.2].forEach(function (k) {\n const h = I.probe(c, new V3(A.x + k * A.L, yw, sd * (m.width / 2 + 2)), new V3(0, 0, -sd), 2 + m.width)\n if (h) list.push([h.p, new V3(0, 0, -sd)])\n })\n }\n list.forEach(function (e: any) {\n I.impact(c, e[0], e[1], f, { noStain: true, maxDepth: 0.1 })\n const pf = c.toEffects(e[0])\n pf.y = Math.max(0.03, pf.y)\n I.burst(c, 'dust', pf.clone().setY(0.1), 4, { speed: 0.9, spread: 2.2, jitter: 0.4, s: 1.2 })\n I.burst(c, 'spark', pf, 14, { speed: 3, spread: 1.6 })\n I.burst(c, 'shard', pf, 4, { speed: 1.5 })\n })\n A.hits++\n A.bounce = A.hits === 1 ? 0.06 : 0.1\n if (m.kind === 'boat') I.burst(c, 'water', c.toEffects(list[0][0]).setY(0.05), 30, { speed: 3 })\n }\n /* lowest y (in the c.root frame) of all supporting meshes, vertex by vertex */\n function exactMinY(c: any, list: any) {\n c.root.updateMatrixWorld(true)\n const inv = new THREE.Matrix4().copy(c.root.matrixWorld).invert()\n const M = new THREE.Matrix4()\n const v = new V3()\n let mn = 1e9\n list.forEach(function (e: any) {\n const ob = e.o\n if (!ob.parent || !I.shown(c, ob)) return\n M.multiplyMatrices(inv, ob.matrixWorld)\n const pos = ob.geometry.attributes.position\n for (let i = 0; i < pos.count; i++) {\n v.fromBufferAttribute(pos, i).applyMatrix4(M)\n if (v.y < mn) mn = v.y\n }\n })\n return mn\n }\n function finishRoll(c: any) {\n const A = c.rollState\n const m = c.meta\n c.rollState = null\n c.flipped = true\n c.vehicle.rotation.x = A.s * A.target\n if (A.hits < 2 && m.kind !== 'bike') {\n const cs = Math.cos(c.vehicle.rotation.x)\n const sn = Math.sin(c.vehicle.rotation.x)\n let best = null\n let by = 1e9\n A.S.forEach(function (q: any) {\n const y = q[0] * cs - q[1] * sn\n if (y < by) {\n by = y\n best = q\n }\n })\n if (best) rollContact(c, A, best)\n }\n /* settles on the real lowest point (the dented roof and rigid parts count) */\n const R = rollMeshes(c)\n const mn = exactMinY(c, R.list)\n if (mn < 1e8) c.vehicle.position.y -= mn\n /* thin rods (antennas, sticks) that would go through the ground break and shed pieces */\n c.root.updateMatrixWorld(true)\n const inv = new THREE.Matrix4().copy(c.root.matrixWorld).invert()\n R.thin.forEach(function (e: any) {\n const ob = e.o\n const bb = new THREE.Box3().setFromObject(ob).applyMatrix4(inv)\n if (bb.min.y < -0.01 && ob.parent) {\n const pf = bb.getCenter(new V3())\n pf.y = Math.max(0.05, pf.y)\n ob.visible = false\n I.burst(c, 'plastic', pf, 3, { speed: 1.2 })\n I.burst(c, 'spark', pf, 5, { speed: 2 })\n }\n })\n /* upside-down helicopter: the blades that would go through the ground break into pieces */\n if (m.kind === 'heli')\n c.parts.forEach(function (p: any) {\n if ((p.kind !== 'rotor' && p.kind !== 'tail_rotor') || !p.obj) return\n const main = p.kind === 'rotor'\n p.obj.traverse(function (o: any) {\n if (!o.isMesh || !o.visible) return\n const bb = new THREE.Box3().setFromObject(o).applyMatrix4(inv)\n if (!main && bb.min.y >= -0.01) return\n const pf = bb.getCenter(new V3())\n pf.y = Math.max(0.05, Math.min(pf.y, 0.4))\n o.visible = false\n I.burst(c, 'scrap', pf, 3, { speed: 1.4, mat: o.material && !Array.isArray(o.material) ? o.material : MATERIALS.trim })\n I.burst(c, 'spark', pf, 6, { speed: 2.2 })\n I.burst(c, 'dust', pf.clone().setY(0.1), 2, { speed: 0.8, s: 1.1 })\n })\n c.spin = c.spin.filter(function (sp: any) {\n return sp.o !== p.obj\n })\n })\n if (m.kind === 'heli') {\n const mn2 = exactMinY(c, R.list)\n if (mn2 < 1e8 && Math.abs(mn2) > 0.005) c.vehicle.position.y -= mn2\n }\n if (m.kind === 'boat') {\n c.vehicle.position.y -= 0.45\n c.sunk = c.vehicle.position.y\n }\n c.wheels.forEach(function (w: any, i: any) {\n c.spin.push({ o: w, axis: 'z', v: 2.2 + hash(i, 2, 3) * 2, decay: 0.12 })\n })\n const mot = c.parts.find(function (p: any) {\n return p.kind === 'engine'\n })\n if (mot && m.kind !== 'boat') kit.addEmitter(c, mot.pos.clone().add(new V3(0, -0.3, 0)), 'black', { rate: 4 })\n }\n function tickRoll(c: any, dt: any) {\n const A = c.rollState\n A.t += dt\n const p = Math.min(1, A.t / A.dur)\n const e = p * p * (3 - 2 * p)\n const phi = A.s * A.target * e\n const cs = Math.cos(phi)\n const sn = Math.sin(phi)\n let minY = 1e9\n let idx = 0\n A.S.forEach(function (q: any, i: any) {\n const y = q[0] * cs - q[1] * sn\n if (y < minY - 1e-6) {\n minY = y\n idx = i\n }\n })\n const q = A.S[idx]\n const zi = q[0] * sn + q[1] * cs\n if (idx !== A.last) {\n if (A.last < 0) A.cz = c.vehicle.position.z + zi\n else {\n const pq = A.S[A.last]\n A.cz += zi - (pq[0] * sn + pq[1] * cs)\n }\n A.last = idx\n if (A.t > 0.15 && (!A.hitAt || Math.hypot(q[0] - A.hitAt[0], q[1] - A.hitAt[1]) > 0.35)) {\n A.hitAt = q\n c.vehicle.rotation.x = phi\n c.vehicle.position.y = -minY\n c.vehicle.position.z = A.cz - zi\n rollContact(c, A, q)\n }\n }\n A.bounce = Math.max(0, A.bounce - dt * 0.5)\n c.vehicle.rotation.x = phi\n c.vehicle.position.y = -minY + Math.sin(Math.min(1, A.bounce / 0.1) * PI) * A.bounce * 0.6\n c.vehicle.position.z = A.cz - zi\n if (p >= 1) finishRoll(c)\n }\n kit.rollContact = rollContact\n\n Object.assign(I, { rollMeshes, convexHull, rollContact, exactMinY, finishRoll, tickRoll })\n}\n","/** Per-frame update loop for particles, fluids, spinning parts and rollover. */\nimport type { Kit } from './types'\n\nexport function installTick(kit: Kit): void {\n const I = kit._\n\n /* ================= per-frame loop ================= */\n kit.tick = function (c: any, dt: any) {\n c.time += dt\n if (c.rollState) I.tickRoll(c, dt)\n if (c.blast) I.tickBoom(c, dt)\n if (c.flying || c.bigFx) I.tickFlying(c, dt)\n if (c.hood) {\n const h = c.hood\n const tg = Math.max(h.target, h.latch)\n h.ang += (tg - h.ang) * Math.min(1, dt * 4.5)\n h.piv.rotation.z = h.ang * (h.sign || 1)\n }\n c.spin.forEach(function (s: any) {\n s.o.rotation[s.axis] += dt * s.v\n if (s.decay) s.v *= Math.max(0, 1 - s.decay * dt)\n })\n I.tickEmit(c, dt)\n I.tickParticles(c, dt)\n I.updateFluids(c, dt)\n if (c.meta.kind === 'boat' && !c.flipped && !c.rollState) {\n c.vehicle.position.y = (c.sunk || 0) + Math.sin(c.time * 1.3) * 0.04\n c.vehicle.rotation.z = Math.sin(c.time * 0.9) * 0.02\n }\n }\n kit.settle = function (c: any, sec: any) {\n const n = Math.round(sec * 30)\n for (let i = 0; i < n; i++) kit.tick(c, 1 / 30)\n }\n kit.setHood = function (c: any, open: any) {\n if (!c.hood) return false\n c.hood.target = open ? c.hood.open : 0\n return true\n }\n\n Object.assign(I, {})\n}\n","/** Armoured vehicle details (plating, hatches, add-on armour) and the applyArmor helper. */\nimport type { Kit } from './types'\nimport { clamp, hash } from './util'\n\nexport function installArmor(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, MATERIALS } = I\n\n /* ================= modified state ================= */\n const STEEL_MATERIAL = makeMaterial('#4e534f', { metalness: 0.55, roughness: 0.5 })\n const PLATE_MATERIALS = ['#4f5450', '#5b605b', '#454a47', '#56584f', '#4b4d4a'].map(function (h) {\n return makeMaterial(h, { metalness: 0.5, roughness: 0.55 })\n })\n kit.steelMaterial = STEEL_MATERIAL\n function jerryCan(c: any, x: any, y: any, z: any, col: any) {\n c.roundBox(0.34, 0.44, 0.16, 0.04, makeMaterial(col, { roughness: 0.5 }), x, y, z)\n c.tube(\n [\n [x - 0.1, y + 0.22, z],\n [x - 0.05, y + 0.28, z],\n [x + 0.05, y + 0.28, z],\n [x + 0.1, y + 0.22, z],\n ],\n 0.015,\n makeMaterial(col),\n )\n c.cylinder(0.025, 0.025, 0.05, MATERIALS.trim, x + 0.12, y + 0.24, z)\n }\n kit.jerryCan = jerryCan\n function applyArmor(c: any) {\n const m = c.meta\n const k = m.kind\n if (k === 'bike') {\n /* box resting on the roof rack (meta.rack = height) with a jerry can on top */\n const ry = m.rack || (m.belt || 0.8) - 0.05\n const bxx = (m.rear || -0.9) + 0.3\n const bh = m.length < 1.9 ? 0.26 : 0.32\n c.roundBox(m.length < 1.9 ? 0.36 : 0.42, bh, 0.32, 0.03, m.length < 1.9 ? MATERIALS.wood : makeMaterial('#3d3a2e'), bxx, ry + bh / 2, 0)\n jerryCan(c, bxx, ry + bh + 0.22, 0, '#8e2a20')\n if (m.length >= 1.9)\n [1, -1].forEach(function (s2) {\n c.tube(\n [\n [0.38, 0.9, s2 * 0.18],\n [0.45, 0.6, s2 * 0.32],\n [0.1, 0.3, s2 * 0.3],\n ],\n 0.02,\n MATERIALS.steel,\n )\n })\n return\n }\n if (k === 'boat') {\n const bx = m.front - 1.5\n const x0 = m.rear + 1.2\n const yt = m.top + 0.5\n for (let z = -0.6; z <= 0.61; z += 0.2) c.rod(new V3(x0, yt, z), new V3(bx, yt, z), 0.012, STEEL_MATERIAL)\n ;[x0, bx].forEach(function (x) {\n ;[-0.65, 0.65].forEach(function (zz) {\n c.rod(new V3(x, m.belt, zz), new V3(x, yt, zz), 0.03, STEEL_MATERIAL)\n })\n })\n ;[0.5, 0.2, -0.1].forEach(function (zz, i) {\n jerryCan(c, m.rear + 1.3, m.belt + 0.1, zz, i % 2 ? '#3e5a34' : '#8e2a20')\n })\n c.cylinder(0.14, 0.1, 0.2, MATERIALS.steel, bx, yt + 0.12, 0, 'x')\n c.cylinder(0.11, 0.11, 0.02, MATERIALS.head, bx + 0.1, yt + 0.12, 0, 'x')\n return\n }\n if (k === 'plane' || k === 'heli') {\n const wz = k === 'plane' ? 2.6 : 1.05\n const wy = k === 'plane' ? m.top - 0.25 : 0.55\n const pod = makeMaterial('#5c6158', { metalness: 0.4, roughness: 0.5 })\n ;[1, -1].forEach(function (s) {\n c.cylinder(0.18, 0.18, 1.3, pod, 0.2, wy - 0.25, s * wz, 'x')\n c.sphere(0.18, pod, 0.85, wy - 0.25, s * wz, 1.6, 1, 1)\n c.sphere(0.18, pod, -0.45, wy - 0.25, s * wz, 1.3, 1, 1)\n c.rod(new V3(0.2, wy - 0.1, s * wz), new V3(0.2, wy, s * wz), 0.02, MATERIALS.steel)\n })\n c.cylinder(0.16, 0.12, 0.22, MATERIALS.steel, m.front - 0.6, 0.85, 0.3, 'x')\n c.cylinder(0.13, 0.13, 0.02, MATERIALS.head, m.front - 0.48, 0.85, 0.3, 'x')\n return\n }\n if (!m.bullet) {\n c.glass.slice().forEach(function (gm2: any) {\n if (!gm2.parent) return\n const b = new THREE.Box3().setFromObject(gm2)\n const dx = b.max.x - b.min.x\n const dz = b.max.z - b.min.z\n const h = (b.max.y - b.min.y) * 0.96\n const yc = (b.max.y + b.min.y) / 2\n if (gm2.userData.ghost) {\n for (let xx = b.min.x; xx <= b.max.x; xx += 0.15)\n [b.min.z - 0.03, b.max.z + 0.03].forEach(function (zz) {\n c.rod(new V3(xx, b.min.y, zz), new V3(xx, b.max.y, zz), 0.014, STEEL_MATERIAL)\n })\n } else if (dz < 0.25 && dx > 0.2) {\n const z0 = b.max.z > 0 ? b.max.z + 0.035 : b.min.z - 0.035\n for (let x = b.min.x + 0.06; x < b.max.x - 0.03; x += 0.12)\n c.rod(new V3(x, yc - h / 2, z0), new V3(x, yc + h / 2, z0), 0.014, STEEL_MATERIAL)\n ;[yc - h / 2, yc + h / 2].forEach(function (y) {\n c.rod(new V3(b.min.x, y, z0), new V3(b.max.x, y, z0), 0.02, STEEL_MATERIAL)\n })\n }\n })\n c.quads.forEach(function (q: any) {\n const off = 0.06\n const bx2 = q.b[0] + q.n[0] * off\n const by2 = q.b[1] + q.n[1] * off\n const tx = q.t[0] + q.n[0] * off\n const ty = q.t[1] + q.n[1] * off\n for (let f = -1; f <= 1.0001; f += 0.14) c.rod(new V3(bx2, by2, f * q.hb), new V3(tx, ty, f * q.ht), 0.014, STEEL_MATERIAL)\n c.rod(new V3(bx2, by2, -q.hb), new V3(bx2, by2, q.hb), 0.02, STEEL_MATERIAL)\n c.rod(new V3(tx, ty, -q.ht), new V3(tx, ty, q.ht), 0.02, STEEL_MATERIAL)\n })\n }\n /* ram: an almost vertical blade flush with the bumper, held by arms back to the frame rail */\n const ph = clamp(Math.min(m.bodyHeight, 0.9) * 0.8, 0.32, 0.7)\n const yb = Math.max(0.1, m.clearance * 0.55)\n const fy = yb + ph / 2\n const fx = m.front + 0.11\n c.roundBox(0.07, ph, m.width * 1.02, 0.03, STEEL_MATERIAL, fx, fy, 0, { rot: [0, 0, -0.1] })\n ;[-0.3, 0.3].forEach(function (zf) {\n c.rod(new V3(m.front - 0.35, yb + 0.05, m.width * zf), new V3(fx - 0.03, yb + 0.05, m.width * zf), 0.035, MATERIALS.trim)\n c.rod(new V3(m.front - 0.25, yb + 0.05, m.width * zf), new V3(fx - 0.03, fy + ph * 0.25, m.width * zf), 0.025, MATERIALS.trim)\n })\n for (let bar = 0; bar < 3; bar++)\n c.rod(\n new V3(fx + 0.045, yb + ph * (0.2 + bar * 0.3), -m.width * 0.5),\n new V3(fx + 0.045, yb + ph * (0.2 + bar * 0.3), m.width * 0.5),\n 0.02,\n STEEL_MATERIAL,\n )\n const n = Math.max(4, Math.round(m.width / 0.32))\n const spk = makeMaterial('#8a8e8a', { metalness: 0.7, roughness: 0.35 })\n for (let i = 0; i < n; i++) {\n const sp = c.add(\n new THREE.ConeGeometry(0.035, 0.26, 10),\n spk,\n fx + 0.17,\n yb + ph * (i % 2 ? 0.35 : 0.65),\n -m.width * 0.44 + (i + 0.5) * ((m.width * 0.88) / n),\n )\n sp.rotation.z = -PI / 2\n }\n /* side plates: between the bumpers, cut out over the wheels, glued to the curve of the side */\n if (k !== 'tractor') {\n const x0 = m.rear + 0.15\n const x1 = m.front - 0.15\n const brk = [x0, x1]\n const wl: any = []\n c.wheels.forEach(function (w: any) {\n if (!w.parent) return\n const r = w.userData.r || 0.33\n wl.push([w.position.x - r - 0.07, w.position.x + r + 0.07, w.position.y + r + 0.05])\n })\n wl.forEach(function (w: any) {\n if (w[0] > x0 && w[0] < x1) brk.push(w[0])\n if (w[1] > x0 && w[1] < x1) brk.push(w[1])\n })\n brk.sort(function (a, b) {\n return a - b\n })\n const yTop = Math.min(m.belt - 0.06, m.clearance + 0.15 + Math.min(m.bodyHeight, 1.0) * 0.75)\n const pieces: any = []\n for (let b = 0; b < brk.length - 1; b++) {\n const a0 = brk[b]\n const a1 = brk[b + 1]\n const mid = (a0 + a1) / 2\n let bot = m.clearance + 0.1\n wl.forEach(function (w: any) {\n if (mid > w[0] && mid < w[1]) bot = Math.max(bot, w[2])\n })\n if (yTop - bot < 0.14 || a1 - a0 < 0.12) continue\n const np = Math.max(1, Math.round((a1 - a0) / 1.0))\n for (let q = 0; q < np; q++) pieces.push([a0 + ((a1 - a0) * q) / np, a0 + ((a1 - a0) * (q + 1)) / np, bot])\n }\n ;[1, -1].forEach(function (s2) {\n pieces.forEach(function (pc: any, j: any) {\n const pl = pc[1] - pc[0] - 0.03\n const px = (pc[0] + pc[1]) / 2\n const plH = yTop - pc[2]\n const py = pc[2] + plH / 2\n function zAt(x: any) {\n const h = I.probe(c, new V3(x, py, s2 * (m.width / 2 + 2)), new V3(0, 0, -s2), 2 + m.width * 0.4)\n return h && Math.abs(h.p.z) > m.width * 0.3 ? h.p.z : (s2 * m.width) / 2\n }\n const za = zAt(px - pl * 0.4)\n const zb = zAt(px + pl * 0.4)\n const pz = (zAt(px) + (za + zb) / 2) / 2 + s2 * 0.035\n const yaw = -Math.atan2(zb - za, pl * 0.8)\n const pm = c.roundBox(pl, plH, 0.035, 0.012, PLATE_MATERIALS[(j * 2 + (s2 > 0 ? 0 : 1)) % PLATE_MATERIALS.length], px, py, pz, {\n rot: [(hash(j, s2, 2) - 0.5) * 0.04, yaw, (hash(j, s2, 1) - 0.5) * 0.06],\n })\n ;[-1, 1].forEach(function (u) {\n ;[-1, 1].forEach(function (v) {\n c.sphere(\n 0.016,\n MATERIALS.steel,\n px + u * pl * 0.42 * Math.cos(yaw),\n py + v * plH * 0.38,\n pz + s2 * 0.02 - u * Math.sin(yaw) * pl * 0.42,\n )\n })\n })\n pm.userData.armorPlate = true\n })\n })\n }\n if (m.roof) {\n const r = m.roof\n const ry = (r.y || m.top) + 0.12\n const rl = r.x1 - r.x0\n const rw = r.w\n c.tube(\n [\n [r.x0, ry, -rw / 2],\n [r.x1, ry, -rw / 2],\n [r.x1, ry, rw / 2],\n [r.x0, ry, rw / 2],\n [r.x0, ry, -rw / 2],\n ],\n 0.022,\n MATERIALS.trim,\n { seg: 40 },\n )\n ;[r.x0 + 0.05, r.x1 - 0.05].forEach(function (x) {\n ;[-rw / 2, rw / 2].forEach(function (zz) {\n c.rod(new V3(x, ry - 0.12, zz), new V3(x, ry, zz), 0.02, MATERIALS.trim)\n })\n })\n for (let xs = r.x0 + 0.2; xs < r.x1; xs += 0.3) c.rod(new V3(xs, ry, -rw / 2), new V3(xs, ry, rw / 2), 0.012, MATERIALS.trim)\n const cans = Math.max(1, Math.min(4, Math.floor(rl / 0.45)))\n for (let q = 0; q < cans; q++) jerryCan(c, r.x0 + 0.25 + q * 0.4, ry + 0.24, -rw * 0.28, q % 2 ? '#3e5a34' : '#8e2a20')\n if (rl > 1.0 && rw > 0.9) {\n const sp2 = c.wheel(r.x1 - 0.45, 0.001, 0.32, 0.2, { noPart: true })\n sp2.rotation.x = PI / 2\n sp2.position.set(r.x1 - 0.45, ry + 0.11, rw * 0.2)\n c.wheels.pop()\n }\n }\n if (m.bed) {\n jerryCan(c, m.bed.x0 + 0.3, m.bed.y + 0.23, 0.6, '#8e2a20')\n jerryCan(c, m.bed.x0 + 0.3, m.bed.y + 0.23, 0.4, '#8e2a20')\n c.roundBox(0.8, 0.45, 0.6, 0.05, makeMaterial('#4a4b3c'), m.bed.x0 + 0.9, m.bed.y + 0.23, -0.4)\n c.roundBox(0.5, 0.3, 0.4, 0.04, MATERIALS.wood, m.bed.x0 + 0.8, m.bed.y + 0.15, 0.3)\n }\n }\n kit.applyArmor = applyArmor\n\n Object.assign(I, { STEEL_MATERIAL, PLATE_MATERIALS, jerryCan, applyArmor })\n}\n","/** Zone core: bands, effects text, box helpers and part lookups. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installZoneCore(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n\n /* ================= damage zones ================= */\n /* Every vehicle has named zones with health from 0 to 100. The core derives the zones from the meta (autoZones) and the builder refines\n them with c.zone(id, label, box, parts, options). The band (intact, scratched, dented, destroyed, torn_off) decides the look,\n which is deterministic: the same zone in the same band always gives the same result. When the band changes, the app rebuilds the\n vehicle (kit.build(key, state, zoneStates)) and applyZones reapplies every zone. Damage stays inside the zone box: the\n dent field is masked by the box and each owned part (wheel, light, glass, hood, mirror) only obeys its own zone. */\n const BAND_DEFINITIONS = [\n { id: 'intact', min: 76, health: 100, color: '#6f8f63' },\n { id: 'scratched', min: 51, health: 63, color: '#d8b440' },\n { id: 'dented', min: 26, health: 38, color: '#e07c2c' },\n { id: 'destroyed', min: 1, health: 13, color: '#c8392e' },\n { id: 'torn_off', min: 0, health: 0, color: '#6e7377' },\n ]\n /** The five damage bands, worst last. `health` is a typical health value inside the band. */\n const BANDS = BAND_DEFINITIONS.map(function (b) {\n return { id: b.id, name: kit.t('bands.' + b.id), min: b.min, health: b.health, color: b.color }\n })\n function bandOf(h: any) {\n h = Math.round(clamp(h == null ? 100 : h, 0, 100))\n for (let i = 0; i < BANDS.length; i++) if (h >= BANDS[i].min) return i\n return 4\n }\n kit.bands = BANDS\n kit.bandOf = bandOf\n const ZONE_WEIGHTS: Record<string, number> = { door: 1, panel: 1, roof: 1.2, lid: 0.8, hood: 1, bumper: 0.6, glass: 0.4, light: 0.3, wheel: 0.8, internal: 1.5, part: 1 }\n /* effect text per key, in the five bands; {who} becomes the occupant of that side. The text comes from the game plugin. */\n const ZONE_EFFECTS: any = {}\n /* key -> 5 texts (one per band); filled by configure({ zoneEffects }) */\n kit.zoneEffects = ZONE_EFFECTS\n function zoneFx(z: any, b: any) {\n const t = (z.fx || ZONE_EFFECTS[z.fxKey] || ZONE_EFFECTS[z.type] || ZONE_EFFECTS.panel || [])[b] || kit.config.texts.noEffect || ''\n return t.replace(/\\{who\\}/g, z.who || kit.config.texts.who)\n }\n kit.zoneEffect = function (z: any, h: any) {\n return zoneFx(z, bandOf(h == null ? z.health : h))\n }\n /* box: [x0, x1, y0, y1, z0, z1], { x0, x1, y0, y1, z0, z1 } or THREE.Box3 (c.vehicle coordinates) */\n function normalizeBox(b: any) {\n if (!b) return null\n if (Array.isArray(b))\n return {\n x0: Math.min(b[0], b[1]),\n x1: Math.max(b[0], b[1]),\n y0: Math.min(b[2], b[3]),\n y1: Math.max(b[2], b[3]),\n z0: Math.min(b[4], b[5]),\n z1: Math.max(b[4], b[5]),\n }\n if (b.isBox3) return { x0: b.min.x, x1: b.max.x, y0: b.min.y, y1: b.max.y, z0: b.min.z, z1: b.max.z }\n return { x0: b.x0, x1: b.x1, y0: b.y0, y1: b.y1, z0: b.z0, z1: b.z1 }\n }\n kit.normalizeBox = normalizeBox\n function boxLo(B: any, a: any) {\n return a === 0 ? B.x0 : a === 1 ? B.y0 : B.z0\n }\n function boxHi(B: any, a: any) {\n return a === 0 ? B.x1 : a === 1 ? B.y1 : B.z1\n }\n function boxContains(B: any, x: any, y: any, z: any, e: any) {\n e = e || 0\n return x >= B.x0 - e && x <= B.x1 + e && y >= B.y0 - e && y <= B.y1 + e && z >= B.z0 - e && z <= B.z1 + e\n }\n function boxCenter(B: any) {\n return new V3((B.x0 + B.x1) / 2, (B.y0 + B.y1) / 2, (B.z0 + B.z1) / 2)\n }\n function boxVolume(B: any) {\n return Math.max(1e-4, B.x1 - B.x0) * Math.max(1e-4, B.y1 - B.y0) * Math.max(1e-4, B.z1 - B.z0)\n }\n function boxDistance(B: any, p: any) {\n const dx = Math.max(B.x0 - p.x, 0, p.x - B.x1)\n const dy = Math.max(B.y0 - p.y, 0, p.y - B.y1)\n const dz = Math.max(B.z0 - p.z, 0, p.z - B.z1)\n return Math.hypot(dx, dy, dz)\n }\n function boxIntersects(B: any, b3: any) {\n return b3.max.x >= B.x0 && b3.min.x <= B.x1 && b3.max.y >= B.y0 && b3.min.y <= B.y1 && b3.max.z >= B.z0 && b3.min.z <= B.z1\n }\n function worldInverseOf(c: any) {\n c.root.updateMatrixWorld(true)\n return new THREE.Matrix4().copy(c.vehicle.matrixWorld).invert()\n }\n /* box of an object in c.vehicle coordinates */\n function localBox(c: any, o: any, inv: any) {\n inv = inv || worldInverseOf(c)\n const bb = new THREE.Box3()\n const tmp = new THREE.Box3()\n const M = new THREE.Matrix4()\n o.traverse(function (x: any) {\n if (!x.isMesh || !x.geometry || !x.geometry.attributes.position || x.userData.decal) return\n if (!x.geometry.boundingBox) x.geometry.computeBoundingBox()\n tmp.copy(x.geometry.boundingBox).applyMatrix4(M.multiplyMatrices(inv, x.matrixWorld))\n bb.union(tmp)\n })\n return bb\n }\n kit.localBox = localBox\n function slug(s: any) {\n return String(s)\n .toLowerCase()\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_|_$/g, '')\n }\n function wheelInfo(c: any) {\n const ws = c.wheels.filter(function (w: any) {\n return w.parent\n })\n if (!ws.length) return null\n let xf = -1e9\n let xr = 1e9\n let rf = 0.3\n let rr = 0.3\n ws.forEach(function (w: any) {\n const r = w.userData.r || 0.3\n if (w.position.x > xf) {\n xf = w.position.x\n rf = r\n }\n if (w.position.x < xr) {\n xr = w.position.x\n rr = r\n }\n })\n return { list: ws, xf: xf, xr: xr, rf: rf, rr: rr }\n }\n function partsOf(c: any, kind: any) {\n return c.parts.filter(function (p: any) {\n return p.kind === kind\n })\n }\n function lightCenter(c: any, L: any, inv: any) {\n if (L.group) return localBox(c, L.group, inv).getCenter(new V3())\n const bb = new THREE.Box3()\n L.lens.concat(L.inner).forEach(function (m: any) {\n bb.union(localBox(c, m, inv))\n })\n return bb.isEmpty() ? new V3() : bb.getCenter(new V3())\n }\n function lightBoxOf(c: any, L: any, inv: any) {\n if (L.group) return localBox(c, L.group, inv)\n const bb = new THREE.Box3()\n L.lens.concat(L.inner).forEach(function (m: any) {\n bb.union(localBox(c, m, inv))\n })\n return bb\n }\n function hideObj(c: any, o: any) {\n if (!o) return\n o.visible = false\n c.parts.forEach(function (p: any) {\n if (p.obj === o) p.done = true\n })\n }\n function shown(c: any, o: any) {\n for (let q = o; q && q !== c.vehicle; q = q.parent) if (q.visible === false) return false\n return !!o\n }\n\n Object.assign(I, {\n BANDS,\n bandOf,\n ZONE_WEIGHTS,\n ZONE_EFFECTS,\n zoneFx,\n normalizeBox,\n boxLo,\n boxHi,\n boxContains,\n boxCenter,\n boxVolume,\n boxDistance,\n boxIntersects,\n worldInverseOf,\n localBox,\n slug,\n wheelInfo,\n partsOf,\n lightCenter,\n lightBoxOf,\n hideObj,\n shown,\n })\n}\n","/** Zone decals: scratches, rust, burn marks and dents drawn as textures. */\nimport type { Kit } from './types'\n\nexport function installZoneDecals(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, DOUBLE_SIDE } = I\n\n /* ---- damage materials ---- */\n function dmat(hex: any, o: any) {\n return makeMaterial(hex, Object.assign({ polygonOffset: true, polygonOffsetFactor: -2, polygonOffsetUnits: -3, side: DOUBLE_SIDE }, o || {}))\n }\n const DAMAGE_MATERIALS = {\n /* without an environment map, high-metalness metal turns black and chipped paint looks like a bullet hole: light, barely metallic metal */\n fine: dmat('#b9bec0', { metalness: 0.3, roughness: 0.45 }),\n deep: dmat('#d6dadc', { metalness: 0.35, roughness: 0.35 }),\n primer: dmat('#8a8d8b', { roughness: 0.95 }),\n metal: dmat('#c3c7ca', { metalness: 0.35, roughness: 0.38 }),\n rust: dmat('#6b3a1e', { roughness: 1 }),\n rust2: dmat('#46220f', { roughness: 1 }),\n hole: dmat('#0a0a0b', { roughness: 1 }),\n edge: dmat('#c9cdd0', { metalness: 0.45, roughness: 0.3 }),\n seam: dmat('#060607', { roughness: 1 }),\n soot: makeMaterial('#14110f', {\n roughness: 1,\n transparent: true,\n opacity: 0.62,\n depthWrite: false,\n side: DOUBLE_SIDE,\n polygonOffset: true,\n polygonOffsetFactor: -2,\n polygonOffsetUnits: -3,\n }),\n scrape: makeMaterial('#1b1a19', {\n roughness: 1,\n transparent: true,\n opacity: 0.55,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -1,\n polygonOffsetUnits: -2,\n }),\n }\n kit.damageMaterials = DAMAGE_MATERIALS\n const _zq = new THREE.Quaternion()\n const _zq2 = new THREE.Quaternion()\n const _zz = new V3(0, 0, 1)\n function orientDecal(m: any, p: any, n: any, ang: any) {\n _zq.setFromUnitVectors(_zz, n)\n _zq2.setFromAxisAngle(n, ang || 0)\n m.quaternion.copy(_zq2.multiply(_zq))\n m.position.copy(p).addScaledVector(n, 0.004)\n }\n function decalMesh(c: any, geo: any, mat: any, p: any, n: any, ang: any, obj?: any) {\n const m = c.add(geo, mat, 0, 0, 0)\n m.castShadow = false\n m.receiveShadow = false\n m.userData.decal = true\n m.raycast = function () {}\n orientDecal(m, p, n, ang)\n if (obj && obj.parent && obj.parent !== c.vehicle) {\n c.root.updateMatrixWorld(true)\n obj.parent.attach(m)\n }\n return m\n }\n function blobGeometry(r: any, rnd: any, jag?: any, ell?: any) {\n const s = new THREE.Shape()\n const nz = I.valueNoise(Math.floor(rnd() * 997))\n const N = 18\n const e = ell || 1\n for (let k = 0; k <= N; k++) {\n const a = (k / N) * PI * 2\n const rr = r * (0.55 + 0.6 * nz(Math.cos(a) * 1.7 + 3, Math.sin(a) * 1.7 + 3)) * (jag && k % 2 ? 0.7 : 1)\n s[k ? 'lineTo' : 'moveTo'](Math.cos(a) * rr * e, Math.sin(a) * rr)\n }\n return new THREE.ShapeGeometry(s)\n }\n /* torn metal: a dark hole with a sharp edge of metal teeth that bend outward */\n function tearDecal(c: any, p: any, n: any, r: any, rnd: any, obj: any) {\n const N = 13\n const pts: any = []\n for (let k = 0; k < N; k++) {\n const a = (k / N) * PI * 2 + (rnd() - 0.5) * 0.3\n const rr = r * (k % 2 ? 0.42 + rnd() * 0.25 : 0.8 + rnd() * 0.35)\n pts.push([Math.cos(a) * rr * 1.25, Math.sin(a) * rr])\n }\n const s = new THREE.Shape()\n pts.forEach(function (q: any, i: any) {\n s[i ? 'lineTo' : 'moveTo'](q[0] * 0.86, q[1] * 0.86)\n })\n const hole = decalMesh(c, new THREE.ShapeGeometry(s), DAMAGE_MATERIALS.hole, p, n, rnd() * 6)\n const hp = hole.parent\n const pos: any = []\n pts.forEach(function (q: any, i: any) {\n const q2 = pts[(i + 1) % N]\n const ox = q[0] * 1.12\n const oy = q[1] * 1.12\n pos.push(q[0] * 0.86, q[1] * 0.86, 0, q2[0] * 0.86, q2[1] * 0.86, 0, ox, oy, 0.025 + rnd() * 0.03)\n })\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n g.computeVertexNormals()\n const e = c.add(g, DAMAGE_MATERIALS.edge, 0, 0, 0)\n e.castShadow = false\n e.userData.decal = true\n e.raycast = function () {}\n e.quaternion.copy(hole.quaternion)\n e.position.copy(hole.position)\n if (obj && obj.parent && obj.parent !== c.vehicle) {\n c.root.updateMatrixWorld(true)\n obj.parent.attach(hole)\n obj.parent.attach(e)\n }\n void hp\n return hole\n }\n /* ---- surface inside the box: rays from outside in ---- */\n const _zr = new THREE.Raycaster()\n function zoneCands(c: any, z: any, inv: any, glassToo: any) {\n const out: any = []\n c.vehicle.traverse(function (o: any) {\n if (!o.isMesh || o.userData.decal || o.userData.ghost || !o.geometry || o.isSprite) return\n for (let q = o; q && q !== c.vehicle; q = q.parent) if (!q.visible) return\n if (o.userData.glass && !glassToo) return\n const ow = I.ownerOf(c, o)\n if (ow && ow !== z) return\n if (!skinOK(c, z, o, ow)) return\n if (!o.geometry.boundingBox) o.geometry.computeBoundingBox()\n if (I.boxIntersects(z.box, I.localBox(c, o, inv))) out.push(o)\n })\n return out\n }\n /* decals only on bodywork: shell, paint, parts of the zone itself (or any mesh with anyMesh/part) */\n const _dsetC = new WeakMap()\n function skinOK(c: any, z: any, o: any, ow: any) {\n if (ow === z || z.anyMesh || z.type === 'part' || z.type === 'wheel') return true\n if (c.paints && c.paints.has(o.material)) return true\n let ds = _dsetC.get(c.deform)\n if (!ds) {\n ds = new Set(c.deform)\n _dsetC.set(c.deform, ds)\n }\n return ds.has(o) || c.deform.indexOf(o) >= 0\n }\n function axisOf(d: any) {\n const a = Math.abs(d.x) >= Math.abs(d.y) && Math.abs(d.x) >= Math.abs(d.z) ? 0 : Math.abs(d.y) >= Math.abs(d.z) ? 1 : 2\n return a\n }\n function zoneSurf(c: any, z: any, n: any, rnd: any, cands: any, o?: any) {\n o = o || {}\n const out = []\n const B = z.box\n const d = z.dir\n const a = axisOf(d)\n const ax = [0, 1, 2].filter(function (k) {\n return k !== a\n })\n const Mw = c.vehicle.matrixWorld\n const inv = I.worldInverseOf(c)\n const sg = d.getComponent(a) > 0 ? 1 : -1\n const outer = sg > 0 ? I.boxLo(B, a) - 0.6 : I.boxHi(B, a) + 0.6\n const u0 = o.u0 == null ? 0.1 : o.u0\n const u1 = o.u1 == null ? 0.9 : o.u1\n for (let t = 0; t < n * 4 && out.length < n; t++) {\n const org = new V3()\n org.setComponent(a, outer)\n ax.forEach(function (k) {\n org.setComponent(k, I.boxLo(B, k) + (I.boxHi(B, k) - I.boxLo(B, k)) * (u0 + (u1 - u0) * rnd()))\n })\n _zr.set(org.clone().applyMatrix4(Mw), d.clone().transformDirection(Mw))\n _zr.far = 0.6 + (I.boxHi(B, a) - I.boxLo(B, a)) + 0.05\n const hits = _zr.intersectObjects(cands, false)\n for (let i = 0; i < hits.length; i++) {\n const h = hits[i]\n if (!h.face) continue\n const lp = h.point.clone().applyMatrix4(inv)\n if (!I.boxContains(B, lp.x, lp.y, lp.z, 0.02)) break\n const nn = h.face.normal.clone().transformDirection(h.object.matrixWorld).transformDirection(inv)\n if (nn.dot(d) > 0) nn.negate()\n out.push({ p: lp, n: nn, obj: h.object })\n break\n }\n }\n return out\n }\n /* scratch that follows the surface: points along the stroke are projected onto the bodywork and the stroke stops where the bodywork ends\n (no straight stick sticking out of the body curve) */\n const _rt = new THREE.Raycaster()\n function scratchPath(c: any, s: any, len: any, ang: any, cands: any, B: any) {\n const n = s.n.clone().normalize()\n const t = Math.abs(n.y) < 0.9 ? new V3().crossVectors(new V3(0, 1, 0), n) : new V3().crossVectors(new V3(1, 0, 0), n)\n t.normalize().applyAxisAngle(n, ang || 0)\n if (!cands || !cands.length) return null\n const Mw = c.vehicle.matrixWorld\n const inv = I.worldInverseOf(c)\n const M = Math.max(3, Math.round(len / 0.04))\n const pts = []\n function at(k: any) {\n const q = s.p.clone().addScaledVector(t, (len * 0.5 * k) / M)\n _rt.set(q.clone().addScaledVector(n, 0.08).applyMatrix4(Mw), n.clone().negate().transformDirection(Mw))\n _rt.far = 0.2\n const h = _rt.intersectObjects(cands, false).find(function (x: any) {\n return x.face\n })\n if (!h) return null\n const lp = h.point.clone().applyMatrix4(inv)\n if (B && !I.boxContains(B, lp.x, lp.y, lp.z, 0.02)) return null\n const nn = h.face.normal.clone().transformDirection(h.object.matrixWorld).transformDirection(inv)\n if (nn.dot(n) < 0) nn.negate()\n if (nn.dot(n) < 0.55) return null\n return { p: lp, n: nn }\n }\n const c0 = at(0)\n if (!c0) return null\n pts.push(c0)\n for (let k = 1; k <= M; k++) {\n const a = at(k)\n if (!a) break\n pts.push(a)\n }\n for (let k = -1; k >= -M; k--) {\n const b = at(k)\n if (!b) break\n pts.unshift(b)\n }\n return pts.length >= 3 ? pts : null\n }\n function ribbonGeo(pts: any, wd: any, lift: any) {\n const pos: any = []\n const idx: any = []\n const N = pts.length\n const tg = new V3()\n const sd = new V3()\n pts.forEach(function (q: any, i: any) {\n const a = pts[Math.max(0, i - 1)].p\n const b = pts[Math.min(N - 1, i + 1)].p\n tg.subVectors(b, a).normalize()\n const e = Math.min(i, N - 1 - i) / Math.max(1, (N - 1) / 2)\n const w = wd * 0.5 * (0.25 + 0.75 * Math.min(1, e * 2.2))\n sd.crossVectors(q.n, tg).normalize().multiplyScalar(w)\n const base = q.p.clone().addScaledVector(q.n, lift)\n pos.push(base.x + sd.x, base.y + sd.y, base.z + sd.z, base.x - sd.x, base.y - sd.y, base.z - sd.z)\n if (i) {\n const j = (i - 1) * 2\n idx.push(j, j + 1, j + 2, j + 1, j + 3, j + 2)\n }\n })\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n g.setIndex(idx)\n g.computeVertexNormals()\n return g\n }\n function scratchDecal(c: any, s: any, len: any, wd: any, mat: any, ang: any, cands: any, B: any, pts?: any) {\n pts = pts || scratchPath(c, s, len, ang, cands, B)\n if (!pts) return null\n const m = c.add(ribbonGeo(pts, wd, mat === DAMAGE_MATERIALS.deep ? 0.0038 : 0.003), mat, 0, 0, 0)\n m.castShadow = false\n m.receiveShadow = false\n m.userData.decal = true\n m.raycast = function () {}\n if (s.obj && s.obj.parent && s.obj.parent !== c.vehicle) {\n c.root.updateMatrixWorld(true)\n s.obj.parent.attach(m)\n }\n return m\n }\n /* scratches, chipped paint (grey primer and metal), rust and torn metal */\n function zoneDecals(c: any, z: any, spec: any, cands: any) {\n const R = c.rand\n const need =\n (spec.fine || 0) +\n (spec.deep || 0) +\n (spec.chip || 0) +\n (spec.rust || 0) +\n (spec.tear || 0) +\n (spec.ding || 0) +\n (spec.soot || 0) +\n (spec.crater || 0)\n if (!need) return []\n const S = zoneSurf(c, z, need + 2, R, cands)\n let k = 0\n const ang0 = R() * PI\n function nx() {\n return S.length ? S[k++ % S.length] : null\n }\n let s\n let i\n for (i = 0; i < (spec.fine || 0); i++)\n if ((s = nx())) scratchDecal(c, s, 0.12 + R() * 0.18, 0.0035, DAMAGE_MATERIALS.fine, ang0 + (R() - 0.5) * 0.4, cands, z.box)\n for (i = 0; i < (spec.deep || 0); i++)\n if ((s = nx())) {\n const L2 = 0.18 + R() * 0.26\n const an = ang0 + (R() - 0.5) * 0.5\n const pth = scratchPath(c, s, L2, an, cands, z.box)\n if (pth) {\n scratchDecal(c, s, L2, 0.014, DAMAGE_MATERIALS.primer, an, cands, z.box, pth)\n scratchDecal(c, s, L2, 0.005, DAMAGE_MATERIALS.deep, an, cands, z.box, pth.slice(1, -1).length >= 3 ? pth.slice(1, -1) : pth)\n }\n }\n for (i = 0; i < (spec.chip || 0); i++)\n if ((s = nx())) {\n const r = 0.025 + R() * 0.035\n decalMesh(c, blobGeometry(r, R), DAMAGE_MATERIALS.primer, s.p, s.n, R() * 6, s.obj)\n const mm = decalMesh(c, blobGeometry(r * 0.55, R), DAMAGE_MATERIALS.metal, s.p.clone().addScaledVector(s.n, 0.0008), s.n, R() * 6, s.obj)\n void mm\n }\n for (i = 0; i < (spec.rust || 0); i++)\n if ((s = nx())) {\n const rr2 = 0.05 + R() * 0.08\n decalMesh(c, blobGeometry(rr2, R, false, 1.4), DAMAGE_MATERIALS.rust, s.p, s.n, R() * 6, s.obj)\n decalMesh(c, blobGeometry(rr2 * 0.5, R), DAMAGE_MATERIALS.rust2, s.p.clone().addScaledVector(s.n, 0.0008), s.n, R() * 6, s.obj)\n }\n /* soot (impact burn) and impact crater (metal ring with a dark core): armour and hull */\n for (i = 0; i < (spec.soot || 0); i++)\n if ((s = nx())) decalMesh(c, blobGeometry(0.14 + R() * 0.12, R, false, 1.5), DAMAGE_MATERIALS.soot, s.p, s.n, R() * 6, s.obj)\n for (i = 0; i < (spec.crater || 0); i++)\n if ((s = nx())) {\n const rc = 0.035 + R() * 0.035\n decalMesh(c, blobGeometry(rc * 1.5, R, true), DAMAGE_MATERIALS.metal, s.p, s.n, R() * 6, s.obj)\n decalMesh(c, blobGeometry(rc * 0.8, R), DAMAGE_MATERIALS.hole, s.p.clone().addScaledVector(s.n, 0.0008), s.n, R() * 6, s.obj)\n }\n const tears = []\n for (i = 0; i < (spec.tear || 0); i++) if ((s = nx())) tears.push(tearDecal(c, s.p, s.n, 0.07 + R() * 0.06, R, s.obj))\n return S\n }\n\n Object.assign(I, {\n dmat,\n DAMAGE_MATERIALS,\n _zq,\n _zq2,\n _zz,\n orientDecal,\n decalMesh,\n blobGeometry,\n tearDecal,\n _zr,\n zoneCands,\n _dsetC,\n skinOK,\n axisOf,\n zoneSurf,\n _rt,\n scratchPath,\n ribbonGeo,\n scratchDecal,\n zoneDecals,\n })\n}\n","/** Zone dent field: deterministic vertex displacement inside a zone box. */\nimport type { Kit } from './types'\nimport { smooth } from './util'\n\nexport function installZoneDent(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n const { cutGeometry } = I\n\n /* ---- dent masked by the box (follows the panel) ---- */\n function sm(t: any) {\n return smooth(t)\n }\n function subdivIn(geo: any, rel: any, B: any, maxLen: any) {\n const a = geo.attributes.position.array\n const out = []\n const v = new V3()\n const e = 0.15\n function d(p: any, q: any) {\n return Math.hypot(p[0] - q[0], p[1] - q[1], p[2] - q[2])\n }\n function mid(p: any, q: any) {\n return [(p[0] + q[0]) / 2, (p[1] + q[1]) / 2, (p[2] + q[2]) / 2]\n }\n function tri(A: any, Bv: any, C: any, depth: any) {\n const ab = d(A, Bv)\n const bc = d(Bv, C)\n const ca = d(C, A)\n const mx = Math.max(ab, bc, ca)\n if (mx <= maxLen || depth > 9) {\n out.push(A[0], A[1], A[2], Bv[0], Bv[1], Bv[2], C[0], C[1], C[2])\n return\n }\n if (mx === ab) {\n const D = mid(A, Bv)\n tri(A, D, C, depth + 1)\n tri(D, Bv, C, depth + 1)\n } else if (mx === bc) {\n const E2 = mid(Bv, C)\n tri(A, Bv, E2, depth + 1)\n tri(A, E2, C, depth + 1)\n } else {\n const F2 = mid(C, A)\n tri(A, Bv, F2, depth + 1)\n tri(F2, Bv, C, depth + 1)\n }\n }\n for (let i = 0; i < a.length; i += 9) {\n const A = [a[i], a[i + 1], a[i + 2]]\n const Bv = [a[i + 3], a[i + 4], a[i + 5]]\n const C = [a[i + 6], a[i + 7], a[i + 8]]\n let x0 = 1e9\n let x1 = -1e9\n let y0 = 1e9\n let y1 = -1e9\n let z0 = 1e9\n let z1 = -1e9\n ;[A, Bv, C].forEach(function (p) {\n v.set(p[0], p[1], p[2]).applyMatrix4(rel)\n x0 = Math.min(x0, v.x)\n x1 = Math.max(x1, v.x)\n y0 = Math.min(y0, v.y)\n y1 = Math.max(y1, v.y)\n z0 = Math.min(z0, v.z)\n z1 = Math.max(z1, v.z)\n })\n if (x1 < B.x0 - e || x0 > B.x1 + e || y1 < B.y0 - e || y0 > B.y1 + e || z1 < B.z0 - e || z0 > B.z1 + e)\n out.push(A[0], A[1], A[2], Bv[0], Bv[1], Bv[2], C[0], C[1], C[2])\n else tri(A, Bv, C, 0)\n }\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(out, 3))\n g.userData.crease = true\n g.userData.p0 = null\n return g\n }\n /* meshes this zone may dent: shell (c.deform), paint, its own parts and, with anyMesh, any mesh */\n function dentTargets(c: any, z: any, inv: any) {\n const dset = new Set(c.deform)\n const out: any = []\n c.vehicle.traverse(function (o: any) {\n if (!o.isMesh || o.userData.decal || o.userData.ghost || !o.geometry || !o.geometry.attributes.position) return\n for (let q = o; q && q !== c.vehicle; q = q.parent) if (!q.visible) return\n const ow = I.ownerOf(c, o)\n const isG = !!o.userData.glass\n if (isG && !(z.alsoGlass || ow === z)) return\n if (ow && ow !== z && !(isG && z.alsoGlass)) return\n const ok = dset.has(o) || (c.paints && c.paints.has(o.material)) || ow === z || z.anyMesh\n if (!ok) return\n if (!o.geometry.boundingBox) o.geometry.computeBoundingBox()\n if (!I.boxIntersects(z.box, I.localBox(c, o, inv))) return\n out.push({ o: o, deform: dset.has(o) })\n })\n return out\n }\n /* dents: [{ u, v (centre, absolute tangent coordinates), ru, rv (radii in m), depth }], crease: { v, w, depth } */\n function zoneDent(c: any, z: any, dents: any, dirty: any, opt: any) {\n opt = opt || {}\n const B = z.box\n const d = z.dir\n const a = I.axisOf(d)\n const ax = [0, 1, 2].filter(function (k) {\n return k !== a\n })\n const sg = d.getComponent(a) > 0 ? 1 : -1\n const outer = sg > 0 ? I.boxLo(B, a) : I.boxHi(B, a)\n const depthA = I.boxHi(B, a) - I.boxLo(B, a)\n const m = c.meta\n const hu = (I.boxHi(B, ax[0]) - I.boxLo(B, ax[0])) / 2\n const hv = (I.boxHi(B, ax[1]) - I.boxLo(B, ax[1])) / 2\n const cu = I.boxLo(B, ax[0]) + hu\n const cv = I.boxLo(B, ax[1]) + hv\n const C = new V3(((m.front || 1) + (m.rear || -1)) / 2, (m.clearance || 0.3) + (m.bodyHeight || 0.6) * 0.5, 0)\n const edge = opt.edge || 0.28\n function field(p: any) {\n if (!I.boxContains(B, p.x, p.y, p.z, 0)) return 0\n const u = p.getComponent(ax[0])\n const v = p.getComponent(ax[1])\n const su = (u - cu) / hu\n const sv = (v - cv) / hv\n const mask = sm((1 - Math.abs(su)) / edge) * sm((1 - Math.abs(sv)) / edge)\n const tin = Math.abs(p.getComponent(a) - outer) / Math.max(0.05, depthA)\n const md = 1 - sm((tin - 0.5) / 0.5)\n let amt = 0\n dents.forEach(function (D: any) {\n const r = Math.hypot((u - D.u) / D.ru, (v - D.v) / D.rv)\n if (r < 1) amt = Math.max(amt, D.depth * sm(1 - r) * (1 + 0.12 * Math.sin(u * 9.1 + v * 5.3 + D.ph)))\n })\n if (opt.crease) {\n const cr = opt.crease\n const t = 1 - Math.abs(v - cr.v) / cr.w\n if (t > 0) amt = Math.max(amt, cr.depth * sm(t) * sm((1 - Math.abs(su)) / 0.45))\n }\n amt *= mask * md\n const lim = -((p.x - C.x) * d.x + (p.y - C.y) * d.y + (p.z - C.z) * d.z) - 0.05\n return Math.max(0, Math.min(amt, lim))\n }\n const inv = I.worldInverseOf(c)\n const T = opt.targets || dentTargets(c, z, inv)\n const rel = new THREE.Matrix4()\n const irel = new THREE.Matrix4()\n const v = new V3()\n T.forEach(function (t: any) {\n const msh = t.o\n let g = msh.geometry\n rel.multiplyMatrices(inv, msh.matrixWorld)\n if (!t.deform && !msh.userData.zCloned) {\n g = msh.geometry = g.clone()\n msh.userData.zCloned = true\n }\n const nonIdx = !g.index\n const onlyPos = Object.keys(g.attributes).every(function (k) {\n return k === 'position' || k === 'normal'\n })\n if (t.deform && nonIdx && onlyPos && !msh.userData.glass && !opt.noSub) {\n const ng = subdivIn(g, rel, B, opt.sub || 0.075)\n g.dispose()\n g = msh.geometry = ng\n ng.computeBoundingSphere()\n ng.computeBoundingBox()\n dirty.add(msh)\n }\n irel.copy(rel).invert()\n const pos = g.attributes.position\n let changed = false\n for (let i = 0; i < pos.count; i++) {\n v.fromBufferAttribute(pos, i).applyMatrix4(rel)\n const f = field(v)\n if (f <= 1e-5) continue\n v.addScaledVector(d, f)\n if (opt.extra) opt.extra(v, f)\n v.applyMatrix4(irel)\n pos.setXYZ(i, v.x, v.y, v.z)\n changed = true\n }\n if (opt.extraAll) {\n for (let j = 0; j < pos.count; j++) {\n v.fromBufferAttribute(pos, j).applyMatrix4(rel)\n if (opt.extraAll(v)) {\n v.applyMatrix4(irel)\n pos.setXYZ(j, v.x, v.y, v.z)\n changed = true\n }\n }\n }\n if (changed) {\n pos.needsUpdate = true\n g.computeBoundingSphere()\n g.computeBoundingBox()\n dirty.add(msh)\n }\n })\n /* rigid parts (trim, handles, liner, plate) follow the field at their centre */\n const dset = new Set(c.deform)\n const moved: any = []\n c.vehicle.children.forEach(function (o: any) {\n if (dset.has(o) || o.userData.noFollow || o.userData.decal || o.isSprite || o.userData.glass) return\n if (!(o.isMesh || (o.isGroup && o.userData.rigid))) return\n const ow = I.ownerOf(c, o)\n if (ow && ow !== z) return\n if (\n T.some(function (t: any) {\n return t.o === o\n })\n )\n return\n const bb = I.localBox(c, o, inv)\n if (bb.isEmpty()) return\n const sz = bb.getSize(new V3())\n if (Math.max(sz.x, sz.y, sz.z) > 1.4) return\n const cen = bb.getCenter(new V3())\n const f = field(cen)\n if (f <= 1e-4) return\n o.position.addScaledVector(d, f)\n moved.push(o)\n })\n return { field: field, moved: moved, ax: ax, a: a, cu: cu, cv: cv, hu: hu, hv: hv, outer: outer }\n }\n /* cuts the skin inside a rectangle of the zone; returns the cut piece (or null). rect: [u0, u1, v0, v1] absolute */\n function cutPanel(c: any, z: any, rect: any, keep: any, dirty: any, o: any) {\n o = o || {}\n const B = z.box\n const d = z.dir\n const a = I.axisOf(d)\n const ax = [0, 1, 2].filter(function (k) {\n return k !== a\n })\n const inv = I.worldInverseOf(c)\n const outN = d.clone().negate()\n const T = dentTargets(c, z, inv).filter(function (t: any) {\n return !t.o.userData.glass && (t.deform || z.cutAll || z.anyMesh || (c.paints && c.paints.has(t.o.material)))\n })\n const pieces: any = []\n const rel = new THREE.Matrix4()\n const v = new V3()\n const nv = new V3()\n const nm = new THREE.Matrix3()\n T.forEach(function (t: any) {\n const msh = t.o\n const g = msh.geometry\n if (!g.attributes.position.count) return\n rel.multiplyMatrices(inv, msh.matrixWorld)\n nm.getNormalMatrix(rel)\n const bb = I.localBox(c, msh, inv)\n const whole =\n bb.min.x >= B.x0 - 0.02 &&\n bb.max.x <= B.x1 + 0.02 &&\n bb.min.y >= B.y0 - 0.02 &&\n bb.max.y <= B.y1 + 0.02 &&\n bb.min.z >= B.z0 - 0.02 &&\n bb.max.z <= B.z1 + 0.02\n if (whole && !t.deform) {\n pieces.push({ mesh: msh, whole: true })\n return\n }\n const test = {\n tag: 'part',\n sel:\n o.anyN || z.cutAll\n ? null\n : function (n: any) {\n nv.copy(n).applyMatrix3(nm).normalize()\n return nv.dot(outN) > 0.3\n },\n sdf: function (x: any, y: any, zz: any) {\n v.set(x, y, zz).applyMatrix4(rel)\n let q = -1e9\n q = Math.max(\n q,\n rect[0] - v.getComponent(ax[0]),\n v.getComponent(ax[0]) - rect[1],\n rect[2] - v.getComponent(ax[1]),\n v.getComponent(ax[1]) - rect[3],\n )\n q = Math.max(q, I.boxLo(B, a) - v.getComponent(a), v.getComponent(a) - I.boxHi(B, a))\n return q\n },\n }\n const r = cutGeometry(g, [test])\n const cg = r.cut.part\n if (!cg || !cg.attributes.position.count) return\n g.dispose()\n msh.geometry = r.geo\n r.geo.computeBoundingSphere()\n r.geo.computeBoundingBox()\n dirty.add(msh)\n if (!keep) {\n cg.dispose()\n pieces.push({ cut: true })\n return\n }\n const pm = new THREE.Mesh(cg, msh.material)\n pm.castShadow = true\n pm.receiveShadow = true\n rel.decompose(pm.position, pm.quaternion, pm.scale)\n c.vehicle.add(pm)\n pm.updateMatrixWorld(true)\n pieces.push({ mesh: pm, cut: true })\n })\n return pieces\n }\n /* groups meshes into a pivot (in c.vehicle coordinates) keeping the world position */\n function pivotOf(c: any, objs: any, at: any) {\n const piv = new THREE.Group()\n piv.position.copy(at)\n piv.userData.rigid = true\n piv.userData.noFollow = true\n c.vehicle.add(piv)\n c.root.updateMatrixWorld(true)\n objs.forEach(function (o: any) {\n if (o && o.parent) {\n piv.attach(o)\n o.traverse(function (x: any) {\n x.userData.noFollow = true\n })\n const di = c.deform.indexOf(o)\n if (di >= 0) c.deform.splice(di, 1)\n }\n })\n return piv\n }\n\n Object.assign(I, { sm, subdivIn, dentTargets, zoneDent, cutPanel, pivotOf })\n}\n","/** Per-zone damage for body panels: doors, lids, hoods, roofs, hulls and wings. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installDamagePanels(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n const { MATERIALS } = I\n\n /* ---- body panel (door, fender, side panel, roof, lid, armour, hull, wing) ---- */\n function panelBand(c: any, z: any, b: any, dirty: any) {\n const R = c.rand\n const inv = I.worldInverseOf(c)\n const B = z.box\n const d = z.dir\n const a = I.axisOf(d)\n const ax = [0, 1, 2].filter(function (k) {\n return k !== a\n })\n const u0 = I.boxLo(B, ax[0])\n const u1 = I.boxHi(B, ax[0])\n const v0 = I.boxLo(B, ax[1])\n const v1 = I.boxHi(B, ax[1])\n const lu = u1 - u0\n const lv = v1 - v0\n const depA = I.boxHi(B, a) - I.boxLo(B, a)\n const stiff = clamp(c.meta.stiff || 0, 0, 1) * (z.fxKey === 'armor' ? 1 : 0.6)\n const dk = 1 - 0.7 * stiff\n if (b === 0) {\n if (z.health < 92) I.zoneDecals(c, z, { fine: 2 }, I.zoneCands(c, z, inv))\n return\n }\n if (b === 4) {\n const mg = Math.min(0.05, lu * 0.08, lv * 0.08)\n let rect = [u0 + mg, u1 - mg, v0 + mg, v1 - mg]\n if (z.type === 'door' || z.type === 'lid') rect = [u0 + 0.03, u1 - 0.03, v0 + Math.min(0.08, lv * 0.1), v1 - 0.02]\n const pcs = I.cutPanel(c, z, rect, false, dirty)\n pcs.forEach(function (q: any) {\n if (q.whole) I.hideObj(c, q.mesh)\n })\n followersIn(c, z, inv).forEach(function (o: any) {\n I.hideObj(c, o)\n })\n /* owned parts (propeller, pylon, siren) disappear whole: cutting only the skin left pieces floating */\n z.owned.forEach(function (o: any) {\n if (o.parent && c.wheels.indexOf(o) < 0 && !o.userData.glass) I.hideObj(c, o)\n })\n c.spin = c.spin.filter(function (sp: any) {\n return I.shown(c, sp.o)\n })\n if (z.type === 'roof') roofOff(c, z, inv)\n if (z.fxKey === 'tail_cone' && c.meta.kind === 'heli') tailOff(c, z, inv)\n ;(z.mirrors || []).forEach(function (o: any) {\n I.hideObj(c, o)\n })\n if (z.type === 'door')\n windowsOver(c, z, inv).forEach(function (g: any) {\n I.glassBand(c, z, g, 4)\n })\n I.zoneDecals(c, z, { rust: 3, deep: 2 }, I.zoneCands(c, z, I.worldInverseOf(c)))\n return\n }\n const dents = []\n const opt: any = {}\n if (b === 1) {\n for (let i = 0; i < 3; i++)\n dents.push({\n u: u0 + lu * (0.2 + R() * 0.6),\n v: v0 + lv * (0.25 + R() * 0.5),\n ru: 0.06 + R() * 0.04,\n rv: 0.06 + R() * 0.04,\n depth: (0.012 + R() * 0.016) * dk,\n ph: R() * 6,\n })\n I.zoneDent(c, z, dents, dirty, { edge: 0.15 })\n I.zoneDecals(c, z, { deep: 4, chip: 3, fine: 2 }, I.zoneCands(c, z, inv))\n return\n }\n /* the dent follows the panel: an ellipse stretched along the long axis, with a crease along it */\n const longU = lu >= lv\n const D0 = b === 2 ? 0.06 + R() * 0.06 : 0.15 + R() * 0.15\n const maxD = Math.max(0.03, Math.min(D0, depA * 0.55, 0.3)) * dk\n const uc = u0 + lu * (0.4 + R() * 0.2)\n const vc = v0 + lv * (0.4 + R() * 0.2)\n dents.push({ u: uc, v: vc, ru: lu * (longU ? 0.48 : 0.38), rv: lv * (longU ? 0.38 : 0.48), depth: maxD, ph: R() * 6 })\n if (b === 3)\n dents.push({\n u: u0 + lu * (0.2 + R() * 0.6),\n v: v0 + lv * (0.25 + R() * 0.5),\n ru: lu * 0.3,\n rv: lv * 0.3,\n depth: maxD * 0.8,\n ph: R() * 6,\n })\n opt.crease = longU ? null : null\n if (longU) opt.crease = { v: vc + (R() - 0.5) * lv * 0.15, w: Math.min(0.09, lv * 0.2), depth: maxD * 0.55 }\n if (b === 3)\n opt.extra = function (p: any, f: any) {\n p.addScaledVector(d, 0.012 * Math.sin(p.getComponent(ax[0]) * 17) * Math.min(1, f / 0.05))\n }\n /* dented door: the rear edge of the door sticks out (misaligned gap) */\n if (z.type === 'door' && b >= 2) {\n const hingeHi = z.hinge !== 'rear'\n const xe = hingeHi ? B.x0 : B.x1\n const sideOut = d.clone().negate()\n opt.extraAll = function (p: any) {\n if (!I.boxContains(B, p.x, p.y, p.z, 0)) return false\n const t = 1 - Math.abs(p.x - xe) / 0.12\n if (t <= 0) return false\n const tin = Math.abs(p.getComponent(a) - (d.getComponent(a) > 0 ? B.z0 : B.z1))\n if (tin > 0.2) return false\n p.addScaledVector(sideOut, 0.014 * I.sm(t) * I.sm((p.y - B.y0) / 0.1) * I.sm((B.y1 - p.y) / 0.1))\n return true\n }\n }\n I.zoneDent(c, z, dents, dirty, opt)\n if (z.fxKey === 'tail_cone' && c.meta.kind === 'heli') {\n const kxx = B.x0 + (B.x1 - B.x0) * (b === 2 ? 0.55 : 0.62)\n const kyy = (B.y0 + B.y1) / 2\n I.bendAft(c, z, kxx, kyy, b === 2 ? 0.035 : 0.16, dirty)\n }\n if (z.mirrors && z.mirrors.length) mirrorHang(c, z, b === 2 ? 0.95 : 1.3)\n if (b === 3) {\n if (z.type === 'door') doorHang(c, z, dirty, inv)\n else if (z.type === 'lid') lidHang(c, z, dirty)\n else if (z.type !== 'roof' && !z.noFlap) flapHang(c, z, dirty)\n if (z.type === 'door')\n windowsOver(c, z, I.worldInverseOf(c)).forEach(function (g: any) {\n I.glassBand(c, z, g, 3)\n })\n }\n const cands = I.zoneCands(c, z, I.worldInverseOf(c))\n /* armour barely dents and fibre hulls crack: the band shows through the marks (craters, soot, chips) */\n if (z.fxKey === 'armor') I.zoneDecals(c, z, b === 2 ? { crater: 5, soot: 2 } : { crater: 8, soot: 4, tear: 1 }, cands)\n else if (z.fxKey === 'hull') I.zoneDecals(c, z, b === 2 ? { deep: 5, chip: 6 } : { deep: 4, chip: 4, soot: 2, tear: 2 }, cands)\n if (b === 2) I.zoneDecals(c, z, { deep: 4, chip: 3 }, cands)\n else\n I.zoneDecals(\n c,\n z,\n {\n deep: 4,\n chip: z.plastic ? 0 : 2,\n rust: z.plastic ? 0 : 3,\n tear: z.plastic || z.noFlap || z.type === 'door' || z.type === 'lid' ? 0 : 1,\n },\n cands,\n )\n if (z.type === 'door' && b === 2) doorGap(c, z, b, cands)\n }\n /* torn-off roof: the headliner and whatever is attached on top (beacon, light bar, roof rack, roof lights) come away with it */\n function roofOff(c: any, z: any, inv: any) {\n const B = z.box\n const top = c.meta.top || B.y1\n c.vehicle.traverse(function (o: any) {\n if (!o.isMesh || !o.visible || o.userData.decal || o.userData.glass) return\n if (o.material === MATERIALS.headliner) {\n const hb = I.localBox(c, o, inv)\n const hc = hb.getCenter(new V3())\n if (I.boxContains(B, hc.x, hc.y, hc.z, 0.12)) I.hideObj(c, o)\n }\n })\n c.vehicle.children.forEach(function (o: any) {\n if (!o.visible || o.userData.decal || o.isSprite || o.userData.glass || c.deform.indexOf(o) >= 0 || c.wheels.indexOf(o) >= 0) return\n const ow = I.ownerOf(c, o)\n if (ow && ow !== z) return\n const bb = I.localBox(c, o, inv)\n if (bb.isEmpty()) return\n const cen = bb.getCenter(new V3())\n const sz = bb.getSize(new V3())\n if (Math.max(sz.x, sz.z) > 2.2) return\n if (\n (bb.min.y > top - 0.1 || bb.min.y > B.y0 + (B.y1 - B.y0) * 0.5 - 0.1) &&\n cen.x > B.x0 - 0.1 &&\n cen.x < B.x1 + 0.1 &&\n Math.abs(cen.z) < Math.max(Math.abs(B.z0), Math.abs(B.z1)) + 0.1\n )\n I.hideObj(c, o)\n })\n }\n /* torn-off tail cone: everything behind the start of the cone (pylon, fin, tail rotor, tail skid) disappears, from any zone */\n function tailOff(c: any, z: any, inv: any) {\n const kx = z.box.x1 - (z.box.x1 - z.box.x0) * 0.15\n c.vehicle.children.forEach(function (o: any) {\n if (!o.visible || o.userData.decal || o.isSprite) return\n const bb = I.localBox(c, o, inv)\n if (bb.isEmpty()) return\n if (bb.max.x < kx + 0.05) I.hideObj(c, o)\n })\n c.spin = c.spin.filter(function (sp: any) {\n return I.shown(c, sp.o)\n })\n }\n function followersIn(c: any, z: any, inv: any) {\n const dset = new Set(c.deform)\n const out: any = []\n c.vehicle.children.forEach(function (o: any) {\n if (dset.has(o) || o.userData.decal || o.isSprite || o.userData.glass || !o.visible) return\n if (!(o.isMesh || (o.isGroup && o.userData.rigid))) return\n const ow = I.ownerOf(c, o)\n if (ow && ow !== z) return\n if (c.wheels.indexOf(o) >= 0) return\n const bb = I.localBox(c, o, inv)\n if (bb.isEmpty()) return\n const cen = bb.getCenter(new V3())\n const sz = bb.getSize(new V3())\n if (!I.boxContains(z.box, cen.x, cen.y, cen.z, 0) || Math.max(sz.x, sz.y, sz.z) > 1.4) return\n if (sz.getComponent(I.axisOf(z.dir)) > 0.09) return /* only thin parts along the direction of the bodywork (liner, trim, handle, plate) */\n out.push(o)\n })\n return out\n }\n function windowsOver(c: any, z: any, inv: any) {\n return c.glass.filter(function (g: any) {\n if (!g.parent || !g.visible) return false\n const cen = I.localBox(c, g, inv).getCenter(new V3())\n return (\n Math.sign(cen.z) === z.side &&\n Math.abs(cen.z) > (c.meta.width || 1.7) * 0.25 &&\n cen.x > z.box.x0 + 0.05 &&\n cen.x < z.box.x1 - 0.05 &&\n cen.y > z.box.y1 - 0.15\n )\n })\n }\n function doorGap(c: any, z: any, b: any, cands: any) {\n const B = z.box\n const xe = z.hinge === 'rear' ? B.x1 : B.x0\n const inv = I.worldInverseOf(c)\n const d = z.dir\n const Mw = c.vehicle.matrixWorld\n const pts = []\n for (let k = 0; k < 6; k++) {\n const y = B.y0 + 0.08 + ((B.y1 - B.y0 - 0.16) * k) / 5\n const org = new V3(xe + 0.006, y, z.side < 0 ? B.z0 - 0.5 : B.z1 + 0.5)\n I._zr.set(org.clone().applyMatrix4(Mw), d.clone().transformDirection(Mw))\n I._zr.far = 0.5 + (B.z1 - B.z0)\n const h = I._zr.intersectObjects(cands, false)[0]\n if (h) pts.push(h.point.clone().applyMatrix4(inv).addScaledVector(d, -0.004))\n }\n if (pts.length < 3) return\n const seam = c.tube(pts, b === 2 ? 0.0045 : 0.006, I.DAMAGE_MATERIALS.seam, { seg: 24, rs: 4 })\n seam.castShadow = false\n seam.userData.decal = true\n }\n function mirrorHang(c: any, z: any, ang: any) {\n const objs = z.mirrors.filter(function (o: any) {\n return o.parent\n })\n if (!objs.length) return\n const inv = I.worldInverseOf(c)\n const bb = new THREE.Box3()\n objs.forEach(function (o: any) {\n bb.union(I.localBox(c, o, inv))\n })\n const at = new V3((bb.min.x + bb.max.x) / 2, (bb.min.y + bb.max.y) / 2, z.side < 0 ? bb.max.z : bb.min.z)\n const piv = I.pivotOf(c, objs, at)\n piv.rotation.x = z.side * -ang\n piv.rotation.y = z.side * 0.25\n }\n /* door hanging on a hinge: the door skin becomes a part, swings out on the front hinge and falls behind */\n function doorHang(c: any, z: any, dirty: any, inv: any) {\n const B = z.box\n const rect = [B.x0 + 0.03, B.x1 - 0.03, B.y0 + Math.min(0.08, (B.y1 - B.y0) * 0.1), B.y1 - 0.02]\n const pcs = I.cutPanel(c, z, rect, true, dirty).filter(function (q: any) {\n return q.mesh\n })\n if (!pcs.length) return\n const objs = pcs\n .map(function (q: any) {\n return q.mesh\n })\n .concat(followersIn(c, z, inv))\n const hx = z.hinge === 'rear' ? B.x0 + 0.03 : B.x1 - 0.03\n const bb = new THREE.Box3()\n objs.forEach(function (o: any) {\n bb.union(I.localBox(c, o, I.worldInverseOf(c)))\n })\n const at = new V3(hx, (bb.min.y + bb.max.y) / 2, z.side < 0 ? bb.min.z : bb.max.z)\n const yaw = I.pivotOf(c, [], at)\n const tilt = new THREE.Group()\n yaw.add(tilt)\n c.root.updateMatrixWorld(true)\n objs.forEach(function (o: any) {\n tilt.attach(o)\n o.traverse(function (x: any) {\n x.userData.noFollow = true\n })\n })\n const dx = Math.abs(hx - (z.hinge === 'rear' ? B.x1 : B.x0))\n const sgn = z.hinge === 'rear' ? -1 : 1\n yaw.rotation.y = z.side * sgn * (0.42 + c.rand() * 0.15)\n tilt.rotation.z = sgn * Math.min(0.22, Math.asin(clamp((bb.min.y - 0.03) / Math.max(0.3, dx), 0, 0.9)))\n c.parts.forEach(function (p: any) {\n if (p.kind === 'door') p.done = true\n })\n }\n /* hanging lid: opens on the top hinge (or drops on the bottom one, on a cargo bed) */\n function lidHang(c: any, z: any, dirty: any) {\n const B = z.box\n const rect = [B.y0 + 0.05, B.y1 - 0.03, B.z0 + 0.05, B.z1 - 0.05]\n const d = z.dir\n const a = I.axisOf(d)\n if (a !== 0) return flapHang(c, z, dirty)\n const pcs = I.cutPanel(c, z, rect, true, dirty).filter(function (q: any) {\n return q.mesh\n })\n if (!pcs.length) return\n const bb = new THREE.Box3()\n const inv = I.worldInverseOf(c)\n pcs.forEach(function (q: any) {\n bb.union(I.localBox(c, q.mesh, inv))\n })\n const top = z.hinge !== 'down'\n const sx = d.x > 0 ? -1 : 1\n const at = new V3(sx < 0 ? bb.min.x : bb.max.x, top ? bb.max.y : bb.min.y, 0)\n const piv = I.pivotOf(\n c,\n pcs.map(function (q: any) {\n return q.mesh\n }),\n at,\n )\n piv.rotation.z = (top ? 1 : -1) * sx * (top ? 0.55 : 1.2)\n piv.rotation.x = (c.rand() - 0.5) * 0.12\n }\n /* torn and bent-out metal flap on a panel corner */\n function flapHang(c: any, z: any, dirty: any) {\n const R = c.rand\n const B = z.box\n const d = z.dir\n const a = I.axisOf(d)\n const ax = [0, 1, 2].filter(function (k) {\n return k !== a\n })\n const u0 = I.boxLo(B, ax[0])\n const u1 = I.boxHi(B, ax[0])\n const v0 = I.boxLo(B, ax[1])\n const v1 = I.boxHi(B, ax[1])\n const lu = u1 - u0\n const lv = v1 - v0\n const ks = clamp((c.meta.length || 4.2) / 4.2, 0.45, 1)\n const fu = Math.min(0.45 * ks, lu * 0.32)\n const fv = Math.min(0.35 * ks, lv * 0.4)\n const cu = u0 + lu * (0.3 + R() * 0.4)\n const cv = v0 + lv * (0.3 + R() * 0.4)\n const rect = [cu - fu / 2, cu + fu / 2, cv - fv / 2, cv + fv / 2]\n const pcs = I.cutPanel(c, z, rect, true, dirty).filter(function (q: any) {\n return q.mesh && q.cut\n })\n if (!pcs.length) return\n const at = new V3()\n at.setComponent(a, d.getComponent(a) > 0 ? I.boxLo(B, a) : I.boxHi(B, a))\n at.setComponent(ax[0], rect[0])\n at.setComponent(ax[1], (rect[2] + rect[3]) / 2)\n const inv = I.worldInverseOf(c)\n const bb = new THREE.Box3()\n pcs.forEach(function (q: any) {\n bb.union(I.localBox(c, q.mesh, inv))\n })\n at.setComponent(a, bb.getCenter(new V3()).getComponent(a))\n const piv = I.pivotOf(\n c,\n pcs.map(function (q: any) {\n return q.mesh\n }),\n at,\n )\n const axisV = new V3()\n axisV.setComponent(ax[1], 1)\n const outv = d.clone().negate()\n const tangent = new V3()\n tangent.setComponent(ax[0], 1)\n const sgn = new V3().crossVectors(axisV, tangent).dot(outv) > 0 ? 1 : -1\n piv.quaternion.setFromAxisAngle(axisV, sgn * (0.6 + R() * 0.3))\n }\n\n Object.assign(I, { panelBand, roofOff, tailOff, followersIn, windowsOver, doorGap, mirrorHang, doorHang, lidHang, flapHang })\n}\n","/** Per-zone damage for separate parts: lights, wheels, glass, internals, rotors and landing gear. */\nimport type { Kit } from './types'\nimport { clamp, hash, rng } from './util'\n\nexport function installDamageParts(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const document = kit.document\n const { MATERIALS } = I\n\n /* ---- glass ---- */\n function glassPt(c: any, g: any, rnd: any) {\n g.geometry.computeBoundingBox()\n const bb = g.geometry.boundingBox.clone().applyMatrix4(g.matrix)\n const s = bb.getSize(new V3())\n return new V3(bb.min.x + s.x * (0.3 + rnd() * 0.4), bb.min.y + s.y * (0.3 + rnd() * 0.4), bb.min.z + s.z * (0.3 + rnd() * 0.4))\n }\n function glassIn(c: any, g: any) {\n const p = glassPt(c, g, function () {\n return 0.5\n })\n const m = c.meta\n return new V3((m.front + m.rear) / 2 - p.x, 0, -p.z).normalize()\n }\n function glassBand(c: any, z: any, g: any, b: any) {\n const G = g.userData.glass\n if (!G || !g.parent) return\n const R = c.rand\n const bullet = c.meta.bullet\n if (b === 1) I.crackGlass(c, g, glassPt(c, g, R), 0.2, 0.26)\n else if (b === 2) I.crackGlass(c, g, glassPt(c, g, R), 1.0)\n else if (b === 3) {\n if (G.type === 'laminated' || bullet) {\n for (let i = 0; i < 3; i++) I.crackGlass(c, g, glassPt(c, g, R), 1.2)\n I.burst(c, 'shard', c.toEffects(glassPt(c, g, R)), 10, { speed: 1.2 })\n } else I.shatterGlass(c, g, 1.0, glassIn(c, g))\n } else if (b === 4) {\n if (!G.broken && G.type !== 'laminated' && !bullet) I.shatterGlass(c, g, 1.0, glassIn(c, g))\n else I.burst(c, 'shard', c.toEffects(glassPt(c, g, R)), 14, { speed: 1.4 })\n G.broken = true\n g.visible = false\n }\n }\n /* ---- headlights and taillights ---- */\n const crackLensCache = new Map()\n let crackTextureCache: any = null\n function crackTexture() {\n if (crackTextureCache) return crackTextureCache\n const cv = document.createElement('canvas')\n cv.width = cv.height = 128\n const x: any = cv.getContext('2d')\n const r = rng(77)\n x.fillStyle = '#ffffff'\n x.fillRect(0, 0, 128, 128)\n for (let pass = 0; pass < 2; pass++) {\n x.strokeStyle = pass ? 'rgba(255,255,255,1)' : 'rgba(30,30,30,0.9)'\n x.lineWidth = pass ? 1 : 2.4\n const rr = rng(77)\n for (let i = 0; i < 9; i++) {\n let a = (i / 9) * PI * 2 + rr() * 0.4\n let px = 60\n let py = 66\n x.beginPath()\n x.moveTo(px, py)\n for (let k = 1; k < 5; k++) {\n a += (rr() - 0.5) * 0.5\n px += Math.cos(a) * 14\n py += Math.sin(a) * 14\n x.lineTo(px, py)\n }\n x.stroke()\n }\n }\n void r\n crackTextureCache = new THREE.CanvasTexture(cv)\n return crackTextureCache\n }\n function crackLens(mat: any) {\n if (crackLensCache.has(mat)) return crackLensCache.get(mat)\n const m2 = mat.clone()\n m2.map = crackTexture()\n m2.needsUpdate = true\n crackLensCache.set(mat, m2)\n return m2\n }\n function lightBand(c: any, z: any, Lt: any, b: any) {\n if (!Lt || Lt.broken === 'gone') return\n const dir = new V3(Lt.kind === 'taillight' ? 1 : -1, 0, 0)\n if (b === 1) {\n Lt.lens.forEach(function (m: any) {\n if (m.material && !Array.isArray(m.material)) m.material = crackLens(m.material)\n })\n ;(Lt.halo || []).forEach(function (h: any) {\n h.material = h.material.clone()\n h.material.opacity *= 0.55\n })\n } else if (b >= 2) {\n I.breakLight(c, Lt, dir)\n if (b === 3 && Lt.group) {\n Lt.group.rotation.x += (c.rand() - 0.5) * 0.5\n Lt.group.rotation.z += -0.25\n Lt.group.position.y -= 0.035\n Lt.group.position.addScaledVector(dir, -0.02)\n Lt.group.userData.noFollow = true\n }\n if (b === 4) {\n if (Lt.group) Lt.group.visible = false\n else\n Lt.lens.concat(Lt.inner).forEach(function (m: any) {\n m.visible = false\n })\n Lt.broken = 'gone'\n }\n }\n }\n /* ---- wheels: flat flattens the bottom of the tyre; without a tyre, the wheel sits on its rim ---- */\n function tireMeshes(w: any) {\n const out: any = []\n w.traverse(function (o: any) {\n if (o.isMesh && o.material === MATERIALS.rubber) out.push(o)\n })\n return out\n }\n function flattenTire(w: any, k: any) {\n const r = w.userData.r || 0.3\n const yb = -r * (1 - k)\n const v = new V3()\n const M = new THREE.Matrix4()\n const Mi = new THREE.Matrix4()\n tireMeshes(w).forEach(function (t: any) {\n if (!t.userData.zCloned) {\n t.geometry = t.geometry.clone()\n t.userData.zCloned = true\n }\n t.updateMatrix()\n M.copy(t.matrix)\n Mi.copy(M).invert()\n const p = t.geometry.attributes.position\n for (let i = 0; i < p.count; i++) {\n v.fromBufferAttribute(p, i).applyMatrix4(M)\n if (v.y < yb) {\n const e = (yb - v.y) / Math.max(0.01, r * k)\n v.y = yb\n v.z *= 1 + 0.25 * Math.min(1, e)\n v.applyMatrix4(Mi)\n p.setXYZ(i, v.x, v.y, v.z)\n }\n }\n p.needsUpdate = true\n t.geometry.computeVertexNormals()\n t.geometry.computeBoundingSphere()\n })\n }\n function wheelBand(c: any, z: any, w: any, b: any) {\n if (!w || !w.parent) return\n const r = w.userData.r || 0.3\n const s = w.position.z >= 0 ? 1 : -1\n const R = c.rand\n if (b === 1) {\n for (let i = 0; i < 3; i++) {\n const a = R() * PI * 2\n const sc = new THREE.Mesh(new THREE.BoxGeometry(r * 0.35, 0.006, 0.002), I.DAMAGE_MATERIALS.deep)\n sc.position.set(Math.cos(a) * r * 0.45, Math.sin(a) * r * 0.45, s * (r * 0.5 + 0.02))\n sc.rotation.z = a + PI / 2\n sc.userData.decal = true\n w.add(sc)\n }\n } else if (b === 2) {\n flattenTire(w, 0.13)\n c.zoneDrops.push({ x: w.position.x, z: w.position.z, d: r * 0.13 })\n } else if (b === 3) {\n flattenTire(w, 0.24)\n w.rotation.y += (R() - 0.5) * 0.25\n w.rotation.x += s * 0.1\n c.zoneDrops.push({ x: w.position.x, z: w.position.z, d: r * 0.24 })\n } else if (b === 4) {\n let rr = 0\n w.traverse(function (o: any) {\n if (!o.isMesh || o.material === MATERIALS.rubber) return\n if (!o.geometry.boundingSphere) o.geometry.computeBoundingSphere()\n const cc = o.geometry.boundingSphere.center.clone().applyMatrix4(o.matrix)\n rr = Math.max(rr, Math.hypot(cc.x, cc.y) + o.geometry.boundingSphere.radius * 0.7)\n })\n rr = clamp(rr || r * 0.62, r * 0.4, r * 0.85)\n tireMeshes(w).forEach(function (t: any) {\n t.visible = false\n })\n c.zoneDrops.push({ x: w.position.x, z: w.position.z, d: r - rr })\n const gp = c.toEffects(new V3(w.position.x, 0.02, w.position.z))\n I.burst(c, 'spark', gp, 14, { speed: 2.4, spread: 1.6 })\n const mk = new THREE.Mesh(new THREE.PlaneGeometry(1.6, 0.06), I.DAMAGE_MATERIALS.scrape)\n mk.rotation.x = -PI / 2\n mk.position.set(gp.x - 0.8, 0.006, gp.z)\n mk.userData.decal = true\n mk.raycast = function () {}\n c.effects.add(mk)\n }\n }\n /* ---- aircraft landing gear: dented sags, destroyed breaks the front leg (nose on the ground), torn off = belly landing ---- */\n function gearBand(c: any, z: any, b: any) {\n const R = c.rand\n const ws = z.wheels.filter(function (w: any) {\n return w.parent\n })\n const objs = z.owned.filter(function (o: any) {\n return o.parent\n })\n if (!ws.length) return\n if (b <= 2) {\n ws.forEach(function (w: any) {\n wheelBand(c, z, w, b)\n })\n return\n }\n if (b === 3) {\n const xmax = Math.max.apply(\n null,\n ws.map(function (w: any) {\n return w.position.x\n }),\n )\n const front = ws.filter(function (w: any) {\n return w.position.x > xmax - 0.3\n })\n ws.forEach(function (w: any) {\n if (front.indexOf(w) < 0) wheelBand(c, z, w, 2)\n })\n front.forEach(function (w: any) {\n const r = w.userData.r || 0.3\n const near = objs.filter(function (o: any) {\n const p = o.position\n const bb = I.localBox(c, o, I.worldInverseOf(c))\n const cen = bb.getCenter(new V3())\n void p\n return Math.abs(cen.x - w.position.x) < 0.5 && Math.abs(cen.z - w.position.z) < 0.5\n })\n const inv = I.worldInverseOf(c)\n const top = new V3(w.position.x, w.position.y + r, w.position.z)\n near.forEach(function (o: any) {\n const bb = I.localBox(c, o, inv)\n top.y = Math.max(top.y, bb.max.y)\n })\n w.userData.gpos = w.position.clone()\n const piv = I.pivotOf(c, [w].concat(near), top)\n piv.rotation.z = 0.75 + R() * 0.25\n piv.rotation.x = (R() - 0.5) * 0.3\n c.zoneDrops.push({ x: w.position.x, z: w.position.z, d: r * 1.25 })\n I.burst(c, 'spark', c.toEffects(new V3(w.position.x, 0.03, w.position.z)), 10, { speed: 2, spread: 1.4 })\n })\n return\n }\n /* torn off: the gear disappears and the aircraft settles on its belly, slightly nose down */\n ws.concat(objs).forEach(function (o: any) {\n I.hideObj(c, o)\n })\n /* propeller stopped horizontally (hit the ground and the engine died) */\n I.partsOf(c, 'propeller').forEach(function (hp: any) {\n const o = hp.obj\n if (!o || !o.parent) return\n c.spin = c.spin.filter(function (q: any) {\n return q.o !== o\n })\n let best = 0\n let by = -1e9\n for (let k = 0; k < 12; k++) {\n o.rotation.x = (k / 12) * PI\n c.root.updateMatrixWorld(true)\n const y0 = I.localBox(c, o, I.worldInverseOf(c)).min.y\n if (y0 > by + 1e-4) {\n by = y0\n best = o.rotation.x\n }\n }\n o.rotation.x = best\n I.hurtEngine(c, 0.3)\n })\n c.root.updateMatrixWorld(true)\n const inv2 = I.worldInverseOf(c)\n let lo = 1e9\n let xs = 0\n c.vehicle.traverse(function (o: any) {\n if (!o.isMesh || o.userData.decal || o.isSprite || !o.geometry || !o.geometry.attributes.position) return\n for (let q = o; q && q !== c.vehicle; q = q.parent) if (!q.visible) return\n const bb = I.localBox(c, o, inv2)\n if (bb.min.y < lo) {\n lo = bb.min.y\n xs = (bb.min.x + bb.max.x) / 2\n }\n })\n if (lo < 1e8 && lo > 0.02) c.vehicle.position.y -= lo - 0.01\n const m = c.meta\n const gp = c.toEffects(new V3(xs, 0.02, 0))\n I.burst(c, 'spark', gp, 18, { speed: 2.6, spread: 1.8 })\n const mk = new THREE.Mesh(new THREE.PlaneGeometry(Math.min(4, (m.length || 6) * 0.5), 0.5), I.DAMAGE_MATERIALS.scrape)\n mk.rotation.x = -PI / 2\n mk.position.set(gp.x - 1.2, 0.006, gp.z)\n mk.userData.decal = true\n mk.raycast = function () {}\n c.effects.add(mk)\n }\n /* ---- internal zones: engine, radiator, tank, battery, underbody ---- */\n function internalBand(c: any, z: any, b: any) {\n const m = c.meta\n const p = z.pos ? z.pos.clone() : I.boxCenter(z.box)\n const sub = z.sub || z.id\n const land = ['boat', 'plane', 'heli'].indexOf(m.kind) < 0\n if (b === 0) return\n if (sub === 'engine') {\n if (b === 1) I.hurtEngine(c, 0.8)\n if (b === 2) {\n I.hurtEngine(c, 0.55)\n kit.addEmitter(c, p.clone().add(new V3(0, 0.3, 0)), 'white', { rate: 2, s: 0.7 })\n }\n if (b >= 3) {\n I.hurtEngine(c, b === 4 ? 0.05 : 0.25)\n kit.addEmitter(c, p.clone().add(new V3(0, 0.3, 0)), 'black', { rate: b === 4 ? 6 : 4 })\n if (land) I.puddle(c, 'oil', p.clone().setY(Math.max(0.2, m.clearance || 0.3)), b === 4 ? 0.9 : 0.6)\n }\n if (b === 4) kit.addEmitter(c, p.clone().add(new V3(0, 0.15, 0)), 'fire', { rate: 7, s: 0.7 })\n if (b >= 2 && c.hood && !c.hood.noLatch && c.hood.x1 > 0 === p.x > 0) c.hood.latch = Math.max(c.hood.latch, 0.08)\n } else if (sub === 'radiator') {\n if (b === 2) kit.addEmitter(c, p.clone().add(new V3(-0.1, 0.25, 0)), 'white', { rate: 2.5, s: 0.7 })\n if (b >= 3) {\n kit.addEmitter(c, p.clone().add(new V3(-0.1, 0.25, 0)), 'white', { rate: b === 4 ? 8 : 5 })\n I.hurtEngine(c, b === 4 ? 0.35 : 0.6)\n }\n } else if (sub === 'fuel_tank') {\n const fu = I.tankFuel(c, { label: z.name })\n if (fu && land && b >= 2) {\n const pd = I.puddle(c, fu, p.clone(), b === 2 ? 0.35 : b === 3 ? 0.95 : 1.4)\n if (b === 4 && fu === 'gasoline') I.igniteFuel(c, pd)\n }\n if (b === 4 && !land) kit.addEmitter(c, p.clone(), 'black', { rate: 3 })\n } else if (sub === 'battery') {\n if (b >= 3) kit.addEmitter(c, p.clone().add(new V3(0, 0.6, 0)), 'black', { rate: 3 })\n if (b === 4) kit.addEmitter(c, p.clone().add(new V3(0, 0.15, 0)), 'fire', { rate: 8, s: 0.8 })\n } else if (sub === 'underbody') {\n const ug = m.underbodyGroup\n if (b >= 2 && ug) {\n ug.rotation.z += b === 2 ? 0.012 : 0.03\n ug.position.y -= b === 2 ? 0.015 : 0.05\n }\n if (b === 4 && ug) {\n ug.position.y -= 0.06\n I.burst(c, 'spark', c.toEffects(new V3(m.rear + 0.6, 0.05, 0)), 12, { speed: 2 })\n }\n if (b >= 3 && land) I.puddle(c, 'oil', new V3(((m.front || 1) + (m.rear || -1)) / 2 + 0.6, 0.2, 0), 0.4)\n }\n }\n /* ---- hood ---- */\n function hoodBand(c: any, z: any, b: any, dirty: any) {\n const H = c.hood && z.owned.indexOf(c.hood.piv) >= 0 ? c.hood : null\n if (!H) return I.panelBand(c, z, b, dirty)\n const R = c.rand\n const inv = I.worldInverseOf(c)\n const cands = I.zoneCands(c, z, inv)\n if (b === 0) {\n if (z.health < 92) I.zoneDecals(c, z, { fine: 2 }, cands)\n return\n } /* intact (76 to 99): only fine scratches, no dents and no unlatching */\n if (b === 1) {\n I.zoneDecals(c, z, { deep: 3, chip: 3, fine: 2 }, cands)\n return\n }\n if (b === 4) {\n H.piv.visible = false\n c.parts.forEach(function (p: any) {\n if (p.kind === 'hood') p.done = true\n })\n c.hood = null\n return\n }\n const B = z.box\n const len = B.x1 - B.x0\n const wz = B.z1 - B.z0\n const dep = b === 2 ? 0.05 + R() * 0.03 : 0.1 + R() * 0.05\n I.zoneDent(\n c,\n z,\n [{ u: B.x0 + len * (0.55 + R() * 0.2), v: (R() - 0.5) * wz * 0.3, ru: len * 0.38, rv: wz * 0.32, depth: dep, ph: R() * 6 }],\n dirty,\n { crease: { v: (R() - 0.5) * wz * 0.2, w: 0.08, depth: dep * 0.6 }, noSub: false },\n )\n H.latch = Math.max(H.latch, b === 2 ? 0.15 : 0.28)\n if (b === 3) {\n /* folded up: the front half rises around a crease line */\n const xf = H.x0 + (H.x1 - H.x0) * (0.5 + R() * 0.1)\n const k = 0.55 + R() * 0.2\n const v = new V3()\n H.piv.children.forEach(function (msh: any) {\n if (!msh.isMesh) return\n msh.updateMatrix()\n const M = msh.matrix\n const Mi = new THREE.Matrix4().copy(M).invert()\n const p = msh.geometry.attributes.position\n for (let i = 0; i < p.count; i++) {\n v.fromBufferAttribute(p, i).applyMatrix4(M)\n const gx = v.x + H.x0\n if (gx > xf) {\n const t = gx - xf\n v.y += t * k * (1 + 0.15 * Math.sin(v.z * 7))\n v.x -= t * (1 - Math.cos(Math.atan(k))) * 0.5\n }\n v.applyMatrix4(Mi)\n p.setXYZ(i, v.x, v.y, v.z)\n }\n p.needsUpdate = true\n msh.geometry.computeBoundingSphere()\n dirty.add(msh)\n })\n I.zoneDecals(c, z, { deep: 3, chip: 2, rust: 2, tear: 1 }, I.zoneCands(c, z, I.worldInverseOf(c)))\n } else I.zoneDecals(c, z, { deep: 3, chip: 3 }, I.zoneCands(c, z, I.worldInverseOf(c)))\n }\n /* ---- bumper ---- */\n function bumperBand(c: any, z: any, b: any, dirty: any) {\n const o = z.owned[0]\n if (!o || !o.parent) return I.panelBand(c, z, b, dirty)\n const R = c.rand\n const inv = I.worldInverseOf(c)\n const cands = I.zoneCands(c, z, inv)\n const bb = I.localBox(c, o, inv)\n const cen = bb.getCenter(new V3())\n const sx = cen.x > 0 ? 1 : -1\n if (b === 0) {\n if (z.health < 92) I.zoneDecals(c, z, { fine: 2 }, cands)\n return\n } /* intact (76 to 99): the bumper stays in place */\n if (b === 1) {\n I.zoneDecals(c, z, { deep: 3, chip: 2 }, cands)\n return\n }\n if (b === 4) {\n I.hideObj(c, o)\n return\n }\n I.zoneDecals(c, z, { deep: 3, chip: 2, rust: b === 3 ? 2 : 0 }, cands)\n const sideHit = R() < 0.5 ? -1 : 1\n const p = new V3(cen.x, cen.y, (sideHit * (bb.max.z - bb.min.z)) / 2)\n if (b === 2) {\n I.hangBumper(c, o, p)\n return\n }\n /* destroyed: fell off and lies on the ground in front of (or behind) the vehicle, slightly crooked */\n const di = c.deform.indexOf(o)\n if (di >= 0) c.deform.splice(di, 1)\n if (o.parent !== c.vehicle) {\n c.root.updateMatrixWorld(true)\n c.vehicle.attach(o)\n }\n const hh = (bb.max.y - bb.min.y) / 2\n o.position.x += sx * (0.35 + R() * 0.2)\n o.position.y += hh + 0.004 - bb.min.y - hh\n o.rotation.y += (R() - 0.5) * 0.5\n o.rotation.x += (R() - 0.5) * 0.12\n o.userData.noFollow = true\n c.parts.forEach(function (q: any) {\n if (q.obj === o) q.done = true\n })\n }\n /* ---- loose parts (bike, rotor, weapon, skid) ---- */\n function partBand(c: any, z: any, b: any, dirty: any) {\n const objs = z.owned.filter(function (o: any) {\n return o.parent\n })\n if (!objs.length) return I.panelBand(c, z, b, dirty)\n const R = c.rand\n const inv = I.worldInverseOf(c)\n const cands = I.zoneCands(c, z, inv)\n if (b >= 1 && b <= 3)\n I.zoneDecals(c, z, { deep: b + 1, chip: z.plastic ? 0 : b, rust: b === 3 && !z.plastic && !z.noFlap ? 2 : 0 }, cands)\n if (z.track) {\n const tk = z.track\n if (b === 2) {\n tk.position.y -= 0.025\n }\n if (b === 3) {\n tk.position.addScaledVector(z.dir, -0.12)\n tk.position.y -= 0.05\n tk.rotation.x += z.side * 0.05\n }\n if (b === 4) I.hideObj(c, tk)\n return\n }\n if (z.kindPart && b >= 2 && b <= 3) {\n objs.forEach(function (o: any) {\n o.children.forEach(function (ch: any, i: any) {\n if (ch.type === 'Group' || ch.isMesh) {\n ch.rotation.z += (-0.12 - hash(i, 1, 1) * 0.2) * (b - 1)\n ch.rotation.x += (i % 2 ? 0.15 : -0.15) * (b - 1)\n }\n })\n })\n c.spin = c.spin.filter(function (s: any) {\n return objs.indexOf(s.o) < 0\n })\n return\n }\n if (b === 4) {\n objs.forEach(function (o: any) {\n I.hideObj(c, o)\n })\n c.spin = c.spin.filter(function (s: any) {\n return objs.indexOf(s.o) < 0\n })\n return\n }\n if (b < 2) return\n const m = c.meta\n const B = z.box\n const C = new V3(((m.front || 1) + (m.rear || -1)) / 2, (m.clearance || 0.3) + 0.3, 0)\n const at = z.anchor\n ? new V3(z.anchor[0], z.anchor[1], z.anchor[2])\n : new V3(clamp(C.x, B.x0, B.x1), clamp(C.y, B.y0, B.y1), clamp(C.z, B.z0, B.z1))\n const outv = I.boxCenter(B).sub(at)\n outv.y = 0\n if (outv.lengthSq() < 1e-4) outv.set(1, 0, 0)\n outv.normalize()\n const axis = new V3().crossVectors(new V3(0, 1, 0), outv).normalize()\n const th = b === 2 ? 0.08 + R() * 0.05 : 0.3 + R() * 0.15\n const piv = I.pivotOf(c, objs, at)\n piv.quaternion.setFromAxisAngle(axis, th)\n piv.position.y -= b === 3 ? 0.03 : 0.01\n c.spin = c.spin.filter(function (s: any) {\n return objs.indexOf(s.o) < 0\n })\n }\n /* bent tail cone: everything behind the crease (cone, fin, tail rotor) rotates downward around it.\n Meshes that cross the crease bend per vertex; whole parts behind it rotate as a rigid body. */\n function bendAft(c: any, z: any, kx: any, ky: any, ang: any, dirty: any) {\n const inv = I.worldInverseOf(c)\n const q = new THREE.Quaternion().setFromAxisAngle(new V3(0, 0, 1), ang)\n const K = new V3(kx, ky, 0)\n const v = new V3()\n const rel = new THREE.Matrix4()\n const irel = new THREE.Matrix4()\n const blend = 0.25\n function rot(p: any, k: any) {\n const a2 = ang * k\n const cs = Math.cos(a2)\n const sn = Math.sin(a2)\n const dx = p.x - kx\n const dy = p.y - ky\n p.x = kx + dx * cs - dy * sn\n p.y = ky + dx * sn + dy * cs\n }\n const rigid: any = []\n const verts: any = []\n c.vehicle.children.forEach(function (o: any) {\n if (o.userData.decal || o.isSprite || !o.visible) return\n const ow = I.ownerOf(c, o)\n if (ow && ow !== z && ow.id !== 'rotor_cauda' && I.boxCenter(ow.box).x > kx) return\n const bb = I.localBox(c, o, inv)\n if (bb.isEmpty() || bb.min.x >= kx) return\n if (bb.max.x < kx - 0.02 || !o.isMesh) {\n if (bb.max.x < kx + 0.3) rigid.push(o)\n } else verts.push(o)\n })\n rigid.forEach(function (o: any) {\n const p = o.position.clone()\n rot(p, 1)\n o.position.copy(p)\n o.quaternion.premultiply(q)\n })\n verts.forEach(function (msh: any) {\n if (!msh.geometry || !msh.geometry.attributes.position) return\n if (!msh.userData.zCloned && c.deform.indexOf(msh) < 0) {\n msh.geometry = msh.geometry.clone()\n msh.userData.zCloned = true\n }\n msh.updateMatrixWorld(true)\n rel.multiplyMatrices(inv, msh.matrixWorld)\n irel.copy(rel).invert()\n const pos = msh.geometry.attributes.position\n let ch = false\n for (let i = 0; i < pos.count; i++) {\n v.fromBufferAttribute(pos, i).applyMatrix4(rel)\n if (v.x >= kx) continue\n rot(v, I.sm((kx - v.x) / blend))\n v.applyMatrix4(irel)\n pos.setXYZ(i, v.x, v.y, v.z)\n ch = true\n }\n if (ch) {\n pos.needsUpdate = true\n dirty.add(msh)\n }\n })\n void K\n }\n\n Object.assign(I, {\n glassPt,\n glassIn,\n glassBand,\n crackLensCache,\n crackTextureCache,\n crackTexture,\n crackLens,\n lightBand,\n tireMeshes,\n flattenTire,\n wheelBand,\n gearBand,\n internalBand,\n hoodBand,\n bumperBand,\n partBand,\n bendAft,\n })\n}\n","/** Zone derivation from the vehicle meta, merged with builder declarations. */\nimport type { Kit } from './types'\n\nexport function installZoneDerive(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n\n /* ---- finalisation: direction, side, owned parts, map ---- */\n function parseDir(d: any) {\n if (!d) return null\n if (d.isVector3) return d.clone().normalize()\n if (Array.isArray(d)) return new V3(d[0], d[1], d[2]).normalize()\n return (\n ({\n left: new V3(0, 0, 1),\n right: new V3(0, 0, -1),\n front: new V3(-1, 0, 0),\n rear: new V3(1, 0, 0),\n up: new V3(0, -1, 0),\n down: new V3(0, 1, 0),\n } as Record<string, any>)[d] || null\n )\n }\n function resolveObjs(c: any, list: any, z: any) {\n const out: any = []\n ;(list || []).forEach(function (o: any) {\n if (!o) return\n if (typeof o === 'string') {\n c.parts.forEach(function (p: any) {\n if ((p.label === o || p.kind === o) && p.obj) {\n if (p.light) z.lights.push(p.light)\n else out.push(p.obj)\n }\n })\n c.glass.forEach(function (g: any) {\n if (g.userData.glass && g.userData.glass.label === o) z.glass.push(g)\n })\n return\n }\n if (o.lens && o.inner) {\n z.lights.push(o)\n return\n }\n if (o.isObject3D) {\n if (o.userData.glass) z.glass.push(o)\n else if (c.wheels.indexOf(o) >= 0) z.wheels.push(o)\n else out.push(o)\n }\n })\n return out\n }\n function deriveZones(c: any) {\n const m = c.meta\n let list: any = []\n const byId: any = {}\n ;(m.zones === false ? [] : I.autoZones(c)).forEach(function (z: any) {\n byId[z.id] = z\n list.push(z)\n })\n ;(c.zoneDefs || []).forEach(function (d: any) {\n let z = byId[d.id]\n if (d.remove) {\n if (z) {\n list.splice(list.indexOf(z), 1)\n delete byId[d.id]\n }\n /* removing the left headlight also removes the extra groups on the same side (headlight_left_2...) */\n list.slice().forEach(function (q: any) {\n if (q.id.indexOf(d.id + '_') === 0 && /^\\d+$/.test(q.id.slice(d.id.length + 1))) {\n list.splice(list.indexOf(q), 1)\n delete byId[q.id]\n }\n })\n return\n }\n if (z) {\n const o0 = z.objs || []\n Object.assign(z, d)\n z.objs = d.objs ? (d.replace ? d.objs : o0.concat(d.objs)) : o0\n } else {\n z = Object.assign({ type: 'panel' }, d)\n byId[d.id] = z\n list.push(z)\n }\n })\n const inv = I.worldInverseOf(c)\n const F = m.front\n const R = m.rear\n const W = m.width || 1.7\n const owner = new Map()\n /* zone created (or refined as part/wheel) with parts only, no box: the box comes from the parts themselves */\n ;(c.zoneDefs || []).forEach(function (d: any) {\n const z = byId[d.id]\n if (!z || d.remove || d.box || !d.objs || !d.objs.length) return\n if (z.box && !d.fit && !(z.type === 'part' || z.type === 'wheel')) return\n const tmp = { lights: [], glass: [], wheels: [] }\n const os = resolveObjs(c, d.objs, tmp)\n const bb = new THREE.Box3()\n os.concat(tmp.glass, tmp.wheels).forEach(function (o: any) {\n bb.union(I.localBox(c, o, inv))\n })\n tmp.lights.forEach(function (Lt) {\n bb.union(I.lightBoxOf(c, Lt, inv))\n })\n if (z.box && z.type === 'wheel')\n (z.wheels || []).forEach(function (w: any) {\n bb.union(I.localBox(c, w, inv))\n })\n if (bb.isEmpty()) return\n bb.expandByScalar(0.05)\n if (z.box && z.type === 'part' && !d.fit) {\n const B0 = z.box\n bb.union(new THREE.Box3(new V3(B0.x0, B0.y0, B0.z0), new V3(B0.x1, B0.y1, B0.z1)))\n }\n z.box = I.normalizeBox(bb)\n })\n list = list.filter(function (z: any) {\n return z.box && z.name\n })\n list.forEach(function (z: any) {\n z.glass = (z.glass || []).slice()\n z.lights = (z.lights || []).slice()\n z.wheels = (z.wheels || []).slice()\n z.tags = z.tags || []\n z.owned = resolveObjs(c, z.objs, z)\n if (z.plastic == null && (c.meta.kind === 'bike' || c.meta.kind === 'quad') && (z.fxKey === 'fairing' || z.fxKey === 'seat'))\n z.plastic = true\n if (z.plastic) z.noFlap = true\n const cen = I.boxCenter(z.box)\n if (z.side == null) z.side = cen.z < -W * 0.2 ? -1 : cen.z > W * 0.2 ? 1 : 0\n z.dir =\n parseDir(z.dir) ||\n (z.side\n ? new V3(0, 0, -z.side)\n : cen.x > F - 0.2 * (F - R)\n ? new V3(-1, 0, 0)\n : cen.x < R + 0.2 * (F - R)\n ? new V3(1, 0, 0)\n : new V3(0, -1, 0))\n z.weight = z.weight || I.ZONE_WEIGHTS[z.type] || 1\n z.internal = z.type === 'internal'\n z.health = 100\n if (z.side < 0 && z.tags.indexOf('left') < 0) z.tags.push('left')\n if (z.side > 0 && z.tags.indexOf('right') < 0) z.tags.push('right')\n z.owned.forEach(function (o: any) {\n owner.set(o, z)\n })\n z.glass.forEach(function (o: any) {\n if (!owner.has(o)) owner.set(o, z)\n })\n z.wheels.forEach(function (o: any) {\n owner.set(o, z)\n })\n z.lights.forEach(function (Lt: any) {\n if (Lt.group) owner.set(Lt.group, z)\n Lt.lens.concat(Lt.inner).forEach(function (o: any) {\n owner.set(o, z)\n })\n })\n })\n /* glass without a zone of its own goes to the panel zone that contains it (aircraft cabin, helicopter nose) */\n c.glass.forEach(function (g: any) {\n if (owner.has(g) || !g.parent || !g.userData.glass || g.userData.ghost) return\n const cg = I.localBox(c, g, inv).getCenter(new V3())\n let best: any = null\n list.forEach(function (z: any) {\n if (z.internal || z.type === 'wheel' || z.type === 'light') return\n if (I.boxContains(z.box, cg.x, cg.y, cg.z, 0.05) && (!best || I.boxVolume(z.box) < I.boxVolume(best.box))) best = z\n })\n if (best) {\n best.glass.push(g)\n owner.set(g, best)\n }\n })\n /* loose parts (children of c.vehicle) join the smallest \"part\" zone that contains them */\n const looseParts = list.filter(function (z: any) {\n return z.type === 'part'\n })\n if (looseParts.length)\n c.vehicle.children.forEach(function (o: any) {\n if (owner.has(o) || o.userData.decal || o.isSprite || o.userData.glass || c.wheels.indexOf(o) >= 0) return\n const bb = I.localBox(c, o, inv)\n if (bb.isEmpty()) return\n const cen = bb.getCenter(new V3())\n const sz = bb.getSize(new V3())\n let best: any = null\n looseParts.forEach(function (z: any) {\n const B = z.box\n if (!I.boxContains(B, cen.x, cen.y, cen.z, 0.02)) return\n if (sz.x > (B.x1 - B.x0) * 1.6 + 0.1 || sz.y > (B.y1 - B.y0) * 1.6 + 0.1 || sz.z > (B.z1 - B.z0) * 1.6 + 0.1) return\n if (!best || I.boxVolume(B) < I.boxVolume(best.box)) best = z\n })\n if (best) {\n best.owned.push(o)\n owner.set(o, best)\n c.lights.forEach(function (Lt: any) {\n if (Lt.group === o && best.lights.indexOf(Lt) < 0) best.lights.push(Lt)\n })\n }\n })\n /* mirrors: small parts outside the body width, at belt height, next to the front door */\n list.forEach(function (z: any) {\n if (!z.mirror) return\n z.mirrors = []\n const B = z.box\n const belt = m.belt || 1\n c.vehicle.children.forEach(function (o: any) {\n if (owner.has(o) || !o.isMesh || o.userData.decal) return\n const bb = I.localBox(c, o, inv)\n const cen = bb.getCenter(new V3())\n const sz = bb.getSize(new V3())\n if (Math.max(sz.x, sz.y, sz.z) > 0.6) return\n if (\n Math.sign(cen.z) !== z.side ||\n Math.abs(cen.z) < W / 2 + 0.015 ||\n cen.y < belt - 0.15 ||\n cen.y > belt + 0.4 ||\n cen.x < B.x1 - 0.55 ||\n cen.x > B.x1 + 0.25\n )\n return\n z.mirrors.push(o)\n owner.set(o, z)\n })\n /* the housing and the mirror glass stay next to the arm already found (the core may sit inside the body width) */\n if (z.mirrors.length) {\n const mb = new THREE.Box3()\n z.mirrors.forEach(function (o: any) {\n mb.union(I.localBox(c, o, inv))\n })\n mb.expandByScalar(0.05)\n c.vehicle.children.forEach(function (o: any) {\n if (owner.has(o) || !o.isMesh || o.userData.decal || o.userData.glass) return\n const bb = I.localBox(c, o, inv)\n const sz = bb.getSize(new V3())\n if (Math.max(sz.x, sz.y, sz.z) > 0.3 || !mb.intersectsBox(bb)) return\n z.mirrors.push(o)\n owner.set(o, z)\n })\n }\n })\n list.forEach(function (z: any) {\n const B = z.box\n z.map = z.map || [Math.max(B.x0, R - 0.3), Math.min(B.x1, F + 0.3), Math.max(B.z0, -W / 2 - 0.35), Math.min(B.z1, W / 2 + 0.35)]\n })\n carMap(c, list)\n c.zoneOwners = owner\n return list\n }\n /* more readable top-down map for cars: door on the edge, side glass inward, roof in the middle */\n function carMap(c: any, list: any) {\n const m = c.meta\n const W = m.width || 1.7\n const hw = W / 2\n const gh = m.glasshouse\n if ((m.kind || 'car') !== 'car' || !gh || gh.fb == null) return\n list.forEach(function (z: any) {\n if (z.mapSet) return\n const B = z.box\n const s = z.side\n if (z.type === 'door' || /^fender|^side_rear/.test(z.id)) z.map = [B.x0, B.x1, s < 0 ? -hw : hw - 0.16, s < 0 ? -hw + 0.16 : hw]\n else if (z.type === 'glass' && s) z.map = [B.x0, B.x1, s < 0 ? -hw + 0.17 : hw - 0.3, s < 0 ? -hw + 0.3 : hw - 0.17]\n else if (z.id === 'roof') z.map = [Math.min(gh.rt, gh.rb + 0.3), Math.max(gh.ft, gh.fb - 0.3), -hw + 0.31, hw - 0.31]\n else if (z.type === 'glass' && z.tags.indexOf('windshield') >= 0)\n z.map = [Math.max(gh.ft, gh.fb - 0.3), gh.fb + 0.02, -hw + 0.31, hw - 0.31]\n else if (z.type === 'glass') z.map = [B.x0 - 0.02, Math.min(gh.rt, gh.rb + 0.3), -hw + 0.31, hw - 0.31]\n else if (z.id === 'hood' || z.id === 'lid' || z.id === 'cargo_bed')\n z.map = [Math.max(B.x0, z.id === 'hood' ? gh.fb : -1e9), Math.min(B.x1, z.id === 'hood' ? 1e9 : gh.rb), -hw + 0.17, hw - 0.17]\n else if (z.type === 'bumper' || /^bumper/.test(z.id))\n z.map = [z.id === 'bumper_front' ? m.front - 0.2 : m.rear - 0.02, z.id === 'bumper_front' ? m.front + 0.02 : m.rear + 0.2, -hw, hw]\n else if (z.type === 'wheel') {\n const w = z.wheels[0]\n const r = (w && w.userData.r) || 0.3\n if (w)\n z.map = [\n w.position.x - r * 0.85,\n w.position.x + r * 0.85,\n w.position.z < 0 ? -hw - 0.2 : hw - 0.02,\n w.position.z < 0 ? -hw + 0.02 : hw + 0.2,\n ]\n } else if (z.type === 'light')\n z.map = [Math.max(B.x0, m.rear - 0.02), Math.min(B.x1, m.front + 0.02), Math.max(B.z0, -hw), Math.min(B.z1, hw)]\n })\n }\n function zonesOf(c: any) {\n if (!c.zones) c.zones = deriveZones(c)\n return c.zones\n }\n kit.zonesOf = zonesOf\n function ownerOf(c: any, o: any) {\n const own = c.zoneOwners\n if (!own) return null\n for (let q = o; q && q !== c.vehicle; q = q.parent) if (own.has(q)) return own.get(q)\n return null\n }\n kit.zoneOwner = ownerOf\n\n Object.assign(I, { parseDir, resolveObjs, deriveZones, carMap, zonesOf, ownerOf })\n}\n","/** Automatic zone derivation for each vehicle family. */\nimport type { Kit } from './types'\nimport { legacyGlassId, legacyLightId } from './legacy-seeds'\n\nconst REAR_GLASS_KEYS = ['rear_window', 'window_rear', 'quarter_glass']\n\nexport function installZoneAuto(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n const t = kit.t\n const matchers = kit.matchers\n\n /* ---- automatic derivation by vehicle type ---- */\n function autoZones(c: any) {\n const m = c.meta\n let Z: any = []\n const inv = I.worldInverseOf(c)\n const kind = m.kind || 'car'\n const F = m.front\n const R = m.rear\n const L = m.length || F - R\n const W = m.width || 1.7\n const cl = m.clearance == null ? 0.3 : m.clearance\n const belt = m.belt || cl + 0.6\n const top = m.top || belt + 0.5\n const hw = W / 2\n const WH = I.wheelInfo(c)\n function add(id: any, name: any, type: any, box: any, o?: any) {\n const z = Object.assign({ id: id, name: name, type: type, box: I.normalizeBox(box) }, o || {})\n Z.push(z)\n return z\n }\n let fam = kind\n if (kind === 'quad') fam = 'bike'\n if (kind === 'bus' || kind === 'truck' || kind === 'tractor') fam = 'heavy'\n if (kind === 'car' && (m.bullet || m.armored || I.partsOf(c, 'track').length)) fam = 'military'\n let glassDone = false\n let lightsDone = false\n let wheelsDone = false\n\n /* glass, lights and wheels in common */\n function glassZones(grouped: any) {\n glassDone = true\n const gl = c.glass.filter(function (g: any) {\n return g.parent && g.userData.glass && !g.userData.ghost\n })\n if (!gl.length) return\n const info = gl.map(function (g: any) {\n const pt = c.parts.find(function (p: any) {\n return p.obj === g\n })\n const gd = g.userData.glass\n const bb = I.localBox(c, g, inv)\n const label = (pt && pt.label) || gd.label || t('parts.glass')\n const key = (pt && pt.key) || gd.key || null\n return { g: g, n: label, key: key, side: gd.side || 0, bb: bb, cen: bb.getCenter(new V3()) }\n })\n const isWindshield = function (q: any) {\n return q.key ? /(^|_)windshield($|_)/.test(q.key) : matchers.windshield.test(q.n)\n }\n const isRearGlass = function (q: any) {\n return q.key ? REAR_GLASS_KEYS.indexOf(q.key) >= 0 || /(^|_)rear($|_)/.test(q.key) : matchers.rear.test(q.n)\n }\n if (!grouped && gl.length <= 10) {\n const used: any = {}\n const usedSeed: any = {}\n info.forEach(function (q: any) {\n let n = q.n\n let word = q.side ? (q.side < 0 ? 'left' : 'right') : null\n let appended = null\n if (!q.side && !matchers.side.test(n) && Math.abs(q.cen.z) > W * 0.2) {\n n = t('parts.glass_side_m', { label: n, s: q.cen.z < 0 ? -1 : 1 })\n appended = q.cen.z < 0 ? 'left' : 'right'\n word = appended\n }\n /* keyed glass gets \"<key>_<side>\"; free-text labels keep the slug of the label */\n let id = q.key ? q.key + (word ? '_' + word : '') : I.slug(n)\n if (!matchers.glassId.test(id)) id = 'glass_' + id\n if (used[id]) id += '_' + ++used[id]\n else used[id] = 1\n let seed = legacyGlassId(q.key, q.n, q.side, appended, id)\n if (usedSeed[seed]) seed += '_' + ++usedSeed[seed]\n else usedSeed[seed] = 1\n const front = isWindshield(q)\n const rearG = isRearGlass(q) && Math.abs(q.cen.z) < W * 0.2\n const who = front\n ? t('who.front_seats')\n : rearG\n ? t('who.rear_seats')\n : q.cen.x >\n (m.glasshouse && m.glasshouse.pillars && m.glasshouse.pillars.length\n ? Math.max.apply(null, m.glasshouse.pillars)\n : (F + R) / 2)\n ? q.cen.z < 0\n ? t('who.driver')\n : t('who.passenger')\n : t(q.cen.z < 0 ? 'who.rear_left' : 'who.rear_right')\n add(id, n, 'glass', q.bb.clone().expandByScalar(0.04), {\n glass: [q.g],\n fxKey: front ? 'windshield' : 'glass',\n who: who,\n tags: front ? ['windshield'] : [],\n seedId: seed,\n })\n })\n return\n }\n const groups: any = { f: [], l: [], r: [], b: [] }\n info.forEach(function (q: any) {\n const k =\n isWindshield(q) || (Math.abs(q.cen.z) < W * 0.25 && q.cen.x > (F + R) / 2)\n ? 'f'\n : Math.abs(q.cen.z) < W * 0.25\n ? 'b'\n : q.cen.z < 0\n ? 'l'\n : 'r'\n groups[k].push(q)\n })\n ;[\n ['f', 'windshield', 'windshield', 'who.front_seats', 'glass_front', 'vidros_f'],\n ['l', 'glass_left', 'glass', 'who.left_side', 'glass_left', 'vidros_e'],\n ['r', 'glass_right', 'glass', 'who.right_side', 'glass_right', 'vidros_d'],\n ['b', 'rear_window', 'glass', 'who.rear_seats', 'glass_rear', 'vidros_t'],\n ].forEach(function (G) {\n const L2 = groups[G[0]]\n if (!L2.length) return\n const bb = new THREE.Box3()\n L2.forEach(function (q: any) {\n bb.union(q.bb)\n })\n add(G[4], t('zones.' + G[1]), 'glass', bb.expandByScalar(0.04), {\n glass: L2.map(function (q: any) {\n return q.g\n }),\n fxKey: G[2],\n who: t(G[3]),\n tags: G[0] === 'f' ? ['windshield'] : [],\n seedId: G[5],\n })\n })\n }\n function lightZones() {\n lightsDone = true\n const G: any = {}\n c.lights.forEach(function (Lt: any) {\n const cen = I.lightCenter(c, Lt, inv)\n const k = Lt.kind === 'taillight' ? 'taillight' : 'headlight'\n const s = Math.abs(cen.z) < W * 0.12 ? 'center' : cen.z < 0 ? 'left' : 'right'\n const key = k + '_' + s\n ;(G[key] || (G[key] = [])).push(Lt)\n })\n Object.keys(G).forEach(function (key) {\n const p = key.split('_')\n const n =\n p[1] === 'center'\n ? p[0] === 'headlight'\n ? t('zones.light_bar_front')\n : fam === 'bike'\n ? t('zones.taillight')\n : t('zones.light_bar_rear')\n : t(p[0] === 'headlight' ? 'zones.headlight' : 'zones.taillight_side', { s: p[1] === 'left' ? -1 : 1 })\n if (fam === 'bike' && p[0] === 'headlight') return /* the motorcycle headlight sits in the fairing */\n /* lights on the same side that are far apart (roof light, trunk taillight) become separate zones, so the box does not cover half the vehicle */\n const cl2: any = []\n const split = fam === 'car' || fam === 'heavy' || fam === 'military'\n G[key].forEach(function (Lt: any) {\n if (!split) {\n if (!cl2.length) cl2.push({ L: [], bb: new THREE.Box3() })\n cl2[0].L.push(Lt)\n cl2[0].bb.union(I.lightBoxOf(c, Lt, inv))\n return\n }\n const lb = I.lightBoxOf(c, Lt, inv)\n const q = cl2.find(function (k2: any) {\n return k2.bb.distanceToPoint(lb.getCenter(new V3())) < 0.7\n })\n if (q) {\n q.L.push(Lt)\n q.bb.union(lb)\n } else cl2.push({ L: [Lt], bb: lb.clone() })\n })\n cl2.sort(function (a2: any, b2: any) {\n return (p[0] === 'headlight' ? -1 : 1) * (a2.bb.max.x - b2.bb.max.x) || a2.bb.min.y - b2.bb.min.y\n })\n cl2.forEach(function (q: any, i: any) {\n add(i ? key + '_' + (i + 1) : key, i ? n + ' (' + (i + 1) + ')' : n, 'light', q.bb.expandByScalar(0.03), {\n lights: q.L,\n fxKey: p[0],\n seedId: legacyLightId(p[0], p[1], i),\n })\n })\n })\n }\n function wheelZones(byAxle: any) {\n wheelsDone = true\n if (!WH) return\n const ws = WH.list\n if (byAxle || ws.length > 6) {\n const ax: any = []\n ws.slice()\n .sort(function (a: any, b: any) {\n return b.position.x - a.position.x\n })\n .forEach(function (w: any) {\n const a = ax.find(function (q: any) {\n return Math.abs(q.x - w.position.x) < 0.75\n })\n if (a) a.w.push(w)\n else ax.push({ x: w.position.x, w: [w] })\n })\n ax.forEach(function (a: any, i: any) {\n const bb = new THREE.Box3()\n a.w.forEach(function (w: any) {\n bb.union(I.localBox(c, w, inv))\n })\n const n =\n ax.length === 1\n ? t('zones.wheels')\n : i === 0\n ? t('zones.wheels_axle_front')\n : i === ax.length - 1\n ? t('zones.wheels_axle_rear')\n : t('zones.wheels_axle_n', { n: i + 1 })\n add('wheels_axle_' + (i + 1), n, 'wheel', bb.expandByScalar(0.04), { wheels: a.w, fxKey: 'axle', seedId: 'rodas_eixo' + (i + 1) })\n })\n return\n }\n const used: any = {}\n ws.forEach(function (w: any) {\n const fr = w.position.x >= (WH.xf + WH.xr) / 2 ? 'front' : 'rear'\n const sd = Math.abs(w.position.z) < 0.08 ? 0 : w.position.z < 0 ? -1 : 1\n let n = sd ? t('zones.wheel_' + fr + '_side', { s: sd }) : t('zones.wheel_' + fr)\n let id = 'wheel_' + fr + (sd ? (sd < 0 ? '_left' : '_right') : '')\n let seed = 'roda_' + (fr === 'front' ? 'dianteira' : 'traseira') + (sd ? (sd < 0 ? '_esquerda' : '_direita') : '')\n if (used[id]) {\n id += '_' + ++used[id]\n seed += '_' + used[id]\n n += ' ' + used[id]\n } else used[id] = 1\n add(id, n, 'wheel', I.localBox(c, w, inv).expandByScalar(0.04), { wheels: [w], who: '', seedId: seed })\n })\n }\n function internal(kind2: any, n: any, fxKey: any, sz?: any) {\n const ps = I.partsOf(c, kind2)\n if (!ps.length) return null\n const p = ps[0].pos\n const s = sz || [0.42, 0.3, 0.4]\n return add(kind2, n, 'internal', [p.x - s[0], p.x + s[0], p.y - s[1], p.y + s[1], p.z - s[2], p.z + s[2]], {\n fxKey: fxKey || kind2,\n pos: p.clone(),\n sub: kind2,\n })\n }\n\n if (fam === 'car') {\n const gh = m.glasshouse && m.glasshouse.fb != null ? m.glasshouse : null\n const sb = 0.34\n const out = 0.25\n const fb = gh ? gh.fb : F - 0.3 * L\n const rb = gh && gh.rb != null ? gh.rb : R + 0.2 * L\n const xr = WH ? WH.xr : R + 0.25 * L\n const rr = WH ? WH.rr : 0.3\n const doorF = fb - 0.03\n const pil =\n gh && gh.pillars\n ? gh.pillars.slice().sort(function (a: any, b: any) {\n return b - a\n })\n : []\n const B = pil.length && pil[0] < doorF - 0.45 && pil[0] > rb + 0.2 ? pil[0] : Math.max(rb + 0.1, doorF - 1.1)\n const rearDoor = pil.length > 0 && pil[0] < doorF - 0.45 && B - Math.max(rb, xr) > 0.5\n const C = rearDoor ? Math.max(pil[1] != null && pil[1] < B - 0.4 ? pil[1] : rb, xr + rr * 0.2) : B\n const y0s = Math.max(0.03, cl - 0.12)\n const y1s = belt + 0.03\n const sideB = function (x0: any, x1: any, s: any, y0?: any, y1?: any) {\n return s < 0\n ? [x0, x1, y0 == null ? y0s : y0, y1 == null ? y1s : y1, -hw - out, -hw + sb]\n : [x0, x1, y0 == null ? y0s : y0, y1 == null ? y1s : y1, hw - sb, hw + out]\n }\n let bF = m.frontBumper && m.frontBumper.parent ? m.frontBumper : null\n let bR = m.rearBumper && m.rearBumper.parent ? m.rearBumper : null\n I.partsOf(c, 'bumper').forEach(function (p: any) {\n if (!p.obj || !p.obj.parent) return\n if (p.pos.x > (F + R) / 2) bF = bF || p.obj\n else bR = bR || p.obj\n })\n add('bumper_front', t('zones.bumper_front'), bF ? 'bumper' : 'panel', [F - 0.3, F + 0.25, -0.02, cl + 0.36, -hw - 0.2, hw + 0.2], {\n objs: bF ? [bF] : [],\n dir: [-1, 0, 0],\n fxKey: 'bumper',\n tags: ['front'],\n })\n if (c.hood && c.hood.piv && c.hood.x1 > (F + R) / 2) {\n const hb = I.localBox(c, c.hood.piv, inv)\n add(\n 'hood',\n t('zones.hood'),\n 'hood',\n [hb.min.x - 0.02, hb.max.x + 0.03, hb.min.y - 0.08, hb.max.y + 0.15, hb.min.z - 0.02, hb.max.z + 0.02],\n { objs: [c.hood.piv], dir: [0, -1, 0] },\n )\n } else\n add('hood', t('zones.hood'), 'panel', [fb + 0.02, F - 0.22, (cl + belt) / 2, belt + 0.2, -hw + 0.12, hw - 0.12], {\n dir: [0, -1, 0],\n fxKey: 'hood',\n })\n ;[-1, 1].forEach(function (s) {\n const e = s < 0 ? 'left' : 'right'\n if (F - 0.22 - doorF > 0.2)\n add('fender_front_' + e, t('zones.fender_front', { s }), 'panel', sideB(doorF, F - 0.22, s), { side: s, fxKey: 'fender' })\n add(\n 'door_front_' + e,\n t(rearDoor || pil.length ? 'zones.door_front' : 'zones.door', { s }),\n 'door',\n sideB(B, doorF, s, null, y1s),\n {\n side: s,\n hinge: 'front',\n mirror: true,\n who: t(s < 0 ? 'who.driver' : 'who.passenger'),\n },\n )\n if (rearDoor)\n add('door_rear_' + e, t('zones.door_rear', { s }), 'door', sideB(C, B, s), {\n side: s,\n hinge: 'front',\n who: t(s < 0 ? 'who.rear_left' : 'who.rear_right'),\n })\n if (C - (R + 0.22) > 0.22)\n add('side_rear_' + e, t('zones.side_rear', { s }), 'panel', sideB(R + 0.22, C, s), {\n side: s,\n fxKey: 'side_panel',\n who: t(m.bed ? 'who.cargo' : 'who.rear_seats'),\n })\n })\n if (gh && gh.roof)\n add(\n 'roof',\n t('zones.roof'),\n 'roof',\n [Math.min(rb, gh.rt) - 0.06, Math.max(fb, gh.ft) + 0.06, belt + 0.1, top + 0.15, -hw - 0.05, hw + 0.05],\n { dir: [0, -1, 0], alsoGlass: true },\n )\n else\n add('roof', t('zones.roof'), 'roof', [R + 0.25 * L, F - 0.35 * L, belt + 0.1, top + 0.15, -hw - 0.05, hw + 0.05], {\n dir: [0, -1, 0],\n alsoGlass: true,\n })\n if (m.bed) {\n const bx1 = Math.max(m.bed.x0, m.bed.x1)\n add('cargo_bed', t('zones.cargo_bed'), 'lid', [R - 0.15, bx1 + 0.04, cl - 0.05, belt + 0.2, -hw + sb - 0.02, hw - sb + 0.02], {\n dir: [1, 0, 0],\n fxKey: 'cargo_bed',\n hinge: 'down',\n tags: ['rear'],\n })\n } else {\n const tx1 = Math.max(R + 0.35, Math.min(rb + 0.12, R + 1.1))\n add(\n 'lid',\n t(rb - R > 0.7 ? 'zones.trunk_lid' : 'zones.tail_lid'),\n 'lid',\n [R - 0.15, tx1, cl + 0.3, belt + 0.22, -hw + 0.12, hw - 0.12],\n { dir: [1, 0, 0], hinge: 'up', tags: ['rear'] },\n )\n }\n add('bumper_rear', t('zones.bumper_rear'), bR ? 'bumper' : 'panel', [R - 0.25, R + 0.3, -0.02, cl + 0.36, -hw - 0.2, hw + 0.2], {\n objs: bR ? [bR] : [],\n dir: [1, 0, 0],\n fxKey: 'bumper',\n tags: ['rear'],\n })\n add('underbody', t('zones.underbody'), 'internal', [R, F, -0.05, cl + 0.06, -hw, hw], { fxKey: 'underbody', sub: 'underbody' })\n glassZones(false)\n lightZones()\n wheelZones(false)\n internal('engine', t(c.meta.bay && c.meta.bay.motor === 'electric' ? 'zones.engine_electric' : 'zones.engine'), 'engine')\n internal('radiator', t('zones.radiator'), 'radiator', [0.2, 0.25, 0.45])\n internal('fuel_tank', t('zones.fuel_tank'), 'fuel_tank', [0.35, 0.18, 0.4])\n internal('battery', t('zones.battery'), 'battery', [0.35, 0.2, 0.4])\n } else if (fam === 'bike') {\n const xf = WH ? WH.xf : F - 0.3\n const xrb = WH ? WH.xr : R + 0.3\n const rf2 = WH ? WH.rf : 0.3\n const wb = xf - xrb\n const bici = c.spec && c.spec.fuel === 'none'\n const wq = Math.max(0.36, hw + 0.05)\n const tb = top\n if (kind === 'quad') {\n add('fairing', t('zones.fairing'), 'part', [xf - 0.25, F + 0.12, rf2 * 1.2, tb - 0.08, -wq, wq], {\n fxKey: 'fairing',\n dir: [-1, 0, 0],\n })\n add('handlebar', t('zones.handlebar_levers'), 'part', [xf - 0.75, xf - 0.25, belt + 0.05, tb + 0.12, -wq, wq], {\n fxKey: 'handlebar',\n dir: [0, -1, 0],\n })\n add('fuel_tank', t('zones.tank'), 'part', [xrb + wb * 0.45, xf - 0.75, belt - 0.15, belt + 0.25, -0.25, 0.25], {\n fxKey: 'fuel_tank',\n dir: [0, -1, 0],\n seedId: 'tanque_moto',\n })\n add('seat', t('zones.seat_rack'), 'part', [R - 0.12, xrb + wb * 0.45, belt - 0.2, tb + 0.12, -wq, wq], {\n fxKey: 'seat',\n dir: [0, -1, 0],\n })\n } else if (bici) {\n add('handlebar', t('zones.handlebar'), 'part', [xf - 0.45, xf + 0.15, tb - 0.22, tb + 0.12, -0.4, 0.4], {\n fxKey: 'handlebar',\n dir: [0, -1, 0],\n })\n add('frame', t('zones.frame'), 'part', [xrb + rf2 * 0.6, xf - rf2 * 0.3, rf2 * 0.6, tb - 0.22, -0.12, 0.12], {\n fxKey: 'frame',\n dir: [0, 0, 1],\n })\n add('seat', t('zones.seat_rack'), 'part', [R - 0.1, xrb + rf2 * 0.6, rf2 * 1.4, tb + 0.12, -0.3, 0.3], {\n fxKey: 'seat',\n dir: [0, -1, 0],\n })\n } else {\n add('fairing', t('zones.fairing'), 'part', [xf - 0.3, F + 0.12, rf2 * 1.5, tb - 0.2, -0.38, 0.38], {\n fxKey: 'fairing',\n dir: [-1, 0, 0],\n })\n add('handlebar', t('zones.handlebar_levers'), 'part', [xf - 0.6, xf + 0.05, tb - 0.2, tb + 0.15, -0.55, 0.55], {\n fxKey: 'handlebar',\n dir: [0, -1, 0],\n })\n add('fuel_tank', t('zones.tank'), 'part', [xrb + wb * 0.52, xf - 0.28, belt - 0.12, tb - 0.2, -0.3, 0.3], {\n fxKey: 'fuel_tank',\n dir: [0, -1, 0],\n seedId: 'tanque_moto',\n })\n add('seat', t('zones.seat_tail'), 'part', [R - 0.12, xrb + wb * 0.52, belt - 0.2, tb - 0.15, -0.3, 0.3], {\n fxKey: 'seat',\n dir: [0, -1, 0],\n })\n }\n if (!bici) {\n const ex = m.exhaust\n const es = ex && ex.z < 0 ? -1 : 1\n add('engine', t('zones.engine'), 'part', [xrb + wb * 0.3, xf - wb * 0.22, 0.12, belt - 0.12, -0.24, 0.24], {\n fxKey: 'engine',\n dir: [0, 0, 1],\n sub: 'engine',\n })\n add(\n 'exhaust',\n t('zones.exhaust'),\n 'part',\n es > 0 ? [R - 0.25, xrb + wb * 0.45, 0.08, belt - 0.12, 0.1, 0.5] : [R - 0.25, xrb + wb * 0.45, 0.08, belt - 0.12, -0.5, -0.1],\n { fxKey: 'exhaust', dir: [0, 0, -es], side: es },\n )\n }\n glassZones(true)\n lightZones()\n wheelZones(false)\n } else if (fam === 'heavy') {\n const bus = kind === 'bus'\n const tractor = kind === 'tractor'\n const sbH = 0.42\n const cabL = m.cabLength || (bus ? 2.0 : tractor ? 0 : 2.3)\n if (tractor) {\n const xc = (WH ? WH.xr : R + 0.6) + 0.35\n add('front', t('zones.grille_front'), 'panel', [F - 0.4, F + 0.25, 0.1, belt + 0.3, -hw * 0.6, hw * 0.6], {\n dir: [-1, 0, 0],\n tags: ['front'],\n })\n add(\n 'tractor_hood',\n t('zones.engine_hood'),\n c.hood && c.hood.piv ? 'hood' : 'panel',\n [xc + 0.3, F - 0.4, belt - 0.25, belt + 0.45, -hw * 0.45, hw * 0.45],\n { dir: [0, -1, 0], fxKey: 'hood', objs: c.hood && c.hood.piv ? [c.hood.piv] : [] },\n )\n ;[-1, 1].forEach(function (s) {\n add(\n 'fender_rear_' + (s < 0 ? 'left' : 'right'),\n t('zones.fender_rear', { s }),\n 'panel',\n s < 0 ? [R - 0.1, xc + 0.5, 0.6, top - 0.6, -hw - 0.2, -hw + 0.55] : [R - 0.1, xc + 0.5, 0.6, top - 0.6, hw - 0.55, hw + 0.2],\n { side: s, fxKey: 'fender' },\n )\n })\n /* operator station: seat, steering wheel and platform (not the canopy, which is the roll-bar zone) */\n const stp = c.seatTops[0]\n const sy = stp ? stp.y : belt + 0.2\n add('operator_station', t('zones.operator_station'), 'part', [R - 0.1, xc + 0.5, sy - 0.45, sy + 0.75, -hw * 0.45, hw * 0.45], {\n dir: [0, -1, 0],\n fxKey: 'cab',\n who: t('who.tractor_driver'),\n noFlap: true,\n })\n } else {\n const cx0 = F - cabL\n add(\n 'cab_front',\n t(bus ? 'zones.bus_front' : 'zones.cab_front'),\n 'panel',\n [F - 0.45, F + 0.25, Math.max(0.05, cl - 0.1), top + 0.1, -hw - 0.1, hw + 0.1],\n { dir: [-1, 0, 0], fxKey: 'cab', who: t('who.driver'), tags: ['front'] },\n )\n ;[-1, 1].forEach(function (s) {\n const e = s < 0 ? 'left' : 'right'\n add(\n 'cab_' + e,\n t(bus ? 'zones.bus_front_side' : 'zones.cab_side', { s }),\n 'panel',\n s < 0\n ? [cx0, F - 0.45, Math.max(0.05, cl - 0.1), top + 0.1, -hw - 0.25, -hw + sbH]\n : [cx0, F - 0.45, Math.max(0.05, cl - 0.1), top + 0.1, hw - sbH, hw + 0.25],\n { side: s, fxKey: 'cab', who: t(s < 0 ? 'who.driver' : bus ? 'who.boarding_door' : 'who.helper') },\n )\n })\n const big = bus\n ? t('zones.body_saloon')\n : m.bigBlast || matchers.tank.test((c.spec && c.spec.name) || '')\n ? t('zones.body_tank')\n : m.bodyLabel || t(m.bodyKind === 'body' ? 'zones.body_body' : 'zones.body_box')\n ;[-1, 1].forEach(function (s) {\n add(\n 'body_' + (s < 0 ? 'left' : 'right'),\n t('zones.body_side', { label: big, s }),\n 'panel',\n s < 0\n ? [R + 0.4, cx0, Math.max(0.05, cl - 0.1), top + 0.15, -hw - 0.25, -hw + sbH]\n : [R + 0.4, cx0, Math.max(0.05, cl - 0.1), top + 0.15, hw - sbH, hw + 0.25],\n { side: s, fxKey: 'side_panel', who: t(bus ? 'who.seated_side' : 'who.cargo') },\n )\n })\n add(\n 'body_rear',\n t('zones.body_rear', { label: big }),\n 'panel',\n [R - 0.25, R + 0.4, Math.max(0.05, cl - 0.1), top + 0.15, -hw - 0.1, hw + 0.1],\n {\n dir: [1, 0, 0],\n fxKey: bus ? 'side_panel' : 'lid',\n who: t(bus ? 'who.back_seats' : 'who.cargo'),\n tags: ['rear'],\n },\n )\n }\n add('chassis', t('zones.chassis'), 'internal', [R, F, -0.05, cl + 0.12, -hw, hw], { fxKey: 'chassis', sub: 'underbody' })\n glassZones(true)\n lightZones()\n wheelZones(true)\n internal('engine', t('zones.engine'), 'engine', [0.6, 0.45, 0.5])\n internal('fuel_tank', t(bus ? 'zones.diesel_tank' : 'zones.fuel_tank'), 'fuel_tank', [0.4, 0.3, 0.35])\n } else if (fam === 'military') {\n const sbm = 0.45\n const lag = I.partsOf(c, 'track')\n const hb2 = (m.hullTop || belt) + 0.12\n add('armor_front', t('zones.armor_front'), 'panel', [F - 0.65, F + 0.3, Math.max(0.05, cl - 0.15), hb2, -hw - 0.2, hw + 0.2], {\n dir: [-1, 0, 0],\n fxKey: 'armor',\n tags: ['front'],\n })\n ;[-1, 1].forEach(function (s) {\n add(\n 'armor_' + (s < 0 ? 'left' : 'right'),\n t('zones.armor_side', { s }),\n 'panel',\n s < 0\n ? [R + 0.45, F - 0.65, Math.max(0.05, cl - 0.15), hb2, -hw - 0.3, -hw + sbm]\n : [R + 0.45, F - 0.65, Math.max(0.05, cl - 0.15), hb2, hw - sbm, hw + 0.3],\n { side: s, fxKey: 'armor', who: t('who.crew_side') },\n )\n })\n add('armor_rear', t('zones.armor_rear'), 'panel', [R - 0.3, R + 0.45, Math.max(0.05, cl - 0.15), hb2, -hw - 0.2, hw + 0.2], {\n dir: [1, 0, 0],\n fxKey: 'armor',\n tags: ['rear'],\n })\n /* weapon: the longest mesh in x above the belt line (barrel) */\n let gun: any = null\n let gl2 = 0\n c.vehicle.traverse(function (o: any) {\n if (!o.isMesh || o.userData.decal) return\n const bb = I.localBox(c, o, inv)\n const sx = bb.max.x - bb.min.x\n const sy = bb.max.y - bb.min.y\n const sz = bb.max.z - bb.min.z\n if (bb.min.y > belt - 0.1 && sx > 0.7 && sx > 5 * Math.max(sy, sz) && sx > gl2) {\n gl2 = sx\n gun = { o: o, bb: bb }\n }\n })\n if (gun)\n add('weapon', t(gl2 > 2 ? 'zones.cannon' : 'zones.weapon'), 'part', gun.bb.clone().expandByScalar(0.08), {\n objs: [gun.o],\n fxKey: 'weapon',\n dir: [0, -1, 0],\n anchor: [gun.bb.min.x, (gun.bb.min.y + gun.bb.max.y) / 2, (gun.bb.min.z + gun.bb.max.z) / 2],\n })\n add('turret', t('zones.turret'), 'roof', [R + 0.35, F - 0.3, hb2, top + 0.25, -hw + 0.12, hw - 0.12], {\n dir: [0, -1, 0],\n fxKey: 'turret',\n alsoGlass: true,\n })\n if (lag.length)\n lag.forEach(function (p: any) {\n const s = p.pos.z < 0 ? -1 : 1\n const bb = I.localBox(c, p.obj, inv)\n const ws2 = c.wheels.filter(function (w: any) {\n return Math.sign(w.position.z) === s\n })\n const objs = [p.obj]\n c.spin.forEach(function (sp: any) {\n if (sp.track && Math.sign(sp.o.position.z) === s) objs.push(sp.o)\n })\n add('track_' + (s < 0 ? 'left' : 'right'), t('zones.track', { s }), 'part', bb.expandByScalar(0.05), {\n objs: objs,\n wheels: ws2,\n fxKey: 'track',\n side: s,\n track: p.obj,\n dir: [0, 0, -s],\n })\n })\n else if (WH)\n [-1, 1].forEach(function (s) {\n const ws3 = WH.list.filter(function (w: any) {\n return Math.sign(w.position.z) === s\n })\n if (!ws3.length) return\n const bb = new THREE.Box3()\n ws3.forEach(function (w: any) {\n bb.union(I.localBox(c, w, inv))\n })\n add('wheels_' + (s < 0 ? 'left' : 'right'), t('zones.wheels_side', { s }), 'wheel', bb.expandByScalar(0.04), {\n wheels: ws3,\n fxKey: 'axle',\n side: s,\n })\n })\n wheelsDone = true\n glassZones(true)\n lightZones()\n internal('engine', t('zones.engine'), 'engine', [0.6, 0.4, 0.55])\n } else if (fam === 'boat') {\n const bowL = 0.28 * L\n const sternL = 0.2 * L\n add('bow', t('zones.bow'), 'panel', [F - bowL, F + 0.3, cl - 0.4, belt + 0.25, -hw - 0.3, hw + 0.3], {\n dir: [-1, 0, 0],\n fxKey: 'hull',\n tags: ['front'],\n anyMesh: true,\n })\n ;[-1, 1].forEach(function (s) {\n add(\n 'side_' + (s < 0 ? 'left' : 'right'),\n t(s < 0 ? 'zones.port_side' : 'zones.starboard_side'),\n 'panel',\n s < 0\n ? [R + sternL, F - bowL, cl - 0.4, belt + 0.06, -hw - 0.35, -hw + 0.4]\n : [R + sternL, F - bowL, cl - 0.4, belt + 0.06, hw - 0.4, hw + 0.35],\n { side: s, fxKey: 'hull', who: t('who.boat_side'), anyMesh: true },\n )\n })\n add('stern', t('zones.stern'), 'panel', [R - 0.25, R + sternL, cl - 0.4, belt + 0.35, -hw - 0.3, hw + 0.3], {\n dir: [1, 0, 0],\n fxKey: 'hull',\n tags: ['rear'],\n anyMesh: true,\n })\n add('deck', t('zones.deck'), 'roof', [R + sternL, F - bowL, belt + 0.06, top + 0.4, -hw + 0.4, hw - 0.4], {\n dir: [0, -1, 0],\n fxKey: 'deck',\n alsoGlass: true,\n })\n const pp = I.partsOf(c, 'stern')[0]\n if (pp && pp.obj) {\n const pb = I.localBox(c, pp.obj, inv)\n add('engine', t('zones.outboard_engine'), 'part', pb.expandByScalar(0.05), {\n objs: [pp.obj],\n fxKey: 'engine',\n dir: [1, 0, 0],\n sub: 'engine',\n pos: pp.pos.clone(),\n })\n } else internal('engine', t('zones.engine'), 'engine', [0.5, 0.35, 0.45])\n internal('fuel_tank', t('zones.fuel_tank'), 'fuel_tank', [0.35, 0.25, 0.35])\n glassZones(true)\n lightZones()\n wheelZones(false)\n } else if (fam === 'plane') {\n const fw = (m.fuselageWidth || 1.2) / 2\n const span = W / 2\n const wingBB = new THREE.Box3()\n const tailX = R + Math.min(2.0, 0.28 * L)\n c.vehicle.traverse(function (o: any) {\n if (!o.isMesh || o.userData.decal) return\n const bb = I.localBox(c, o, inv)\n if (Math.max(Math.abs(bb.min.z), Math.abs(bb.max.z)) > Math.max(2.0, span * 0.45) && bb.min.x > tailX) wingBB.union(bb)\n })\n if (wingBB.isEmpty()) wingBB.set(new V3(F - 3.0, belt, -span), new V3(F - 1.5, top, span))\n const hp = I.partsOf(c, 'propeller')[0]\n add(\n 'nose',\n t(hp ? 'zones.nose_propeller' : 'zones.nose_engine'),\n 'panel',\n [F - 1.25, F + 0.6, cl - 0.8, top + 0.2, -fw - 0.5, fw + 0.5],\n {\n dir: [-1, 0, 0],\n fxKey: 'nose',\n objs: hp && hp.obj ? [hp.obj] : [],\n tags: ['front'],\n anyMesh: true,\n },\n )\n add('cab', t('zones.cabin_glass'), 'panel', [wingBB.min.x - 0.4, F - 1.25, belt - 0.4, top + 0.15, -fw - 0.12, fw + 0.12], {\n dir: [0, 0, 1],\n fxKey: 'aircraft_cabin',\n who: t('who.pilot'),\n anyMesh: true,\n })\n ;[-1, 1].forEach(function (s) {\n add(\n 'wing_' + (s < 0 ? 'left' : 'right'),\n t('zones.wing', { s }),\n 'panel',\n s < 0\n ? [wingBB.min.x - 0.15, wingBB.max.x + 0.15, wingBB.min.y - 0.25, wingBB.max.y + 0.25, -span - 0.3, -fw - 0.18]\n : [wingBB.min.x - 0.15, wingBB.max.x + 0.15, wingBB.min.y - 0.25, wingBB.max.y + 0.25, fw + 0.18, span + 0.3],\n { side: s, dir: [0, -1, 0], fxKey: 'wing', cutAll: true, anyMesh: true },\n )\n })\n add('fuselage', t('zones.rear_fuselage'), 'panel', [tailX, wingBB.min.x - 0.4, cl - 0.2, top, -fw - 0.12, fw + 0.12], {\n dir: [0, 0, 1],\n fxKey: 'panel',\n anyMesh: true,\n })\n add('tail', t('zones.tail'), 'panel', [R - 0.4, tailX, 0, top + 0.6, -span * 0.5, span * 0.5], {\n dir: [0, -1, 0],\n fxKey: 'tail',\n cutAll: true,\n anyMesh: true,\n tags: ['rear'],\n })\n const gear = c.wheels.filter(function (w: any) {\n return w.parent\n })\n if (gear.length) {\n /* legs and fairings of the wheels (low parts near each wheel) belong to the gear: they fold and disappear together */\n const gb = new THREE.Box3()\n const gobj: any = []\n gear.forEach(function (w: any) {\n gb.union(I.localBox(c, w, inv))\n })\n c.vehicle.children.forEach(function (o: any) {\n if (!o.isMesh || o.userData.decal || o.userData.glass || c.wheels.indexOf(o) >= 0) return\n const bb = I.localBox(c, o, inv)\n const cen = bb.getCenter(new V3())\n const sz = bb.getSize(new V3())\n if (bb.isEmpty() || cen.y > cl * 0.85 || bb.max.y > cl + 0.45 || Math.max(sz.x, sz.y, sz.z) > 1.6) return\n if (\n !gear.some(function (w: any) {\n return Math.abs(w.position.x - cen.x) < 0.7 && Math.abs(w.position.z - cen.z) < 0.9\n })\n )\n return\n gobj.push(o)\n gb.union(bb)\n })\n add('landing_gear', t('zones.landing_gear'), 'wheel', gb.expandByScalar(0.06), { wheels: gear, objs: gobj, fxKey: 'landing_gear' })\n }\n add(\n 'fuel_tanks',\n t('zones.wing_tanks'),\n 'internal',\n [wingBB.min.x, wingBB.max.x, wingBB.min.y - 0.1, wingBB.max.y + 0.1, -span * 0.55, span * 0.55],\n { fxKey: 'fuel_tank', sub: 'fuel_tank', pos: new V3((wingBB.min.x + wingBB.max.x) / 2, wingBB.min.y, -span * 0.35) },\n )\n glassZones(true)\n glassDone = true\n lightZones()\n wheelsDone = true\n Z = Z.filter(function (z: any) {\n return z.type !== 'glass'\n }) /* the aircraft glass stays in the cabin */\n } else if (fam === 'heli') {\n const fw2 = (m.fuselageWidth || 1.3) / 2\n const ft2 = m.fuselageTop || Math.min(top - 0.5, belt + 1.0)\n const rp = I.partsOf(c, 'rotor')[0]\n const rt = I.partsOf(c, 'tail_rotor')[0]\n add('nose', t('zones.nose_bubble'), 'panel', [F - 1.05, F + 0.3, cl - 0.25, ft2 + 0.1, -fw2 - 0.2, fw2 + 0.2], {\n dir: [-1, 0, 0],\n fxKey: 'aircraft_cabin',\n who: t('who.pilot'),\n tags: ['front'],\n anyMesh: true,\n })\n add('cab', t('zones.cabin'), 'panel', [F - Math.min(3.2, 0.36 * L), F - 1.05, cl - 0.25, ft2 + 0.1, -fw2 - 0.25, fw2 + 0.25], {\n dir: [0, 0, 1],\n fxKey: 'cab',\n who: t('who.passengers'),\n anyMesh: true,\n })\n add('tail_cone', t('zones.tail_cone'), 'panel', [R + 1.0, F - Math.min(3.2, 0.36 * L), cl, ft2 + 0.6, -fw2 - 0.3, fw2 + 0.3], {\n dir: [0, -1, 0],\n fxKey: 'tail_cone',\n cutAll: true,\n anyMesh: true,\n tags: ['rear'],\n })\n if (rp && rp.obj)\n add('rotor', t('zones.main_rotor'), 'part', I.localBox(c, rp.obj, inv).expandByScalar(0.05), {\n objs: [rp.obj],\n fxKey: 'rotor',\n dir: [0, -1, 0],\n kindPart: 'rotor',\n })\n if (rt && rt.obj)\n add('tail_rotor', t('zones.tail_rotor'), 'part', I.localBox(c, rt.obj, inv).expandByScalar(0.05), {\n objs: [rt.obj],\n fxKey: 'tail_rotor',\n dir: [0, 0, 1],\n kindPart: 'tail_rotor',\n })\n const gear2 = c.wheels.filter(function (w: any) {\n return w.parent\n })\n add(\n 'skids',\n t(gear2.length ? 'zones.landing_gear' : 'zones.skids'),\n gear2.length ? 'wheel' : 'part',\n [R + 1.0, F, -0.05, cl + 0.05, -W / 2 - 0.2, W / 2 + 0.2],\n { wheels: gear2, fxKey: gear2.length ? 'landing_gear' : 'skid', dir: [0, 1, 0] },\n )\n add('engine', t('zones.engine_transmission'), 'internal', [F - Math.min(3.4, 0.4 * L), F - 1.4, ft2 - 0.35, ft2 + 0.5, -fw2, fw2], {\n fxKey: 'engine',\n sub: 'engine',\n })\n glassZones(true)\n lightZones()\n wheelsDone = true\n Z = Z.filter(function (z: any) {\n return z.type !== 'glass'\n }) /* glass goes to the nose and the cabin */\n } else {\n /* generic: four sides and top */\n add('front', t('zones.front'), 'panel', [F - 0.4, F + 0.3, 0, top, -hw - 0.2, hw + 0.2], { dir: [-1, 0, 0], tags: ['front'] })\n ;[-1, 1].forEach(function (s) {\n add(\n 'side_' + (s < 0 ? 'left' : 'right'),\n t('zones.side', { s }),\n 'panel',\n s < 0 ? [R + 0.4, F - 0.4, 0, top, -hw - 0.3, -hw + 0.4] : [R + 0.4, F - 0.4, 0, top, hw - 0.4, hw + 0.3],\n { side: s },\n )\n })\n add('rear', t('zones.rear'), 'panel', [R - 0.3, R + 0.4, 0, top, -hw - 0.2, hw + 0.2], { dir: [1, 0, 0], tags: ['rear'] })\n add('top', t('zones.top'), 'roof', [R + 0.4, F - 0.4, top - 0.4, top + 0.2, -hw + 0.4, hw - 0.4], { dir: [0, -1, 0] })\n }\n if (!glassDone) glassZones(true)\n if (!lightsDone) lightZones()\n if (!wheelsDone) wheelZones(false)\n return Z\n }\n\n Object.assign(I, { autoZones })\n}\n","/** Applies zone health to a built vehicle: bands, decals, owned parts and scenarios. */\nimport type { Kit } from './types'\nimport { clamp, rng, strHash } from './util'\nimport { SEED_SALTS, legacyZoneId } from './legacy-seeds'\n\nexport function installZoneApply(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n const { RUST, crease } = I\n\n /* ---- applying all zones ---- */\n function fadePaint(c: any) {\n const cache2 = new Map()\n c.vehicle.traverse(function (o: any) {\n if (!o.isMesh || !c.paints || !c.paints.has(o.material)) return\n let nm2 = cache2.get(o.material)\n if (!nm2) {\n nm2 = o.material.clone()\n const hsl: any = {}\n nm2.color.getHSL(hsl)\n nm2.color.setHSL(hsl.h, hsl.s * 0.45, Math.min(0.75, hsl.l * 0.9 + 0.08))\n nm2.color.lerp(RUST, 0.12)\n nm2.roughness = 0.96\n nm2.metalness = 0.05\n cache2.set(o.material, nm2)\n }\n o.material = nm2\n })\n }\n function abandonFx(c: any) {\n fadePaint(c)\n I.hurtEngine(c, 0.45)\n const inv = I.worldInverseOf(c)\n ;(c.zones || []).forEach(function (z: any) {\n if (z.internal || ['panel', 'door', 'roof', 'lid', 'hood', 'bumper'].indexOf(z.type) < 0) return\n c.rand = rng(strHash((c.seedKey || c.key) + SEED_SALTS.rust + legacyZoneId(z)))\n I.zoneDecals(c, z, { rust: 3 }, I.zoneCands(c, z, inv))\n })\n }\n function burntFx(c: any) {\n I.burnAll(c)\n const m = c.meta\n const ep = I.enginePos(c)\n I.hurtEngine(c, 0)\n kit.addEmitter(c, ep.clone().add(new V3(0, 0.15, 0)), 'fire', { rate: 5, s: 0.6 })\n kit.addEmitter(c, new V3(((m.front || 1) + (m.rear || -1)) / 2, (m.clearance || 0.3) + 0.35, 0), 'fire', { rate: 4, s: 0.55 })\n kit.addEmitter(c, ep.clone().add(new V3(0, 0.9, 0)), 'black', { rate: 3, s: 1.3 })\n c.emitters = c.emitters.filter(function (e: any) {\n return e.kind !== 'exhaust'\n })\n c.burnt = true\n }\n function settleDrops(c: any) {\n const D = c.zoneDrops\n if (!D || !D.length || (['boat', 'plane', 'heli'].indexOf(c.meta.kind) >= 0 && c.meta.kind !== 'plane')) return\n const WH = I.wheelInfo(c)\n if (!WH) return\n const P = function (w: any) {\n return w.userData.gpos || w.position\n } /* a wheel that went inside a pivot (broken gear) keeps its original position */\n const xs = WH.list.map(function (w: any) {\n return P(w).x\n })\n const zs2 = WH.list.map(function (w: any) {\n return P(w).z\n })\n const dAt = function (w: any) {\n const q = D.filter(function (e: any) {\n return Math.abs(e.x - P(w).x) < 0.01 && Math.abs(e.z - P(w).z) < 0.01\n })\n return q.length\n ? Math.max.apply(\n null,\n q.map(function (e: any) {\n return e.d\n }),\n )\n : 0\n }\n const xc =\n xs.reduce(function (s: any, v: any) {\n return s + v\n }, 0) / xs.length\n const zc =\n zs2.reduce(function (s: any, v: any) {\n return s + v\n }, 0) / zs2.length\n let sxx = 0\n let sxz = 0\n let szz = 0\n let sxd = 0\n let szd = 0\n let sd = 0\n WH.list.forEach(function (w: any) {\n const x = P(w).x - xc\n const z2 = P(w).z - zc\n const d = -dAt(w)\n sxx += x * x\n sxz += x * z2\n szz += z2 * z2\n sxd += x * d\n szd += z2 * d\n sd += d\n })\n const det = sxx * szz - sxz * sxz\n let A = 0\n let Bz = 0\n if (Math.abs(det) > 1e-6) {\n A = (sxd * szz - szd * sxz) / det\n Bz = (szd * sxx - sxd * sxz) / det\n } else if (sxx > 1e-6) A = sxd / sxx\n const t = sd / WH.list.length\n /* Δy(x, z) = A·x + Bz·z + (t − A·xc − Bz·zc): rotation.z gives A·x and rotation.x gives −sin(b)·z */\n c.vehicle.rotation.z += Math.atan(A)\n c.vehicle.rotation.x += -Math.asin(clamp(Bz, -0.5, 0.5))\n c.vehicle.position.y += t - A * xc - Bz * zc\n }\n kit.applyZones = function (c: any, zs: any) {\n const Zs = I.zonesOf(c)\n zs = zs || {}\n const H = zs.health || {}\n const FL = zs.flags || {}\n c.zoneState = { health: {}, flags: Object.assign({}, FL) }\n Zs.forEach(function (z: any) {\n z.health = H[z.id] == null ? 100 : clamp(Math.round(H[z.id]), 0, 100)\n z.band = I.bandOf(z.health)\n c.zoneState.health[z.id] = z.health\n })\n const R0 = c.rand\n const dirty = new Set()\n let any = false\n c.zoneDrops = []\n c.zoneErrors = c.zoneErrors || []\n Zs.forEach(function (z: any) {\n if (z.health >= 100) return\n any = true\n c.rand = rng(strHash((c.seedKey || c.key) + '|' + legacyZoneId(z) + '|' + z.band))\n try {\n const b = z.band\n if (z.type === 'wheel' && z.fxKey === 'landing_gear' && c.meta.kind === 'plane') I.gearBand(c, z, b)\n else if (z.type === 'wheel')\n z.wheels.forEach(function (w: any) {\n I.wheelBand(c, z, w, b)\n })\n else if (z.type === 'glass')\n z.glass.forEach(function (g: any) {\n I.glassBand(c, z, g, b)\n })\n else if (z.type === 'light')\n z.lights.forEach(function (Lt: any) {\n I.lightBand(c, z, Lt, b)\n })\n else if (z.type === 'internal') I.internalBand(c, z, b)\n else if (z.type === 'hood') I.hoodBand(c, z, b, dirty)\n else if (z.type === 'bumper') I.bumperBand(c, z, b, dirty)\n else if (z.type === 'part') I.partBand(c, z, b, dirty)\n else I.panelBand(c, z, b, dirty)\n if (z.type !== 'glass')\n z.glass.forEach(function (g: any) {\n if (b === 1 && g !== z.glass[0]) return\n I.glassBand(c, z, g, b === 4 ? 4 : b)\n })\n if (z.type !== 'light')\n z.lights.forEach(function (Lt: any) {\n I.lightBand(c, z, Lt, b)\n })\n if (z.type !== 'wheel' && !z.track)\n z.wheels.forEach(function (w: any) {\n I.wheelBand(c, z, w, b)\n })\n if (z.sub && z.type !== 'internal' && b >= 2)\n I.internalBand(c, Object.assign({}, z, { pos: z.pos || I.boxCenter(z.box) }), Math.min(b, 3))\n if (typeof z.onBand === 'function') z.onBand(c, b, z, kit)\n } catch (e: any) {\n c.zoneErrors.push(z.id + ': ' + (e && e.message))\n }\n })\n dirty.forEach(function (msh: any) {\n const g = msh.geometry\n if (g.userData.crease || !g.index) crease(g, 42)\n else g.computeVertexNormals()\n g.computeBoundingSphere()\n g.computeBoundingBox()\n })\n try {\n settleDrops(c)\n } catch (e: any) {\n c.zoneErrors.push('settling: ' + e.message)\n }\n c.rand = rng(strHash((c.seedKey || c.key) + SEED_SALTS.scenario))\n const flagList = Object.keys(FL)\n .filter(function (k) {\n return FL[k] && kit.flagEffects[k]\n })\n .sort(function (x, y) {\n return kit.flagEffects[x].order - kit.flagEffects[y].order\n })\n flagList.forEach(function (k) {\n kit.flagEffects[k].apply(c, FL, kit)\n })\n if (\n any ||\n FL.flipped ||\n flagList.some(function (k) {\n return kit.flagEffects[k].settle\n })\n ) {\n c.rand = rng(strHash((c.seedKey || c.key) + SEED_SALTS.settle))\n kit.settle(c, 2.5)\n }\n if (FL.flipped && !c.flipped) {\n c.rand = rng(strHash((c.seedKey || c.key) + SEED_SALTS.rollover))\n if (c.hood) {\n c.hood.target = 0\n }\n if (kit.roll(c, 1)) {\n for (let i = 0; i < 150 && !c.flipped; i++) kit.tick(c, 1 / 30)\n kit.settle(c, 1.5)\n }\n }\n if (any) I.updateFluids(c, 20)\n c.rand = R0\n return c.zoneState\n }\n\n Object.assign(I, { fadePaint, abandonFx, burntFx, settleDrops })\n}\n","/** Damage scenarios and the scenario registry. */\nimport type { Kit } from './types'\nimport { clamp, rng, strHash } from './util'\n\nexport function installScenarios(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n\n /* ---- ready-made scenarios: registered by the game plugin ----\n kit.scenario({ id, name, init?(X), zone(z, X) }) registers a scenario. In zone(), X.set(z, health) stores the zone health and X.flags receives\n flags (flipped, burnt, abandoned or those of kit.flagEffects). X carries: c, meta, front, rear, length, width, clearance, top, rand (deterministic random),\n center (centre of the current zone), isWindshield (windshield zone), bodyTypes (bodywork types), clamp. Returns { health, flags, scenario }. */\n kit.scenarios = []\n kit.scenario = function (def: any) {\n if (!def || !def.id || typeof def.zone !== 'function') throw new Error('kit.scenario: id and zone(z, X) are required')\n const i = kit.scenarios.findIndex(function (s: any) {\n return s.id === def.id\n })\n if (i >= 0) kit.scenarios[i] = def\n else kit.scenarios.push(def)\n return def\n }\n /* visual effects of scenario flags: kit.flagEffects[name] = { order, settle, apply(c, flags, kit) } */\n kit.flagEffects = {}\n /* generic ageing: faded paint, rust */\n kit.flagEffects.abandoned = { order: 20, settle: true, apply: I.abandonFx }\n /* fire and soot */\n kit.flagEffects.burnt = { order: 40, settle: true, apply: I.burntFx }\n const BODY_TYPES = { panel: 1, door: 1, roof: 1, lid: 1, hood: 1, bumper: 1 }\n kit.zoneScenario = function (c: any, name: any) {\n const Zs = I.zonesOf(c)\n const m = c.meta\n const F = m.front\n const R = m.rear\n const L = m.length || F - R\n const W = m.width || 1.7\n const cl = m.clearance || 0.3\n const top = m.top || 1.5\n const S = kit.scenarios.find(function (s: any) {\n return s.id === name || s.name === name\n })\n const sc = S ? S.id : name\n const health: Record<string, number> = {}\n const flags: any = {}\n const rand = rng(strHash((c.seedKey || c.key || '') + '|' + ((S && S.seedId) || sc)))\n function set(z: any, v: any) {\n health[z.id] = clamp(Math.round(v), 0, 100)\n }\n const X: any = {\n c: c,\n meta: m,\n front: F,\n rear: R,\n length: L,\n width: W,\n clearance: cl,\n top: top,\n rand: rand,\n set: set,\n flags: flags,\n health: health,\n bodyTypes: BODY_TYPES,\n clamp: clamp,\n center: null,\n isWindshield: false,\n }\n if (S) {\n if (S.init) S.init(X)\n Zs.forEach(function (z: any) {\n X.center = I.boxCenter(z.box)\n X.isWindshield = z.tags.indexOf('windshield') >= 0\n S.zone(z, X)\n })\n }\n return { health: health, flags: flags, scenario: sc }\n }\n /* overall health (weighted average) */\n kit.zoneOverall = function (c: any) {\n const Zs = I.zonesOf(c)\n let s = 0\n let w = 0\n Zs.forEach(function (z: any) {\n s += z.health * z.weight\n w += z.weight\n })\n let h = w ? Math.round(s / w) : 100\n /* floor by the worst structural zone: a destroyed or torn-off zone does not leave the vehicle \"Intact\" on average */\n const st = Zs.filter(function (z: any) {\n return !z.internal && z.type !== 'glass' && z.type !== 'light'\n })\n .map(function (z: any) {\n return z.health\n })\n .sort(function (a: any, b: any) {\n return a - b\n })\n if (st.length) {\n const w3 = st.slice(0, 3)\n const m3 =\n w3.reduce(function (a: any, b: any) {\n return a + b\n }, 0) / w3.length\n h = Math.min(h, Math.round(st[0] + 30), Math.round(m3 + 22))\n }\n const gl = Zs.filter(function (z: any) {\n return z.type === 'glass' || z.type === 'light'\n }).map(function (z: any) {\n return z.health\n })\n if (gl.length) h = Math.min(h, Math.round(Math.min.apply(null, gl) + 55))\n return { health: h, band: I.bandOf(h), name: kit.bands[I.bandOf(h)].name }\n }\n /* zone of point p (c.vehicle coordinates), with the optional mesh that was hit */\n kit.zoneAt = function (c: any, p: any, obj: any) {\n const Zs = I.zonesOf(c)\n const own = obj ? I.ownerOf(c, obj) : null\n if (own) return own\n let best: any = null\n Zs.forEach(function (z: any) {\n if (z.internal) return\n if (I.boxContains(z.box, p.x, p.y, p.z, 0.03) && (!best || I.boxVolume(z.box) < I.boxVolume(best.box))) best = z\n })\n if (best) return best\n let bd = 1e9\n Zs.forEach(function (z: any) {\n if (z.internal) return\n const d = I.boxDistance(z.box, p)\n if (d < bd) {\n bd = d\n best = z\n }\n })\n return best\n }\n /* impact at a point: takes health from the zones near the point, according to the force (0.3..1.4) */\n kit.zoneDamageAt = function (c: any, p: any, dir: any, force: any, obj: any) {\n const Zs = I.zonesOf(c)\n const main = kit.zoneAt(c, p, obj)\n const Rr = 0.35 + 0.35 * force\n const out: any = []\n Zs.forEach(function (z: any) {\n const d = z === main ? 0 : I.boxDistance(z.box, p)\n let dmg = 0\n if (z === main) dmg = force * 36\n else if (z.internal) {\n if (d < Rr * 0.6) dmg = force * 22 * (1 - d / (Rr * 0.6))\n } else if (d < Rr) dmg = force * 26 * Math.pow(1 - d / Rr, 1.3)\n if (dmg >= 1) out.push({ id: z.id, name: z.name, damage: Math.round(dmg) })\n })\n return { main: main ? main.id : null, list: out }\n }\n /* point and direction of the impacts by side (Front, Rear, Left side and Right side buttons) */\n kit.zonePoint = function (c: any, zone: any) {\n const m = c.meta\n const mid = m.clearance + (m.bodyHeight || 0.6) * 0.5\n let p\n let dir\n if (zone === 'front') {\n p = new V3(m.front, mid, m.width * 0.15)\n dir = new V3(-1, 0, 0)\n } else if (zone === 'rear') {\n p = new V3(m.rear, mid, -m.width * 0.15)\n dir = new V3(1, 0, 0)\n } else {\n const sd = zone === 'left' ? -1 : 1\n p = new V3((m.front + m.rear) * 0.5 + m.length * (sd < 0 ? 0.12 : -0.1), mid + 0.1, (sd * m.width) / 2)\n dir = new V3(0, 0, -sd)\n const h = I.probe(c, new V3(p.x, p.y, sd * (m.width / 2 + 3)), dir, 3 + m.width)\n if (h) p = h.p\n }\n return { p: p, dir: dir }\n }\n\n Object.assign(I, { BODY_TYPES })\n}\n","/** Damage-map widgets (SVG top-down map, band buttons, legend, health bar, scenario buttons). Optional: nothing else depends on it. */\nimport type { Kit } from './types'\n\nconst SVGNS = 'http://www.w3.org/2000/svg'\n/** Label colour on each band tile (dark on light bands, light on dark ones). */\nconst BAND_TEXT = ['#10140f', '#1c1606', '#1f1206', '#fff3ef', '#f1f2f2']\n\nexport function installUi(kit: Kit): void {\n const document = kit.document\n\n /** UI text: `config.texts.ui[key]` wins over the locale string `ui.<key>`. */\n function T(key: string): string {\n const override = kit.config.texts.ui || {}\n if (override[key] != null) return override[key]\n return kit.t('ui.' + key)\n }\n function el(tag: string, cls?: string | null, txt?: string | null): any {\n const e = document.createElement(tag)\n if (cls) e.className = cls\n if (txt != null) e.textContent = txt\n return e\n }\n function sv(tag: string, attrs?: Record<string, any>, parent?: any): any {\n const e = document.createElementNS(SVGNS, tag)\n Object.keys(attrs || {}).forEach(function (k) {\n e.setAttribute(k, (attrs as any)[k])\n })\n if (parent) parent.appendChild(e)\n return e\n }\n /** \"Front door · Dented 38%\" */\n function zoneLabel(z: any): string {\n const B = kit.bands[kit.bandOf(z.health)]\n return z.name + ' · ' + B.name + ' ' + z.health + '%'\n }\n /** Health range of a band as text (\"76–100\"); empty for the last band. */\n function bandRange(i: number): string {\n const B = kit.bands\n if (i === B.length - 1) return ''\n return B[i].min + '–' + (i === 0 ? 100 : B[i - 1].min - 1)\n }\n\n /**\n * Top-down damage map (SVG). `host`: element; `c`: context from `kit.build`; `o`: `{ selected (zone id), onSelect(id) }`.\n * External zones are drawn on the vehicle outline, internal zones in a strip of blocks below.\n */\n function damageMap(host: any, c: any, o?: any): any {\n o = o || {}\n const sel = o.selected\n host.innerHTML = ''\n const Z = c.zones\n const ext = Z.filter(function (z: any) {\n return !z.internal\n })\n const inn = Z.filter(function (z: any) {\n return z.internal\n })\n if (!ext.length) {\n host.appendChild(el('p', 'muted', T('noZones')))\n return null\n }\n let x0 = 1e9\n let x1 = -1e9\n let z0 = 1e9\n let z1 = -1e9\n ext.forEach(function (z: any) {\n x0 = Math.min(x0, z.map[0])\n x1 = Math.max(x1, z.map[1])\n z0 = Math.min(z0, z.map[2])\n z1 = Math.max(z1, z.map[3])\n })\n const sx = x1 - x0 || 1\n const sz = z1 - z0 || 1\n const s = Math.min(230 / sz, 290 / sx)\n let kz = 1\n let kx = 1\n const w = sz * s\n const h = sx * s\n if (w < 0.45 * h) kz = (0.45 * h) / w\n if (h < 0.75 * w) kx = (0.75 * w) / h\n const pad = 10\n const top = 22\n const W = Math.max(w * kz + 2 * pad, 240)\n const offX = (W - w * kz) / 2\n const H = h * kx\n const cols = 2\n const tw = (W - 2 * pad - (cols - 1) * 6) / cols\n const rows = Math.ceil(inn.length / cols)\n const stripY = top + H + 18\n const VH = stripY + (inn.length ? 14 + rows * 32 : 0) + 4\n const svg = sv('svg', { viewBox: '0 0 ' + W.toFixed(1) + ' ' + VH.toFixed(1), role: 'group', 'aria-label': T('aria'), class: 'dmap' }, host)\n function X(zv: number) {\n return offX + (zv - z0) * s * kz\n }\n function Y(xv: number) {\n return top + (x1 - xv) * s * kx\n }\n const m = c.meta\n const F = m.front\n const R = m.rear\n const hw = (m.width || 1.7) / 2\n sv(\n 'rect',\n { x: X(-hw).toFixed(1), y: Y(F).toFixed(1), width: (X(hw) - X(-hw)).toFixed(1), height: (Y(R) - Y(F)).toFixed(1), rx: 10, class: 'dm-body' },\n svg,\n )\n const tf = sv('text', { x: (W / 2).toFixed(1), y: 13, class: 'dm-front', 'text-anchor': 'middle' }, svg)\n tf.textContent = T('front')\n function node(z: any, x: number, y: number, wd: number, ht: number, parent: any) {\n const b = kit.bandOf(z.health)\n const g = sv(\n 'g',\n {\n class: 'zn' + (z.id === sel ? ' sel' : '') + (b === 4 ? ' gone' : ''),\n tabindex: '0',\n role: 'button',\n 'data-id': z.id,\n 'aria-label': zoneLabel(z),\n 'aria-pressed': z.id === sel ? 'true' : 'false',\n },\n parent,\n )\n sv('title', {}, g).textContent = zoneLabel(z)\n sv(\n 'rect',\n {\n x: x.toFixed(1),\n y: y.toFixed(1),\n width: Math.max(3, wd).toFixed(1),\n height: Math.max(3, ht).toFixed(1),\n rx: 3,\n fill: b === 4 ? 'transparent' : kit.bands[b].color,\n },\n g,\n )\n return g\n }\n ext\n .slice()\n .sort(function (a: any, b: any) {\n return (b.map[1] - b.map[0]) * (b.map[3] - b.map[2]) - (a.map[1] - a.map[0]) * (a.map[3] - a.map[2])\n })\n .forEach(function (z: any) {\n node(z, X(z.map[2]), Y(z.map[1]), X(z.map[3]) - X(z.map[2]), Y(z.map[0]) - Y(z.map[1]), svg)\n })\n if (inn.length) {\n const tl = sv('text', { x: pad, y: stripY, class: 'dm-sub' }, svg)\n tl.textContent = T('inside')\n inn.forEach(function (z: any, i: number) {\n const col = i % cols\n const row = Math.floor(i / cols)\n const x = pad + col * (tw + 6)\n const y = stripY + 8 + row * 32\n const b = kit.bandOf(z.health)\n const g = node(z, x, y, tw, 26, svg)\n const t = sv(\n 'text',\n { x: (x + tw / 2).toFixed(1), y: (y + 17).toFixed(1), 'text-anchor': 'middle', class: 'dm-tile', fill: b === 4 ? '#c9cdd0' : BAND_TEXT[b] },\n g,\n )\n const mc = Math.floor(tw / 6.1)\n t.textContent = z.name.length > mc ? z.name.slice(0, mc - 1) + '…' : z.name\n })\n }\n svg.querySelectorAll('.zn').forEach(function (g: any) {\n function pick() {\n if (o.onSelect) o.onSelect(g.getAttribute('data-id'))\n }\n g.addEventListener('click', pick)\n g.addEventListener('keydown', function (e: any) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n pick()\n }\n })\n })\n return svg\n }\n\n /** One button per band; `onPick(targetHealth, bandIndex)`. Returns the buttons. */\n function bandButtons(host: any, onPick?: (health: number, band: number) => void): any[] {\n host.innerHTML = ''\n return kit.bands.map(function (B: any, i: number) {\n const b = el('button', null, B.name)\n b.type = 'button'\n b.dataset.b = i\n b.style.setProperty('--band', B.color)\n b.addEventListener('click', function () {\n if (onPick) onPick(B.health, i)\n })\n host.appendChild(b)\n return b\n })\n }\n\n /** Band legend with the health ranges. */\n function legend(host: any): void {\n host.innerHTML = ''\n kit.bands.forEach(function (B: any, i: number, A: any[]) {\n const gone = i === A.length - 1\n const sp = el('span', gone ? 'gone' : null)\n const sw = el('i')\n sw.style.background = gone ? 'transparent' : B.color\n sp.appendChild(sw)\n sp.appendChild(document.createTextNode(B.name + (gone ? '' : ' ' + bandRange(i))))\n host.appendChild(sp)\n })\n }\n\n /** Overall health bar. `els`: `{ text, bar }` (elements). Returns `{ health, band, name }`. */\n function healthBar(els: { text?: any; bar?: any }, c: any): any {\n const O = kit.zoneOverall(c)\n if (els.text) els.text.textContent = T('health') + ' ' + O.health + '% · ' + O.name\n if (els.bar) {\n els.bar.style.width = O.health + '%'\n els.bar.style.background = kit.bands[O.band].color\n }\n return O\n }\n\n /** One button per registered scenario; `onRun(id)`. */\n function scenarioButtons(host: any, onRun: (id: string) => void): any[] {\n host.innerHTML = ''\n return kit.scenarios.map(function (S: any) {\n const b = el('button', null, S.name)\n b.type = 'button'\n b.dataset.sc = S.id\n b.addEventListener('click', function () {\n onRun(S.id)\n })\n host.appendChild(b)\n return b\n })\n }\n\n /** Minimal CSS for pages without their own stylesheet (the variables have defaults). */\n function css(): string {\n return (\n 'svg.dmap{width:100%;max-width:300px;height:auto;max-height:460px;display:block}svg.dmap .dm-body{fill:var(--panel-2,#1c2127);stroke:var(--line,#39414a)}' +\n 'svg.dmap .dm-front,svg.dmap .dm-sub{font:9.5px monospace;fill:var(--muted,#9aa3ab);letter-spacing:.08em}svg.dmap .dm-tile{font:600 10.5px sans-serif;pointer-events:none}' +\n 'svg.dmap .zn{cursor:pointer;outline:none}svg.dmap .zn rect{stroke:#0b0e11;stroke-width:1;fill-opacity:.9}svg.dmap .zn.gone rect{stroke:#8a9095;stroke-dasharray:3 2;fill:rgba(110,115,119,.18)}' +\n 'svg.dmap .zn:hover rect{stroke:#fff;stroke-width:1.6}svg.dmap .zn.sel rect{stroke:#e0a548;stroke-width:2.6}'\n )\n }\n /** Adds the minimal CSS to the document head once. */\n function injectStyles(): void {\n if (document.getElementById('vehicles-ui-css')) return\n const s = el('style')\n s.id = 'vehicles-ui-css'\n s.textContent = css()\n document.head.appendChild(s)\n }\n\n kit.ui = { damageMap, bandButtons, legend, healthBar, scenarioButtons, zoneLabel, bandRange, css, injectStyles }\n}\n","/**\n * Light mode (\"lite\"): the same vehicles with fewer triangles, for a whole street of them. Port of the `[LOD]` hooks of the team's Frota Leve\n * (frota-leve.js lines 21-65, 232-257, 1205-1221, 14155-14170). Every number is a setting; with `on` false nothing changes, so every golden\n * of the full-detail build stays byte for byte the same.\n */\nimport type { Kit } from './types'\n\nexport interface LodSettings {\n /** Light mode is active for the builds that run now. Set by `kit.build(key, state, zones, { lod: true })`. */\n on: boolean\n /** Fraction of the segments three's own generators keep (cylinders, spheres, tori, lathes, tubes, extrusions, circles, rings). */\n segmentFraction: number\n /** Rounding rings of a rounded box (the full build uses 3). */\n roundingRings: number\n /** Multiplier of the maximum edge length when subdividing a mesh (bigger triangles). */\n subdivisionFactor: number\n /** A box with an edge under this, or a rounding radius under 1.2 cm, is drawn as a plain 12-triangle box. */\n flatBoxEdge: number\n /** Fewest segments of a superellipse loft. */\n minLoftSegments: number\n /** Fraction of a loft's segments. */\n loftSegmentFraction: number\n /** Fewest stations of a resampled loft. */\n minStations: number\n /** Fraction of the stations of a resampled loft. */\n stationFraction: number\n /** Multiplier of the grid cell size of grilles and side grilles. */\n gridFactor: number\n /** Materials (by name in `kit.materials`) whose meshes are never seen from outside and are left out in light mode. */\n hiddenMaterials: readonly string[]\n}\n\nexport const defaultLodSettings: LodSettings = {\n on: false,\n segmentFraction: 0.5,\n roundingRings: 1,\n subdivisionFactor: 2.2,\n flatBoxEdge: 0.22,\n minLoftSegments: 14,\n loftSegmentFraction: 0.45,\n minStations: 20,\n stationFraction: 0.55,\n gridFactor: 2.6,\n hiddenMaterials: ['seat', 'carpet', 'headliner', 'gauge', 'screen', 'bay', 'hoodLiner', 'block', 'cover', 'radiator', 'coolant', 'coolantLiq', 'washer', 'hv', 'hose', 'leather'],\n}\n\n/** The settings the kit starts with: the defaults, overridden by the options. */\nexport function createLod(options?: Partial<LodSettings>): LodSettings {\n return { ...defaultLodSettings, ...(options || {}), on: false }\n}\n\n/** Fewer segments of a generator when the light mode is on, never below `min`. */\nconst fewer = (lod: LodSettings, n: number, min: number): number => Math.max(min, Math.round(n * lod.segmentFraction))\n\n/**\n * A copy of the three.js namespace whose geometry generators take fewer segments while `lod.on` is true (and whose canvas textures come out in\n * sRGB when three has colour management). With `lod.on` false every generator passes its arguments through untouched.\n */\nexport function wrapThreeForLod(TH: any, lod: LodSettings): any {\n const T: any = Object.assign({}, TH)\n if (TH.SRGBColorSpace) {\n T.CanvasTexture = class extends TH.CanvasTexture {\n constructor(a: any, b: any, c: any, d: any, e: any, f: any, g: any, h: any, i: any) {\n super(a, b, c, d, e, f, g, h, i)\n this.colorSpace = TH.SRGBColorSpace\n }\n }\n }\n T.CylinderGeometry = class extends TH.CylinderGeometry {\n constructor(rt: any, rb: any, h: any, rs: any, hs: any, open: any, ts: any, tl: any) {\n super(rt, rb, h, lod.on && rs != null ? fewer(lod, rs, 6) : rs, lod.on ? 1 : hs, open, ts, tl)\n }\n }\n T.SphereGeometry = class extends TH.SphereGeometry {\n constructor(r: any, ws: any, hs: any, ps: any, pl: any, ts: any, tl: any) {\n super(r, lod.on && ws != null ? fewer(lod, ws, 8) : ws, lod.on && hs != null ? fewer(lod, hs, 5) : hs, ps, pl, ts, tl)\n }\n }\n T.TorusGeometry = class extends TH.TorusGeometry {\n constructor(r: any, tube: any, rs: any, ts: any, arc: any) {\n super(r, tube, lod.on && rs != null ? fewer(lod, rs, 4) : rs, lod.on && ts != null ? fewer(lod, ts, 8) : ts, arc)\n }\n }\n T.LatheGeometry = class extends TH.LatheGeometry {\n constructor(pts: any, seg: any, a: any, b: any) {\n super(pts, lod.on && seg != null ? fewer(lod, seg, 10) : seg, a, b)\n }\n }\n T.TubeGeometry = class extends TH.TubeGeometry {\n constructor(path: any, ts: any, r: any, rs: any, closed: any) {\n if (lod.on) {\n let len = 1\n try {\n len = path.getLength()\n } catch (e) {\n /* a path without a length keeps the default */\n }\n ts = Math.max(6, Math.min(ts == null ? 64 : ts, Math.ceil(len / 0.14)))\n rs = r < 0.025 ? 3 : Math.max(4, fewer(lod, rs == null ? 8 : rs, 4))\n }\n super(path, ts, r, rs, closed)\n }\n }\n T.ExtrudeGeometry = class extends TH.ExtrudeGeometry {\n constructor(shape: any, o: any) {\n if (lod.on && o) {\n o = Object.assign({}, o)\n if (o.curveSegments) o.curveSegments = fewer(lod, o.curveSegments, 5)\n if (o.bevelSegments) o.bevelSegments = Math.max(1, Math.round(o.bevelSegments * 0.5))\n }\n super(shape, o)\n }\n }\n T.CircleGeometry = class extends TH.CircleGeometry {\n constructor(r: any, seg: any, a: any, b: any) {\n super(r, lod.on && seg != null ? fewer(lod, seg, 8) : seg, a, b)\n }\n }\n T.RingGeometry = class extends TH.RingGeometry {\n constructor(a: any, b: any, ts: any, ps: any, c: any, d: any) {\n super(a, b, lod.on && ts != null ? fewer(lod, ts, 8) : ts, ps, c, d)\n }\n }\n return T\n}\n\n/** Names of the kit functions that add the inside of a vehicle (seen only through the glass, left out in light mode). */\nconst INTERIOR_FUNCTIONS = ['interior', 'engineBay', 'seat', 'dashboard', 'steeringWheel', 'yoke', 'busRows'] as const\n\n/**\n * Wraps the interior builders: while the light mode is on, the meshes a call adds get `userData.skipLite`, which the lite builder of\n * `game-vehicles-three` leaves out. Also resolves `lod.hiddenMaterials` into `kit.lodHiddenMaterials`.\n */\nexport function installLod(kit: Kit): void {\n const lod: LodSettings = kit.lod\n const meshesOf = (c: any): Set<any> => {\n const set = new Set<any>()\n c.vehicle.traverse((o: any) => {\n if (o.isMesh) set.add(o)\n })\n return set\n }\n for (const name of INTERIOR_FUNCTIONS) {\n const original = kit[name]\n if (typeof original !== 'function') continue\n kit[name] = function (this: unknown, ...args: any[]) {\n const c = args[0]\n if (!lod.on || !c || !c.vehicle) return original.apply(this, args)\n const before = meshesOf(c)\n const result = original.apply(this, args)\n c.vehicle.traverse((o: any) => {\n if (o.isMesh && !before.has(o)) o.userData.skipLite = true\n })\n return result\n }\n }\n /** Materials of the parts nobody sees from outside, as a set to test by identity. */\n kit.lodHiddenMaterials = function () {\n const materials = kit.materials\n return new Set(lod.hiddenMaterials.map((name) => materials[name]).filter(Boolean))\n }\n}\n","/**\n * Damageable parts: what a bullet, a bat or a crash can hurt on a built vehicle, as boxes. Port of `coletarDanificaveis` and `tipoDaZona`\n * (frota-leve.js 14391-14405), driven by the zones the kit already derives, so it works for any vehicle of any pack.\n */\nimport type { Kit } from './types'\n\nexport type DamageableMaterial = 'metal' | 'glass' | 'rubber' | 'fuel'\nexport type DamageableSide = 'center' | 'left' | 'right'\n\n/** What a zone is, by type: the material it is made of and the part name a game shows. */\nexport interface DamageableKind {\n material: DamageableMaterial\n part: string\n}\n\n/** Zone type (and, for some, `fxKey` or `sub`) to material and part. A game replaces or adds entries with `kit.damageableKinds`. */\nexport const defaultDamageableKinds: Record<string, DamageableKind> = {\n door: { material: 'metal', part: 'door' },\n hood: { material: 'metal', part: 'hood' },\n lid: { material: 'metal', part: 'lid' },\n bumper: { material: 'metal', part: 'bumper' },\n glass: { material: 'glass', part: 'window' },\n 'glass:windshield': { material: 'glass', part: 'windshield' },\n light: { material: 'glass', part: 'headlight' },\n 'light:taillight': { material: 'glass', part: 'taillight' },\n wheel: { material: 'rubber', part: 'wheel' },\n 'internal:fuel_tank': { material: 'fuel', part: 'fuel_tank' },\n}\n\nexport function installDamageables(kit: Kit): void {\n const THREE = kit.THREE\n kit.damageableKinds = { ...defaultDamageableKinds }\n\n const kindOf = (zone: any): DamageableKind | null => {\n const kinds = kit.damageableKinds\n if (zone.type === 'internal') return zone.sub ? kinds[`internal:${zone.sub}`] || null : null\n return kinds[`${zone.type}:${zone.fxKey}`] || kinds[zone.type] || null\n }\n\n /**\n * Every damageable zone of a built vehicle: `{ material, zone, part, side, box }`. `box` is a `THREE.Box3` in the coordinates of\n * `c.vehicle`, or in the frame of `matrix` when one is given (for example the output frame of `game-vehicles-three`).\n */\n kit.damageables = function (c: any, matrix?: any) {\n const out: any[] = []\n for (const zone of c.zones || []) {\n const kind = kindOf(zone)\n if (!kind || !zone.box) continue\n const b = zone.box\n const box = new THREE.Box3(new THREE.Vector3(b.x0, b.y0, b.z0), new THREE.Vector3(b.x1, b.y1, b.z1))\n if (matrix) box.applyMatrix4(matrix)\n out.push({ material: kind.material, zone: zone.id, part: kind.part, side: zone.side === 0 ? 'center' : zone.side < 0 ? 'left' : 'right', box })\n }\n return out\n }\n}\n","import { assignDeep, createMatchers, createTranslate, registerLocale, resolveStrings } from './locale'\nimport { LEGACY_STATES, registerLegacySeeds } from './legacy-seeds'\nimport { clamp, hash, markDecal, rng, smooth, strHash } from './util'\nimport type { Kit } from './types'\nimport type { VehicleKit, VehicleKitOptions } from './api'\nimport { installMaterials } from './materials'\nimport { installGeometry } from './geometry'\nimport { installContext } from './context'\nimport { installWarp } from './warp'\nimport { installBody } from './body'\nimport { installGlass } from './glass'\nimport { installLights } from './lights'\nimport { installInterior } from './interior'\nimport { installHood } from './hood'\nimport { installCar } from './car'\nimport { installTrucks } from './trucks'\nimport { installWheels } from './wheels'\nimport { installParticles } from './particles'\nimport { installFluids } from './fluids'\nimport { installGlassDamage } from './glass-damage'\nimport { installImpact } from './impact'\nimport { installExplosion } from './explosion'\nimport { installRollover } from './rollover'\nimport { installTick } from './tick'\nimport { installArmor } from './armor'\nimport { installZoneCore } from './zone-core'\nimport { installZoneDecals } from './zone-decals'\nimport { installZoneDent } from './zone-dent'\nimport { installDamagePanels } from './damage-panels'\nimport { installDamageParts } from './damage-parts'\nimport { installZoneDerive } from './zone-derive'\nimport { installZoneAuto } from './zone-auto'\nimport { installZoneApply } from './zone-apply'\nimport { installScenarios } from './scenarios'\nimport { installUi } from './ui'\nimport { createLod, installLod, wrapThreeForLod } from './lod'\nimport { installDamageables } from './damageables'\n\n/**\n * Creates a vehicle kit bound to a three.js namespace and a locale.\n * The returned object is the public API; every call creates an independent kit (its own registry, caches and configuration).\n */\nexport function createVehicleKit(options: VehicleKitOptions): VehicleKit {\n const opts: any = options || {}\n if (!opts.THREE || !opts.THREE.Vector3) throw new Error('createVehicleKit: options.THREE (the three.js namespace) is required')\n /* the light mode settings, and the three.js namespace whose generators obey them */\n const lod = createLod(opts.lod)\n const THREE = wrapThreeForLod(opts.THREE, lod)\n const strings = resolveStrings(opts.locale)\n const t = createTranslate(strings)\n const doc = opts.document || (typeof document !== 'undefined' ? document : undefined)\n\n const kit: Kit = {\n THREE,\n lod,\n V3: THREE.Vector3,\n PI: Math.PI,\n document: doc,\n strings,\n t,\n matchers: createMatchers(strings),\n hash,\n clamp,\n smooth,\n _: {},\n }\n\n /* ================= data ================= */\n /* registries filled by the content pack (configure({ fuels, groups, waterGroups })) */\n kit.fuels = {}\n kit.groups = []\n kit.waterGroups = {}\n /* live configuration: everything that is content comes in through configure() / plugin() */\n kit.config = {\n defaultGroup: t('groups.default'),\n plate: 'ABC1D23',\n impactStain: null,\n defaultSplat: 'stain',\n damagedScenario: null,\n texts: { who: t('texts.who'), noEffect: t('texts.no_effect') },\n }\n kit.fleet = []\n kit.builders = {}\n kit.register = function (spec: any, build: any) {\n if (!spec || !spec.key || typeof build !== 'function') throw new Error('kit.register: spec.key and a build function are required')\n const i = kit.fleet.findIndex(function (v: any) {\n return v.key === spec.key\n })\n spec.build = build\n if (!spec.group) spec.group = kit.config.defaultGroup\n if (i >= 0) kit.fleet[i] = spec\n else kit.fleet.push(spec)\n kit.builders[spec.key] = build\n return spec\n }\n kit.find = function (key: string) {\n return (\n kit.fleet.find(function (v: any) {\n return v.key === key\n }) || null\n )\n }\n\n /* ================= modules ================= */\n installMaterials(kit)\n installGeometry(kit)\n installContext(kit)\n installWarp(kit)\n installBody(kit)\n installGlass(kit)\n installLights(kit)\n installInterior(kit)\n installHood(kit)\n installCar(kit)\n installTrucks(kit)\n installWheels(kit)\n installParticles(kit)\n installFluids(kit)\n installGlassDamage(kit)\n installImpact(kit)\n installExplosion(kit)\n installRollover(kit)\n installTick(kit)\n installArmor(kit)\n installZoneCore(kit)\n installZoneDecals(kit)\n installZoneDent(kit)\n installDamagePanels(kit)\n installDamageParts(kit)\n installZoneDerive(kit)\n installZoneAuto(kit)\n installZoneApply(kit)\n installScenarios(kit)\n installUi(kit)\n installLod(kit)\n installDamageables(kit)\n\n const I = kit._\n\n /* ================= extension: configure, plugin, hooks ================= */\n const HOOKS: Record<string, Array<(...args: any[]) => void>> = {}\n /** `kit.on(event, fn)` / `kit.hook(event, ...args)`. Events: `defaultDamage(c)` after the default damage of a car. */\n kit.on = function (ev: string, fn: (...args: any[]) => void) {\n ;(HOOKS[ev] = HOOKS[ev] || []).push(fn)\n return kit\n }\n kit.hook = function (ev: string, ...args: any[]) {\n ;(HOOKS[ev] || []).forEach(function (fn) {\n fn.apply(kit, args)\n })\n }\n kit.configure = function (o: any) {\n o = o || {}\n if (o.bands)\n o.bands.forEach(function (b: any, i: number) {\n if (kit.bands[i] && b) Object.assign(kit.bands[i], b)\n })\n if (o.zoneEffects)\n Object.keys(o.zoneEffects).forEach(function (k) {\n kit.zoneEffects[k] = o.zoneEffects[k]\n })\n if (o.partEffects) Object.assign(kit.partEffects, o.partEffects)\n if (o.scenarios) o.scenarios.forEach(kit.scenario)\n if (o.flagEffects)\n Object.keys(o.flagEffects).forEach(function (k) {\n kit.flagEffects[k] = Object.assign({ order: 50, settle: true }, o.flagEffects[k])\n })\n if (o.fluids)\n Object.keys(o.fluids).forEach(function (k) {\n kit.defineFluid(k, o.fluids[k])\n })\n if (o.fuels) Object.assign(kit.fuels, o.fuels)\n if (o.groups)\n o.groups.forEach(function (g: string) {\n if (kit.groups.indexOf(g) < 0) kit.groups.push(g)\n })\n if (o.waterGroups) Object.assign(kit.waterGroups, o.waterGroups)\n if (o.palette && o.palette.rust) I.RUST.set(o.palette.rust)\n if (o.plate != null) kit.config.plate = o.plate\n if (o.texts) {\n const tx = o.texts\n if (tx.who != null) kit.config.texts.who = tx.who\n if (tx.noEffect != null) kit.config.texts.noEffect = tx.noEffect\n if (tx.plate != null) kit.config.plate = tx.plate\n if (tx.ui) kit.config.texts.ui = Object.assign(kit.config.texts.ui || {}, tx.ui)\n }\n ;['impactStain', 'defaultSplat', 'defaultGroup', 'damagedScenario'].forEach(function (k) {\n if (o[k] !== undefined) kit.config[k] = o[k]\n })\n return kit\n }\n kit.plugins = []\n kit.plugin = function (p: any) {\n if (!p) return kit\n if (p.configure) kit.configure(p.configure)\n if (typeof p.install === 'function') p.install(kit)\n kit.plugins.push(p.name || '(unnamed)')\n return kit\n }\n /** Helpers for plugins that create their own scenario flag effects. */\n kit.internals = {\n rng,\n strHash,\n zonesOf: kit.zonesOf,\n worldInverseOf: I.worldInverseOf,\n hideObj: I.hideObj,\n markDecal,\n rayCaster: I._zr,\n boxCenter: I.boxCenter,\n wheelInfo: I.wheelInfo,\n }\n\n /* ================= assembly ================= */\n function defaultDamage(c: any) {\n const kd = c.meta.kind\n if (kd === 'plane') {\n kit.zoneImpact(c, 'front', 1.2)\n kit.zoneImpact(c, 'left', 1.1)\n kit.impact(c, new kit.V3(0.05, 0.45, 1.25), new kit.V3(0, 1, 0), 1.0, { noStain: true })\n } else if (kd === 'heli') {\n kit.zoneImpact(c, 'front', 1.1)\n kit.impact(c, new kit.V3(0, 0.12, -0.95), new kit.V3(0, 0, 1), 0.9, { noStain: true })\n kit.impact(c, new kit.V3(c.meta.rear + 0.3, 2.0, 0), new kit.V3(0.4, 0, 1), 1.0, { noStain: true })\n kit.impact(c, new kit.V3(-0.6, 2.4, 0.3), new kit.V3(0, -1, 0), 1.0, { noStain: true })\n } else if (kd === 'boat') {\n kit.zoneImpact(c, 'front', 1.1)\n kit.zoneImpact(c, 'left', 1.0)\n } else {\n kit.zoneImpact(c, 'front', 1.0)\n kit.zoneImpact(c, 'left', 0.7)\n kit.hook('defaultDamage', c)\n }\n }\n kit.defaultDamage = defaultDamage\n\n /**\n * Builds vehicle `key` in a state (`'intact' | 'damaged' | 'modified'`). Returns the context; add `c.root` to the scene.\n * `zoneState` (optional) = `{ health: { zoneId: 0..100 }, flags: { flipped, burnt, abandoned, ...plugin flags } }` applies the damage zones.\n * Without it, `'damaged'` uses the scenario `config.damagedScenario` when a plugin registered one.\n */\n kit.build = function (key: string, state?: string, zoneState?: any, options?: { lod?: boolean }) {\n const spec = kit.find(key)\n if (!spec) throw new Error('Unknown vehicle: ' + key)\n const lodBefore = lod.on\n if (options && options.lod != null) lod.on = !!options.lod\n try {\n return buildVehicle(spec, key, state, zoneState)\n } finally {\n lod.on = lodBefore\n }\n }\n function buildVehicle(spec: any, key: string, state?: string, zoneState?: any) {\n const st = state || 'intact'\n /* a vehicle renamed after the first release keeps its old key as the seed of every random stream */\n const seedKey = spec.seedKey || key\n const c = new kit.BuildContext(st, strHash(seedKey + (LEGACY_STATES[st] || st)))\n c.spec = spec\n c.key = key\n c.seedKey = seedKey\n spec.build(c, kit)\n const m = c.meta\n m.kind = m.kind || 'car'\n if (m.length == null || m.width == null || m.front == null) {\n const bb = new THREE.Box3().setFromObject(c.vehicle)\n const sz = bb.getSize(new kit.V3())\n if (m.length == null) m.length = sz.x\n if (m.width == null) m.width = sz.z\n if (m.front == null) m.front = bb.max.x\n if (m.rear == null) m.rear = bb.min.x\n if (m.top == null) m.top = bb.max.y\n if (m.clearance == null) m.clearance = Math.max(0.1, bb.min.y + 0.2)\n if (m.bodyHeight == null) m.bodyHeight = sz.y * 0.5\n if (m.belt == null) m.belt = m.clearance + m.bodyHeight\n }\n if (c.engineHealth == null) c.engineHealth = 1\n if (['electric', 'none'].indexOf(spec.fuel) < 0 && ['boat', 'plane', 'heli'].indexOf(m.kind) < 0 && m.exhaust !== false) {\n const ex = m.exhaust || new kit.V3(m.rear + 0.05, Math.max(0.2, (m.clearance || 0.3) * 0.7), (m.width || 1.6) * 0.3)\n kit.addEmitter(c, ex, 'exhaust', { dir: m.exhaustDir || new kit.V3(-1, 0, 0) })\n }\n try {\n kit.zonesOf(c)\n } catch (e: any) {\n c.zones = []\n ;(c.zoneErrors = c.zoneErrors || []).push('zones: ' + (e && e.message))\n }\n if (st === 'modified') {\n if (m.armor) m.armor(c, kit)\n else kit.applyArmor(c)\n }\n if (zoneState == null && st === 'damaged' && kit.config.damagedScenario) zoneState = kit.zoneScenario(c, kit.config.damagedScenario)\n if (zoneState) kit.applyZones(c, zoneState)\n else {\n c.zoneState = { health: {}, flags: {} }\n c.zones.forEach(function (z: any) {\n c.zoneState.health[z.id] = 100\n })\n }\n c.vehicle.traverse(function (o: any) {\n if (o.isMesh && !(o.material && o.material.transparent)) o.receiveShadow = true\n })\n return c\n }\n /** Releases the geometries of a built vehicle (shared particle geometries and materials are kept). */\n kit.dispose = function (c: any) {\n const shared = Object.values(I.PARTICLE_GEOMETRIES)\n c.root.traverse(function (o: any) {\n if (o.isSprite) {\n if (o.material && o.material.userData.dis) o.material.dispose()\n return\n }\n if (o.geometry && !shared.includes(o.geometry)) o.geometry.dispose()\n })\n }\n\n kit.registerLegacySeeds = registerLegacySeeds\n\n /* a content pack adds its own strings (under its own top-level key) to the locale this kit was created with */\n kit.registerLocale = function (code: string, table: Record<string, any>) {\n registerLocale(code, table)\n assignDeep(strings, resolveStrings(opts.locale))\n return kit\n }\n\n /* options that are configuration (everything except THREE, locale and document) */\n const { THREE: _three, lod: _lod, locale: _locale, document: _document, plugins, ...config } = opts\n void _three\n void _lod\n void _locale\n void _document\n kit.configure(config)\n ;(plugins || []).forEach(kit.plugin)\n\n return kit as unknown as VehicleKit\n}\n","/**\n * Part and joint model of a vehicle for the destruction contract: every damage zone becomes a part with a material, the mechanical parts the\n * zones do not cover (battery, alternator, gearbox, brakes, steering, shock absorbers, tow hitch, tyres, mirrors, pillars...) are added from the\n * vehicle meta, and the joints (hinge, bolt, weld, glue, clip) say how each one is held.\n *\n * Everything here is pure data derived from the built vehicle: no meshes are created or touched.\n */\nimport type { JointKind, MaterialId, ToolKind, Vec3 } from '@adatechnology/game-contracts'\nimport type { VehicleContext, VehicleKit } from '../api'\nimport { clamp, strHash } from '../util'\n\n/** What a part is, which decides its material, its joint and what happens when it comes off. */\nexport type PartRole =\n | 'frame'\n | 'panel'\n | 'fender'\n | 'door'\n | 'hood'\n | 'lid'\n | 'roof'\n | 'bumper'\n | 'glass'\n | 'light'\n | 'rim'\n | 'tyre'\n | 'mirror'\n | 'pillar'\n | 'engine'\n | 'radiator'\n | 'fuel_tank'\n | 'oil_pan'\n | 'battery'\n | 'alternator'\n | 'gearbox'\n | 'brakes'\n | 'steering'\n | 'shocks'\n | 'hitch'\n | 'other'\n\n/** An axis-aligned box in `c.vehicle` coordinates (+x front, +y up, +z right). */\nexport interface LocalBox {\n center: Vec3\n size: Vec3\n}\n\nexport interface PartDef {\n id: string\n role: PartRole\n /** Display name from the locale. */\n name: string\n material: MaterialId\n box: LocalBox\n mass: number\n /** Energy in joules that wrecks the part. */\n hp: number\n /** The damage zone this part is, when it is one. */\n zoneId?: string\n /** Fluid held, in litres. */\n contains?: { fluid: string; liters: number; pressurized?: boolean }\n explodes?: { energy: number; radius: number; atC: number }\n /** Temperature in Celsius at which the part catches fire (none: it does not burn). */\n ignitionC?: number\n /** Parts that can be seen coming off the vehicle (the others are logical: they keep state and effects only). */\n visual: boolean\n /** The part is one of the new mechanical parts (the ones the damage zones do not cover). */\n mechanical: boolean\n tags: string[]\n}\n\nexport interface JointDef {\n id: string\n a: string\n b: string\n kind: JointKind\n strength: number\n tools: ToolKind[]\n seconds: number\n}\n\nexport interface VehicleModel {\n parts: PartDef[]\n joints: JointDef[]\n /** The part every other part hangs from. */\n hub: string\n hitch: boolean\n}\n\nexport interface ModelOptions {\n /** Fit a tow hitch. Default: the spec flag `hitch`, else a seeded choice by vehicle kind. */\n hitch?: boolean\n}\n\n/** Joint kinds as the vehicle uses them: strength in joules of wear, the tools that undo them and the seconds of work. */\nexport const JOINT_RULES: Record<'hinge' | 'bolt' | 'weld' | 'glue' | 'clip', { strength: number; tools: ToolKind[]; seconds: number }> = {\n hinge: { strength: 5000, tools: ['wrench', 'screwdriver'], seconds: 3 },\n bolt: { strength: 3000, tools: ['wrench'], seconds: 4 },\n weld: { strength: 30000, tools: ['cutting_torch', 'saw'], seconds: 10 },\n glue: { strength: 800, tools: ['pry_bar', 'knife'], seconds: 3 },\n clip: { strength: 500, tools: ['pry_bar', 'hand'], seconds: 1.5 },\n}\n\ntype Kind = 'car' | 'bike' | 'quad' | 'tractor' | 'truck' | 'bus' | 'tank' | 'boat' | 'plane' | 'heli'\n\n/** Which mechanical parts each vehicle kind has. */\nconst MECHANICS: Record<Kind, Array<'battery' | 'alternator' | 'gearbox' | 'brakes' | 'steering' | 'shocks' | 'oil_pan' | 'mirrors'>> = {\n car: ['battery', 'alternator', 'gearbox', 'brakes', 'steering', 'shocks', 'oil_pan', 'mirrors'],\n truck: ['battery', 'alternator', 'gearbox', 'brakes', 'steering', 'shocks', 'oil_pan', 'mirrors'],\n bus: ['battery', 'alternator', 'gearbox', 'brakes', 'steering', 'shocks', 'oil_pan', 'mirrors'],\n tractor: ['battery', 'alternator', 'gearbox', 'brakes', 'steering', 'shocks', 'oil_pan', 'mirrors'],\n quad: ['battery', 'alternator', 'gearbox', 'brakes', 'steering', 'shocks', 'oil_pan'],\n bike: ['battery', 'alternator', 'gearbox', 'brakes', 'steering', 'shocks', 'oil_pan', 'mirrors'],\n tank: ['battery', 'alternator', 'gearbox', 'brakes', 'steering', 'oil_pan'],\n boat: ['battery', 'alternator', 'gearbox', 'steering'],\n plane: ['battery', 'alternator', 'brakes', 'steering', 'shocks'],\n heli: ['battery', 'alternator', 'gearbox'],\n}\n\n/** Chance (percent) that a vehicle of the kind has a tow hitch when neither the spec nor the options say. */\nconst HITCH_CHANCE: Record<Kind, number> = { car: 30, truck: 60, bus: 0, tractor: 100, quad: 40, bike: 0, tank: 0, boat: 0, plane: 0, heli: 0 }\n\nconst STEEL_KG_M2 = 7\nconst ALU_KG_M2 = 3.2\n\nexport const kindOf = (c: VehicleContext): Kind => {\n const k = c.meta.kind\n return (k && k in MECHANICS ? k : 'car') as Kind\n}\n\nconst side = (v: number): 'left' | 'right' => (v < 0 ? 'left' : 'right')\n\n/** Rough mass of the vehicle in kilograms from its size. */\nexport const vehicleMass = (c: VehicleContext): number => {\n const m = c.meta\n const L = m.length ?? 4\n const W = m.width ?? 1.7\n const H = m.bodyHeight ?? 0.7\n return clamp(L * W * H * 320, 90, 60000)\n}\n\nconst areaOf = (size: Vec3): number => {\n const s = [...size].sort((a, b) => b - a)\n return s[0] * s[1]\n}\n\nconst boxOf = (z: { box: { x0: number; x1: number; y0: number; y1: number; z0: number; z1: number } }): LocalBox => ({\n center: [(z.box.x0 + z.box.x1) / 2, (z.box.y0 + z.box.y1) / 2, (z.box.z0 + z.box.z1) / 2],\n size: [Math.max(0.02, z.box.x1 - z.box.x0), Math.max(0.02, z.box.y1 - z.box.y0), Math.max(0.02, z.box.z1 - z.box.z0)],\n})\n\n/** Panel material by vehicle kind: aircraft and boats are aluminium, the rest steel. */\nconst skinOf = (kind: Kind): MaterialId => (kind === 'plane' || kind === 'heli' || kind === 'boat' ? 'aluminium' : 'steel')\n\n/** The zone is a fender (a front or rear wing, not a door or a side panel). */\nconst isFender = (id: string): boolean => /^fender/.test(id)\n\nconst roleOfZone = (z: { id: string; type: string; sub?: string; fxKey?: string }): PartRole => {\n const sub = String(z.sub ?? z.id)\n if (z.type === 'part' || z.type === 'internal') {\n if (/^engine/.test(sub)) return 'engine'\n if (sub === 'radiator') return 'radiator'\n if (/fuel_tank/.test(sub)) return 'fuel_tank'\n if (sub === 'battery') return 'battery'\n }\n switch (z.type) {\n case 'door':\n return 'door'\n case 'hood':\n return 'hood'\n case 'lid':\n return 'lid'\n case 'roof':\n return 'roof'\n case 'bumper':\n return 'bumper'\n case 'glass':\n return 'glass'\n case 'light':\n return 'light'\n case 'wheel':\n return 'rim'\n case 'internal':\n if (/^engine/.test(sub)) return 'engine'\n if (sub === 'radiator') return 'radiator'\n if (/fuel_tank/.test(sub) || sub === 'tank') return 'fuel_tank'\n if (sub === 'battery') return 'battery'\n return 'frame'\n case 'panel':\n return isFender(z.id) ? 'fender' : 'panel'\n default:\n return 'other'\n }\n}\n\n/**\n * The frame hub is a thin floor pan under the cabin: wide enough to touch the wheels (so a wrench finds the wheel bolts), but low and short so\n * a bullet aimed at the tank or the engine does not hit it first.\n */\nconst floorPan = (b: LocalBox): LocalBox => ({\n center: [b.center[0], b.center[1] - b.size[1] / 2 + Math.min(0.14, b.size[1]) / 2 + 0.04, b.center[2]],\n size: [b.size[0] * 0.5, Math.min(0.14, b.size[1]), b.size[2] * 0.95],\n})\n\n/** Builds the part and joint model of a built vehicle. */\nexport function buildVehicleModel(kit: VehicleKit, c: VehicleContext, options: ModelOptions = {}): VehicleModel {\n const kind = kindOf(c)\n const m = c.meta\n const spec = c.spec as { fuel?: string; hitch?: boolean }\n const t = kit.t\n const skin = skinOf(kind)\n const armour = m.armored || m.bullet ? 12 : 1\n const mass = vehicleMass(c)\n const W = m.width ?? 1.7\n const F = m.front ?? 2\n const R = m.rear ?? -2\n const L = m.length ?? F - R\n const clearance = m.clearance ?? 0.3\n const belt = m.belt ?? clearance + (m.bodyHeight ?? 0.6)\n const electric = spec.fuel === 'electric'\n const fuelless = electric || spec.fuel === 'none'\n const parts: PartDef[] = []\n const joints: JointDef[] = []\n const ids = new Set<string>()\n\n const add = (p: Omit<PartDef, 'tags' | 'mechanical'> & { tags?: string[]; mechanical?: boolean }): PartDef => {\n let id = p.id\n for (let n = 2; ids.has(id); n++) id = `${p.id}_${n}`\n ids.add(id)\n const part: PartDef = { ...p, id, tags: p.tags ?? [], mechanical: p.mechanical ?? false }\n parts.push(part)\n return part\n }\n const join = (a: string, b: string, jk: keyof typeof JOINT_RULES, scale = 1): void => {\n const rule = JOINT_RULES[jk]\n joints.push({ id: `${a}~${b}`, a, b, kind: jk, strength: rule.strength * scale, tools: [...rule.tools], seconds: rule.seconds })\n }\n\n // ---- zones ------------------------------------------------------------------------------------------------------------------------------\n const zones = kit.zonesOf(c) as Array<any>\n const zoneOf = new Map<string, any>()\n for (const z of zones) zoneOf.set(z.id, z)\n\n const hasTankZone = zones.some((z) => roleOfZone(z) === 'fuel_tank')\n const hasRadiatorZone = zones.some((z) => roleOfZone(z) === 'radiator')\n const hubZone = zones.find((z) => z.id === 'underbody') ?? zones.find((z) => z.id === 'chassis')\n\n // the hub every joint hangs from: the underbody or chassis zone, else a frame part spanning the body\n const hubId = hubZone ? hubZone.id : 'chassis'\n\n for (const z of zones) {\n let role = roleOfZone(z)\n if (z === hubZone) role = 'frame'\n const box = boxOf(z)\n const area = areaOf(box.size)\n const id = z.id as string\n const label = String(z.name ?? id)\n const tags: string[] = [...(z.tags ?? [])]\n if (role === 'rim') {\n const wheels = (z.wheels ?? []) as any[]\n const r = Math.max(0.2, ...wheels.map((w) => w.userData?.r ?? 0.3))\n // the rim is the inner, smaller part of the wheel box: the tyre wraps it and the bolts are on the body side\n const sz = Math.sign(box.center[2]) || 1\n const rimBox: LocalBox = { center: [box.center[0], box.center[1], box.center[2] - sz * box.size[2] * 0.25], size: [box.size[0] * 0.7, box.size[1] * 0.7, box.size[2] * 0.5] }\n add({ id, role, name: label, material: kind === 'plane' || kind === 'heli' ? 'aluminium' : 'steel', box: rimBox, mass: 22 * r * Math.max(1, wheels.length), hp: 12000 * armour, zoneId: id, visual: kind !== 'plane' && !/landing/.test(id), tags: ['wheel', ...tags] })\n const tyreId = id.replace(/^wheels?/, 'tyre').replace(/^(?!tyre)/, 'tyre_')\n const tyreBox: LocalBox = { center: box.center, size: [box.size[0] * 0.98, box.size[1] * 0.98, box.size[2]] }\n add({\n id: tyreId,\n role: 'tyre',\n name: t('mechanics.tyre', { zone: label }),\n material: 'rubber',\n box: tyreBox,\n mass: 38 * r * Math.max(1, wheels.length),\n hp: 6000,\n ignitionC: 350,\n visual: wheels.length > 0 && !/landing/.test(id),\n mechanical: true,\n tags: ['tyre', 'wheel'],\n zoneId: id,\n })\n continue\n }\n if (role === 'glass') {\n const glass = (z.glass ?? [])[0]\n const laminated = glass?.userData?.glass?.type === 'laminated' || m.bullet\n add({ id, role, name: label, material: 'glass', box, mass: 10 * area, hp: laminated ? 4000 : 450, zoneId: id, visual: false, tags: ['glass', ...tags] })\n continue\n }\n if (role === 'light') {\n add({ id, role, name: label, material: 'glass', box, mass: 1.2 + 4 * area, hp: 320, zoneId: id, visual: true, tags: ['light', ...tags] })\n continue\n }\n if (role === 'bumper') {\n add({ id, role, name: label, material: 'plastic', box, mass: 6 + 5 * area, hp: 9000, ignitionC: 400, zoneId: id, visual: true, tags: ['bumper', ...tags] })\n continue\n }\n if (role === 'engine') {\n const kg = { bike: 55, quad: 90, car: 150, tractor: 450, truck: 600, bus: 450, tank: 900, boat: 90, plane: 160, heli: 150 }[kind]\n add({ id, role, name: label, material: kind === 'plane' || kind === 'heli' ? 'aluminium' : 'steel', box, mass: kg, hp: 60000 * armour, ignitionC: 260, zoneId: id, visual: false, tags: ['engine', ...tags] })\n continue\n }\n if (role === 'radiator') {\n add({ id, role, name: label, material: 'aluminium', box, mass: 8, hp: 3000, zoneId: id, visual: false, contains: { fluid: 'coolant', liters: kind === 'truck' || kind === 'bus' ? 18 : 7, pressurized: true }, tags: ['radiator', ...tags] })\n continue\n }\n if (role === 'fuel_tank') {\n if (fuelless) {\n add({ id, role: 'other', name: label, material: 'steel', box, mass: 20, hp: 25000, zoneId: id, visual: false, tags })\n continue\n }\n const liters = { bike: 14, quad: 16, car: 55, tractor: 150, truck: 300, bus: 200, tank: 600, boat: 90, plane: 120, heli: 300 }[kind]\n const diesel = spec.fuel === 'diesel'\n add({\n id,\n role,\n name: label,\n material: 'steel',\n box,\n mass: 14 + liters * 0.8,\n hp: 25000 * armour,\n zoneId: id,\n visual: false,\n contains: { fluid: diesel ? 'diesel' : 'fuel', liters },\n explodes: diesel ? undefined : { energy: 1.2e6 * (liters / 55), radius: 5 + liters / 30, atC: 320 },\n ignitionC: diesel ? 330 : 260,\n tags: ['fuel_tank', ...tags],\n })\n continue\n }\n if (role === 'battery') {\n add({ id, role, name: label, material: 'plastic', box, mass: 14, hp: 1500, zoneId: id, visual: true, ignitionC: 200, tags: ['battery', ...tags] })\n continue\n }\n if (role === 'frame') {\n add({ id, role, name: label, material: 'steel', box: floorPan(box), mass: mass * 0.25, hp: 150000 * armour, zoneId: id, visual: false, tags: ['frame', ...tags] })\n continue\n }\n const roofLike = role === 'roof'\n const kg = (skin === 'steel' ? STEEL_KG_M2 : ALU_KG_M2) * area * (role === 'door' ? 1.6 : 1)\n add({\n id,\n role,\n name: label,\n material: skin,\n box,\n mass: Math.max(2, kg),\n hp: (roofLike ? 30000 : 20000) * armour,\n zoneId: id,\n visual: role === 'door' || role === 'hood' || role === 'lid' || role === 'fender',\n tags: [role, ...tags],\n })\n }\n\n // the hub is a synthetic frame part when the vehicle has no underbody or chassis zone\n if (!hubZone) {\n const h = Math.max(0.15, belt - clearance)\n add({\n id: hubId,\n role: 'frame',\n name: t('mechanics.chassis'),\n material: 'steel',\n box: floorPan({ center: [(F + R) / 2, clearance + h * 0.45, 0], size: [Math.max(0.4, L * 0.8), h * 0.7, Math.max(0.2, W * 0.9)] }),\n mass: mass * 0.25,\n hp: 150000 * armour,\n visual: false,\n mechanical: true,\n tags: ['frame'],\n })\n }\n\n // ---- mechanical parts the zones do not cover ---------------------------------------------------------------------------------------------\n const mech = new Set(MECHANICS[kind])\n const wheelParts = parts.filter((p) => p.role === 'rim')\n const frontX = wheelParts.length ? Math.max(...wheelParts.map((p) => p.box.center[0])) : F - L * 0.2\n const rearX = wheelParts.length ? Math.min(...wheelParts.map((p) => p.box.center[0])) : R + L * 0.2\n const wheelR = wheelParts.length ? Math.max(...wheelParts.map((p) => p.box.size[1] / 2)) : 0.3\n const heightCenter = (F + R) / 2\n\n // engine (some vehicles have no engine zone: bus, tank)\n let engine = parts.find((p) => p.role === 'engine')\n if (!engine && !electric && kind !== 'bike') {\n const ex = kind === 'bus' ? frontX + 0.4 : kind === 'tank' ? R + L * 0.15 : F - L * 0.2\n engine = add({\n id: 'engine',\n role: 'engine',\n name: t('mechanics.engine'),\n material: skin,\n box: { center: [ex, clearance + 0.4, 0], size: [Math.min(1.1, L * 0.2), 0.6, Math.min(0.9, W * 0.45)] },\n mass: 300,\n hp: 60000 * armour,\n ignitionC: 260,\n visual: false,\n mechanical: true,\n tags: ['engine'],\n })\n }\n const ec = engine ? engine.box.center : ([F - L * 0.2, clearance + 0.4, 0] as Vec3)\n const es = engine ? engine.box.size : ([0.8, 0.5, 0.6] as Vec3)\n\n if (!hasTankZone && !fuelless && kind !== 'bike') {\n const liters = { bike: 14, quad: 16, car: 55, tractor: 150, truck: 300, bus: 200, tank: 600, boat: 90, plane: 120, heli: 300 }[kind]\n const diesel = spec.fuel === 'diesel'\n add({\n id: 'fuel_tank',\n role: 'fuel_tank',\n name: t('mechanics.fuel_tank'),\n material: 'steel',\n box: { center: [R + L * 0.25, clearance + 0.12, W * 0.15], size: [Math.min(1, L * 0.2), 0.3, Math.min(0.6, W * 0.35)] },\n mass: 14 + liters * 0.8,\n hp: 25000 * armour,\n visual: false,\n mechanical: true,\n contains: { fluid: diesel ? 'diesel' : 'fuel', liters },\n explodes: diesel ? undefined : { energy: 1.2e6 * (liters / 55), radius: 5 + liters / 30, atC: 320 },\n ignitionC: diesel ? 330 : 260,\n tags: ['fuel_tank'],\n })\n }\n if (!hasRadiatorZone && engine && (kind === 'car' || kind === 'truck' || kind === 'bus' || kind === 'tractor' || kind === 'tank')) {\n add({\n id: 'radiator',\n role: 'radiator',\n name: t('mechanics.radiator'),\n material: 'aluminium',\n box: { center: [ec[0] + es[0] / 2 + 0.06, ec[1], 0], size: [0.1, Math.max(0.2, es[1] * 0.8), Math.max(0.3, es[2] * 1.1)] },\n mass: 8,\n hp: 3000,\n visual: false,\n mechanical: true,\n contains: { fluid: 'coolant', liters: 7, pressurized: true },\n tags: ['radiator'],\n })\n }\n if (mech.has('oil_pan') && !fuelless && kind !== 'bike' && engine) {\n add({\n id: 'oil_pan',\n role: 'oil_pan',\n name: t('mechanics.oil_pan'),\n material: 'aluminium',\n box: { center: [ec[0], Math.max(clearance * 0.5, ec[1] - es[1] / 2 - 0.02), ec[2]], size: [es[0] * 0.8, 0.1, es[2] * 0.8] },\n mass: 5,\n hp: 3000,\n visual: false,\n mechanical: true,\n contains: { fluid: 'oil', liters: kind === 'truck' || kind === 'bus' || kind === 'tank' ? 30 : 4.5 },\n tags: ['oil_pan'],\n })\n } else if (mech.has('oil_pan') && !fuelless && kind === 'bike') {\n add({\n id: 'oil_pan',\n role: 'oil_pan',\n name: t('mechanics.oil_pan'),\n material: 'aluminium',\n box: { center: [ec[0], Math.max(0.12, clearance * 0.5), 0], size: [0.3, 0.08, 0.2] },\n mass: 2,\n hp: 2000,\n visual: false,\n mechanical: true,\n contains: { fluid: 'oil', liters: 1.8 },\n tags: ['oil_pan'],\n })\n }\n const hasBatteryZone = parts.some((p) => p.role === 'battery')\n if (mech.has('battery') && !hasBatteryZone) {\n // under the hood at the corner of the engine bay; vehicles without a hood carry it on the frame\n const big = electric ? 1 : 0\n add({\n id: 'battery',\n role: 'battery',\n name: t('mechanics.battery'),\n material: 'plastic',\n box: { center: [ec[0] + es[0] * 0.3, ec[1] + es[1] * 0.3, Math.min(W * 0.28, ec[2] + es[2] * 0.6)], size: big ? [1.2, 0.18, 0.7] : [0.26, 0.2, 0.17] },\n mass: big ? 300 : 14,\n hp: big ? 6000 : 1500,\n ignitionC: 200,\n visual: !big,\n mechanical: true,\n tags: ['battery'],\n })\n }\n if (mech.has('alternator')) {\n add({\n id: 'alternator',\n role: 'alternator',\n name: t('mechanics.alternator'),\n material: 'aluminium',\n box: { center: [ec[0] + es[0] * 0.3, ec[1] - es[1] * 0.2, ec[2] - es[2] * 0.55], size: [0.16, 0.16, 0.16] },\n mass: 6,\n hp: 3000,\n visual: false,\n mechanical: true,\n tags: ['alternator'],\n })\n }\n if (mech.has('gearbox')) {\n add({\n id: 'gearbox',\n role: 'gearbox',\n name: t('mechanics.gearbox'),\n material: skin,\n box: { center: [ec[0] - es[0] / 2 - 0.3, ec[1] - es[1] * 0.2, ec[2]], size: [kind === 'bike' ? 0.3 : 0.6, 0.32, kind === 'bike' ? 0.22 : 0.36] },\n mass: kind === 'bike' ? 18 : 60,\n hp: 20000 * armour,\n visual: false,\n mechanical: true,\n tags: ['gearbox'],\n })\n }\n if (mech.has('brakes')) {\n add({\n id: 'brakes',\n role: 'brakes',\n name: t('mechanics.brakes'),\n material: 'steel',\n box: { center: [frontX, wheelR * 0.9, 0], size: [0.22, 0.2, Math.max(0.2, W * 0.78)] },\n mass: 14,\n hp: 8000,\n visual: false,\n mechanical: true,\n tags: ['brakes'],\n })\n }\n if (mech.has('steering')) {\n add({\n id: 'steering',\n role: 'steering',\n name: t('mechanics.steering'),\n material: 'steel',\n box: { center: [frontX - 0.2, wheelR * 1.15, 0], size: [0.14, 0.14, Math.max(0.2, W * 0.5)] },\n mass: 12,\n hp: 8000,\n visual: false,\n mechanical: true,\n tags: ['steering'],\n })\n }\n if (mech.has('shocks')) {\n add({\n id: 'shock_absorbers',\n role: 'shocks',\n name: t('mechanics.shock_absorbers'),\n material: 'steel',\n box: { center: [rearX + 0.1, wheelR * 1.1, 0], size: [0.18, 0.3, Math.max(0.2, W * 0.8)] },\n mass: 14,\n hp: 8000,\n visual: false,\n mechanical: true,\n tags: ['suspension'],\n })\n }\n // tow hitch: the spec flag, else the option, else a seeded choice by kind\n const chance = HITCH_CHANCE[kind]\n const seeded = strHash(`${c.seedKey ?? c.key}|hitch`) % 100 < chance\n const hitch = options.hitch ?? (typeof spec.hitch === 'boolean' ? spec.hitch : seeded)\n if (hitch && chance > 0) {\n add({\n id: 'tow_hitch',\n role: 'hitch',\n name: t('mechanics.tow_hitch'),\n material: 'steel',\n box: { center: [R - 0.14, clearance + 0.16, 0], size: [0.34, 0.12, 0.16] },\n mass: 9,\n hp: 6000,\n visual: true,\n mechanical: true,\n tags: ['hitch'],\n })\n }\n // mirrors: the housing and the arm seen on the front door, or generated on the glasshouse\n if (mech.has('mirrors')) {\n const gh = m.glasshouse as { fb?: number } | undefined\n const mx = gh?.fb != null ? gh.fb - 0.3 : kind === 'bike' ? F - L * 0.3 : F - L * 0.28\n const half = kind === 'bike' || kind === 'quad' ? 0.28 : W / 2 + 0.1\n const my = kind === 'bike' || kind === 'quad' ? (m.top ?? belt + 0.25) - 0.1 : belt + 0.12\n for (const s of [-1, 1] as const) {\n const door = zones.find((z) => z.type === 'door' && z.side === s && (z.mirrors ?? []).length)\n let box: LocalBox = { center: [mx, my, s * half], size: [0.14, 0.12, 0.2] }\n if (door) {\n // the objects of the vehicle: use the box that wraps them\n const bb = (door.mirrors as any[]).reduce(\n (acc: [number, number, number, number, number, number] | null, o: any) => {\n const w = new (kit.THREE.Box3 as any)().setFromObject(o)\n const inv = new (kit.THREE.Matrix4 as any)().copy(c.vehicle.matrixWorld).invert()\n w.applyMatrix4(inv)\n const cur: [number, number, number, number, number, number] = [w.min.x, w.max.x, w.min.y, w.max.y, w.min.z, w.max.z]\n if (!acc) return cur\n return [Math.min(acc[0], cur[0]), Math.max(acc[1], cur[1]), Math.min(acc[2], cur[2]), Math.max(acc[3], cur[3]), Math.min(acc[4], cur[4]), Math.max(acc[5], cur[5])]\n },\n null,\n )\n if (bb) box = { center: [(bb[0] + bb[1]) / 2, (bb[2] + bb[3]) / 2, (bb[4] + bb[5]) / 2], size: [Math.max(0.06, bb[1] - bb[0]), Math.max(0.06, bb[3] - bb[2]), Math.max(0.06, bb[5] - bb[4])] }\n }\n add({\n id: `mirror_${side(s)}`,\n role: 'mirror',\n name: t('mechanics.mirror', { side: t(`sides.${side(s)}`), sideM: t(`sides.${side(s)}M`) }),\n material: 'plastic',\n box,\n mass: 1.1,\n hp: 1500,\n ignitionC: 400,\n visual: true,\n mechanical: true,\n tags: ['mirror', side(s)],\n })\n }\n }\n // pillars of a car: welded to the frame and to the roof\n const gh = m.glasshouse as { fb?: number; rb?: number; roof?: number; belt?: number; Wg?: number } | undefined\n if (kind === 'car' && gh && gh.fb != null && gh.rb != null && gh.roof != null && zones.some((z) => z.type === 'roof')) {\n const b0 = gh.belt ?? belt\n const hw = (gh.Wg ?? W * 0.9) / 2\n for (const [name, x] of [\n ['pillar_a', gh.fb - 0.12],\n ['pillar_c', gh.rb + 0.12],\n ] as const) {\n for (const s of [-1, 1] as const) {\n add({\n id: `${name}_${side(s)}`,\n role: 'pillar',\n name: t(`mechanics.${name}`, { side: t(`sides.${side(s)}`), sideM: t(`sides.${side(s)}M`) }),\n material: 'steel',\n box: { center: [x, (b0 + gh.roof) / 2, s * (hw - 0.04)], size: [0.07, Math.max(0.2, gh.roof - b0), 0.07] },\n mass: 7,\n hp: 40000 * armour,\n visual: false,\n mechanical: true,\n tags: ['pillar', side(s)],\n })\n }\n }\n }\n void heightCenter\n\n // ---- joints --------------------------------------------------------------------------------------------------------------------------------\n const has = (id: string): boolean => ids.has(id)\n const roofPart = parts.find((p) => p.role === 'roof')\n for (const p of parts) {\n if (p.id === hubId) continue\n switch (p.role) {\n case 'door':\n case 'hood':\n case 'lid':\n join(p.id, hubId, 'hinge')\n break\n case 'fender':\n join(p.id, hubId, 'bolt')\n break\n case 'bumper':\n case 'light':\n case 'battery':\n case 'hitch':\n case 'steering':\n case 'shocks':\n case 'engine':\n case 'radiator':\n case 'fuel_tank':\n case 'brakes':\n join(p.id, hubId, 'bolt')\n break\n case 'rim':\n join(p.id, hubId, 'bolt')\n break\n case 'glass':\n join(p.id, hubId, 'glue')\n break\n case 'tyre': {\n const rim = parts.find((q) => q.role === 'rim' && q.zoneId === p.zoneId)\n if (rim) join(p.id, rim.id, 'clip')\n break\n }\n case 'mirror': {\n const door = parts.find((q) => q.role === 'door' && q.tags.includes(p.tags[1] ?? ''))\n join(p.id, door ? door.id : hubId, 'bolt', 0.4)\n break\n }\n case 'alternator':\n case 'gearbox':\n case 'oil_pan':\n join(p.id, engine ? engine.id : hubId, 'bolt')\n break\n case 'pillar':\n join(p.id, hubId, 'weld')\n if (roofPart) join(roofPart.id, p.id, 'weld')\n break\n case 'roof':\n if (!parts.some((q) => q.role === 'pillar')) join(p.id, hubId, 'weld')\n break\n case 'panel':\n case 'other':\n join(p.id, hubId, p.tags.includes('left') || p.tags.includes('right') ? 'weld' : 'bolt')\n break\n default:\n break\n }\n }\n void has\n return { parts, joints, hub: hubId, hitch }\n}\n","/**\n * What the player sees of the destruction model: hinged door and lid panels, the battery, tow hitch and mirrors that the zones do not draw,\n * bullet holes, lights out, tyres that melt and the parts that come off and fall.\n *\n * It only uses the kit (`kit._` helpers such as `fling`, `cutPanel`, `pivotOf`), so a part that comes off is flung with the same ballistic\n * animation the explosion uses, and a vehicle that is rebuilt (`reset`) gets a fresh set of meshes.\n */\nimport type { VehicleContext, VehicleKit } from '../api'\nimport type { PartDef, VehicleModel } from './model'\n\ntype Obj = any\n\nexport interface DetachOptions {\n /** `tool` drops the part gently, `break` throws it. */\n by: 'tool' | 'break'\n /** Impulse direction in `c.vehicle` coordinates (default: away from the vehicle centre). */\n away?: [number, number, number]\n}\n\nexport class VehicleVisuals {\n readonly kit: VehicleKit\n readonly c: VehicleContext\n readonly model: VehicleModel\n private readonly I: Record<string, any>\n private readonly THREE: any\n private readonly byId = new Map<string, PartDef>()\n /** Meshes created for parts the vehicle does not draw (battery, hitch, generated mirrors). */\n private readonly extra = new Map<string, Obj[]>()\n /** Hinged panels created for the doors and the lid, by part id. */\n readonly plates = new Map<string, Obj>()\n private readonly gone = new Set<string>()\n private lightsOn = true\n readonly hood: { id: string; open: number; sign: number } | null\n\n constructor(kit: VehicleKit, c: VehicleContext, model: VehicleModel) {\n this.kit = kit\n this.c = c\n this.model = model\n this.I = (kit as any)._\n this.THREE = kit.THREE\n for (const p of model.parts) this.byId.set(p.id, p)\n c.root.updateMatrixWorld(true)\n this.hood = this.nameHood()\n for (const p of model.parts) {\n if (p.role === 'door' || p.role === 'lid') this.makePlate(p)\n else if (p.role === 'mirror' && !this.mirrorObjects(p).length) this.makeMirror(p)\n else if (p.role === 'battery' && p.mechanical) this.makeBattery(p)\n else if (p.role === 'hitch') this.makeHitch(p)\n }\n }\n\n // ---- lookups -----------------------------------------------------------------------------------------------------------------------------\n private zone(p: PartDef): any {\n return p.zoneId ? (this.kit.zonesOf(this.c) as any[]).find((z) => z.id === p.zoneId) : undefined\n }\n private nameHood() {\n const c: any = this.c\n if (!c.hood) return null\n const z = (this.kit.zonesOf(this.c) as any[]).find((q) => q.type === 'hood')\n const id = z ? z.id : this.model.parts.find((p) => p.role === 'hood')?.id\n if (!id) return null\n c.hood.piv.name = id\n return { id, open: c.hood.open as number, sign: (c.hood.sign || 1) as number }\n }\n private mirrorObjects(p: PartDef): Obj[] {\n const own = this.extra.get(p.id)\n if (own) return own\n const door = (this.kit.zonesOf(this.c) as any[]).find((z) => z.type === 'door' && p.tags.includes(z.side < 0 ? 'left' : 'right') && (z.mirrors ?? []).length)\n return door ? (door.mirrors as Obj[]).filter((o) => o.parent) : []\n }\n\n /** The objects that make a part, as they are now (empty when the part has no visible mesh or it has already come off). */\n objectsOf(partId: string): Obj[] {\n const p = this.byId.get(partId)\n if (!p || this.gone.has(partId)) return []\n const z = this.zone(p)\n switch (p.role) {\n case 'door':\n case 'lid': {\n const g = this.plates.get(p.id)\n return g && g.parent ? [g] : []\n }\n case 'hood':\n return (this.c as any).hood && this.hood?.id === p.id ? [(this.c as any).hood.piv] : []\n case 'bumper':\n return z ? (z.owned as Obj[]).filter((o) => o.parent) : []\n case 'light':\n return z ? (z.lights as any[]).map((L) => L.group).filter((g) => g && g.parent) : []\n case 'rim':\n return z ? (z.wheels as Obj[]).filter((o) => o.parent) : []\n case 'tyre': {\n const zz = this.zone(p)\n return zz ? (zz.wheels as Obj[]).flatMap((w) => (this.I.tireMeshes(w) as Obj[]).filter((m) => m.parent)) : []\n }\n case 'mirror':\n return this.mirrorObjects(p)\n default:\n return (this.extra.get(p.id) ?? []).filter((o) => o.parent)\n }\n }\n\n // ---- generated meshes --------------------------------------------------------------------------------------------------------------------\n private paint(): any {\n return this.c.paint(this.c.meta.color || '#777777')\n }\n private box(w: number, h: number, d: number, mat: any, x: number, y: number, z: number, parent?: Obj): Obj {\n const m = new this.THREE.Mesh(new this.THREE.BoxGeometry(w, h, d), mat)\n m.position.set(x, y, z)\n m.castShadow = true\n ;(parent ?? this.c.vehicle).add(m)\n return m\n }\n private surface(axis: 'x' | 'z', sign: number, B: any, samples: Array<[number, number]>): number | null {\n // ray from outside towards the vehicle at a few points of the panel; the median hit is the skin\n const V3 = this.THREE.Vector3\n const hits: number[] = []\n const far = 3\n for (const [u, v] of samples) {\n const o = axis === 'z' ? new V3(u, v, sign * (Math.max(Math.abs(B.z0), Math.abs(B.z1)) + 1)) : new V3(sign * (Math.max(Math.abs(B.x0), Math.abs(B.x1)) + 1), u, v)\n const d = axis === 'z' ? new V3(0, 0, -sign) : new V3(-sign, 0, 0)\n const h = this.I.probe(this.c, o, d, far)\n if (h) hits.push(axis === 'z' ? h.p.z : h.p.x)\n }\n if (!hits.length) return null\n hits.sort((a, b) => a - b)\n return hits[Math.floor(hits.length / 2)]\n }\n /** A thin panel hinged on the door (front edge) or the lid (top edge), over a dark recess so the opening shows when it swings. */\n private makePlate(p: PartDef): void {\n const z = this.zone(p)\n if (!z) return\n const B = z.box\n const THREE = this.THREE\n const mats = this.I.MATERIALS\n const grid = (a0: number, a1: number, b0: number, b1: number): Array<[number, number]> => {\n const out: Array<[number, number]> = []\n for (const fa of [0.25, 0.5, 0.75]) for (const fb of [0.3, 0.7]) out.push([a0 + (a1 - a0) * fa, b0 + (b1 - b0) * fb])\n return out\n }\n if (p.role === 'door') {\n const s = z.side < 0 ? -1 : 1\n const sk = this.surface('z', s, B, grid(B.x0, B.x1, B.y0, B.y1))\n if (sk == null) return\n const len = B.x1 - B.x0 - 0.06\n const hgt = B.y1 - B.y0 - 0.1\n const hingeFront = z.hinge !== 'rear'\n const hx = hingeFront ? B.x1 - 0.03 : B.x0 + 0.03\n const cy = (B.y0 + B.y1) / 2\n const recess = this.box(len - 0.04, hgt - 0.04, 0.01, mats.dark, (B.x0 + B.x1) / 2, cy, sk + s * 0.004)\n recess.userData.noFollow = true\n const piv = new THREE.Group()\n piv.name = p.id\n piv.position.set(hx, cy, sk + s * 0.016)\n piv.userData.rigid = true\n this.c.vehicle.add(piv)\n this.box(len, hgt, 0.022, this.paint(), hingeFront ? -len / 2 : len / 2, 0, 0, piv)\n this.plates.set(p.id, piv)\n this.extra.set(`recess_${p.id}`, [recess])\n } else {\n // the lid is the rear panel: it hinges on its top edge and lifts away from the body\n const sk = this.surface('x', -1, B, grid(B.y0, B.y1, B.z0, B.z1))\n if (sk == null) return\n const wy = B.y1 - B.y0 - 0.1\n const wz = B.z1 - B.z0 - 0.1\n const recess = this.box(0.01, wy - 0.04, wz - 0.04, mats.dark, sk + 0.004, (B.y0 + B.y1) / 2, 0)\n recess.userData.noFollow = true\n const piv = new THREE.Group()\n piv.name = p.id\n piv.position.set(sk - 0.016, B.y1 - 0.05, 0)\n piv.userData.rigid = true\n this.c.vehicle.add(piv)\n this.box(0.022, wy, wz, this.paint(), 0, -wy / 2, 0, piv)\n this.plates.set(p.id, piv)\n this.extra.set(`recess_${p.id}`, [recess])\n }\n }\n private makeMirror(p: PartDef): void {\n const [cx, cy, cz] = p.box.center\n const s = cz < 0 ? -1 : 1\n const mats = this.I.MATERIALS\n const g = new this.THREE.Group()\n g.name = `obj_${p.id}`\n g.position.set(cx, cy, cz)\n this.c.vehicle.add(g)\n this.box(0.05, 0.04, 0.1, mats.dark, 0, -0.04, -s * 0.07, g)\n const housing = this.box(0.1, 0.12, 0.05, mats.plastic ?? mats.dark, 0, 0, s * 0.02, g)\n housing.userData.mirrorHousing = true\n const glass = this.box(0.095, 0.1, 0.006, mats.chrome ?? mats.dark, 0, 0, s * 0.048, g)\n glass.userData.mirrorGlass = true\n g.userData.rigid = true\n this.extra.set(p.id, [g])\n }\n private makeBattery(p: PartDef): void {\n const mats = this.I.MATERIALS\n const g = new this.THREE.Group()\n g.position.set(...p.box.center)\n this.c.vehicle.add(g)\n this.box(p.box.size[0], p.box.size[1] * 0.85, p.box.size[2], this.I.makeMaterial('#2b2f33', { roughness: 0.6 }), 0, 0, 0, g)\n this.box(0.035, 0.04, 0.035, mats.chrome ?? mats.dark, -p.box.size[0] * 0.3, p.box.size[1] * 0.5, 0, g)\n this.box(0.035, 0.04, 0.035, this.I.makeMaterial('#b3261e', { roughness: 0.5 }), p.box.size[0] * 0.3, p.box.size[1] * 0.5, 0, g)\n g.userData.noFollow = true\n this.extra.set(p.id, [g])\n }\n private makeHitch(p: PartDef): void {\n const mats = this.I.MATERIALS\n const g = new this.THREE.Group()\n g.position.set(...p.box.center)\n this.c.vehicle.add(g)\n this.box(0.3, 0.05, 0.08, mats.steel, 0, 0, 0, g)\n const ball = new this.THREE.Mesh(new this.THREE.SphereGeometry(0.035, 12, 8), mats.chrome ?? mats.steel)\n ball.position.set(-0.12, 0.06, 0)\n g.add(ball)\n g.userData.noFollow = true\n this.extra.set(p.id, [g])\n }\n\n // ---- marks -------------------------------------------------------------------------------------------------------------------------------\n /** A bullet hole: a dark disc lying on the surface at `point` (`c.vehicle` coordinates). */\n holeDecal(point: [number, number, number], normal: [number, number, number], diameter: number): void {\n const THREE = this.THREE\n const m = new THREE.Mesh(new THREE.CircleGeometry(Math.max(0.006, diameter / 2), 10), this.I.MATERIALS.dark)\n const n = new THREE.Vector3(...normal)\n m.position.set(...point).addScaledVector(n, 0.004)\n m.lookAt(m.position.clone().add(n))\n m.userData.decal = true\n m.userData.noFollow = true\n m.raycast = () => {}\n this.c.vehicle.add(m)\n }\n spark(point: [number, number, number], dir: [number, number, number], count = 8): void {\n const V3 = this.THREE.Vector3\n this.I.burst(this.c, 'spark', this.c.toEffects(new V3(...point)), count, { dir: this.c.dirToEffects(new V3(...dir).negate()), speed: 2.5, spread: 1.4 })\n }\n\n // ---- states ------------------------------------------------------------------------------------------------------------------------------\n /** Headlights and taillights on or off (a dead battery or a missing alternator). */\n setLights(on: boolean): void {\n if (on === this.lightsOn) return\n this.lightsOn = on\n const dark = this.I.MATERIALS.bulbBroken\n for (const L of this.c.lights as any[]) {\n if (L.broken) continue\n for (const h of L.halo ?? []) h.visible = on\n for (const m of L.inner ?? []) {\n if (on) {\n if (m.userData.litMat) m.material = m.userData.litMat\n } else {\n if (!m.userData.litMat) m.userData.litMat = m.material\n m.material = dark\n }\n }\n }\n }\n /** The lens of a light breaks and its unit stays (damaged) or goes (destroyed). */\n breakLight(p: PartDef, gone: boolean): void {\n const z = this.zone(p)\n if (!z) return\n for (const L of z.lights as any[]) {\n this.kit.breakLight(this.c, L, new this.THREE.Vector3(p.box.center[0] > 0 ? -1 : 1, 0, 0))\n if (gone) {\n if (L.group) L.group.visible = false\n L.broken = 'gone'\n }\n }\n if (gone) this.gone.add(p.id)\n }\n /** Glass: cracks (laminated) or shatters (tempered); returns whether it broke. */\n hitGlass(p: PartDef, point: [number, number, number], dir: [number, number, number], force: number): boolean {\n const z = this.zone(p)\n if (!z) return false\n const V3 = this.THREE.Vector3\n const list = (z.glass as Obj[]).filter((g) => g.parent && g.visible)\n if (!list.length) return false\n const pt = new V3(...point)\n let best = list[0]\n let bd = Infinity\n for (const g of list) {\n g.geometry.computeBoundingBox()\n const bb = g.geometry.boundingBox.clone().applyMatrix4(g.matrix)\n const d = bb.distanceToPoint(pt)\n if (d < bd) {\n bd = d\n best = g\n }\n }\n this.kit.hitGlass(this.c, best, pt, new V3(...dir), force)\n return !!best.userData.glass?.broken\n }\n glassBreak(p: PartDef): void {\n const z = this.zone(p)\n if (!z) return\n for (const g of z.glass as Obj[]) if (g.parent && g.visible) this.I.glassBand(this.c, z, g, 4)\n this.gone.add(p.id)\n }\n tyreFlat(p: PartDef, k: number): void {\n const z = this.zone(p)\n if (!z) return\n for (const w of z.wheels as Obj[]) if (w.parent) this.I.flattenTire(w, k)\n }\n /** Burning rubber: the tyre sags and goes black as it melts. */\n tyreMelt(p: PartDef, melt: number): void {\n const z = this.zone(p)\n if (!z) return\n for (const w of z.wheels as Obj[]) {\n if (!w.parent) continue\n for (const m of this.I.tireMeshes(w) as Obj[]) {\n if (!m.userData.charred) {\n m.userData.charred = true\n m.material = this.I.BURNT_RUB\n }\n }\n this.I.flattenTire(w, Math.min(0.5, 0.12 + 0.38 * melt))\n }\n }\n /** Moves the panel of a lost zone out of the body (the kit's torn-off look). */\n tearOff(p: PartDef): void {\n const z = this.zone(p)\n if (!z) return\n const dirty = new Set<Obj>()\n try {\n if (z.type === 'hood') this.I.hoodBand(this.c, z, 4, dirty)\n else this.I.panelBand(this.c, z, 4, dirty)\n } catch {\n // a zone with nothing to cut\n }\n dirty.forEach((msh) => {\n const g = msh.geometry\n if (g.userData.crease || !g.index) this.I.crease(g, 42)\n else g.computeVertexNormals()\n g.computeBoundingSphere()\n g.computeBoundingBox()\n })\n this.gone.add(p.id)\n }\n\n // ---- parts coming off --------------------------------------------------------------------------------------------------------------------\n private outward(p: PartDef, away?: [number, number, number]): any {\n const V3 = this.THREE.Vector3\n if (away) return new V3(...away).normalize()\n const m = this.c.meta\n const cx = ((m.front ?? 1) + (m.rear ?? -1)) / 2\n const v = new V3(p.box.center[0] - cx, 0, p.box.center[2])\n if (v.lengthSq() < 1e-4) v.set(0, 0, 1)\n return v.normalize()\n }\n private fling(obj: Obj, v: any, w: any, trail: number): void {\n const piece = this.I.fling(this.c, obj, v, w)\n if (piece) piece.trail = trail\n }\n /** Brings a part off the vehicle and throws it. Returns whether something visible moved. */\n detach(p: PartDef, o: DetachOptions): boolean {\n if (this.gone.has(p.id)) return false\n const V3 = this.THREE.Vector3\n const c: any = this.c\n const out = this.outward(p, o.away)\n const gentle = o.by === 'tool'\n const speed = gentle ? 0.7 : 3.2\n const up = gentle ? 0.4 : 3.5\n const vel = (k = 1) => c.dirToEffects(new V3(out.x * speed * k, up * k, out.z * speed * k))\n const spin = () => new V3((gentle ? 0.3 : 4) * (out.z || 1), (gentle ? 0.2 : 2) * (out.x || 1), (gentle ? 0.3 : 5) * (out.x || -1))\n const trail = 0\n let moved = false\n this.gone.add(p.id)\n switch (p.role) {\n case 'door':\n case 'lid':\n case 'mirror':\n case 'battery':\n case 'hitch':\n case 'light': {\n if (p.role === 'battery') {\n // out of the engine bay: the hood pops a little so it is seen leaving\n if (c.hood) c.hood.latch = Math.max(c.hood.latch, 0.35)\n }\n for (const obj of this.objectsOfGone(p)) {\n this.fling(obj, p.role === 'battery' ? c.dirToEffects(new V3(0.6, 4.2, out.z * 1.2)) : vel(), spin(), trail)\n moved = true\n }\n if (p.role === 'light') {\n const z = this.zone(p)\n for (const L of (z?.lights ?? []) as any[]) {\n L.broken = L.broken || true\n for (const h of L.halo ?? []) h.visible = false\n }\n }\n break\n }\n case 'hood':\n if (c.hood && this.hood?.id === p.id) {\n this.fling(c.hood.piv, c.dirToEffects(new V3(1.2, 6.5, 0)), new V3(0, 0.5, 3), trail)\n c.hood = null\n c.parts.forEach((q: any) => {\n if (q.kind === 'hood') q.done = true\n })\n moved = true\n }\n break\n case 'bumper': {\n const z = this.zone(p)\n const objs = this.objectsOfGone(p)\n const todo = new Set<Obj>()\n for (const obj of objs) todo.add(obj.parent && obj.parent !== c.vehicle && obj.parent.userData.rigid ? obj.parent : obj)\n if (!todo.size && z) for (const q of this.cutZone(z)) todo.add(q)\n for (const obj of todo) {\n const di = c.deform.indexOf(obj)\n if (di >= 0) c.deform.splice(di, 1)\n this.fling(obj, vel(), spin(), trail)\n moved = true\n }\n break\n }\n case 'fender': {\n const z = this.zone(p)\n if (z) for (const q of this.cutZone(z)) {\n this.fling(q, vel(), spin(), trail)\n moved = true\n }\n break\n }\n case 'rim': {\n const z = this.zone(p)\n for (const w of this.objectsOfGone(p)) {\n const i = c.wheels.indexOf(w)\n if (i >= 0) c.wheels.splice(i, 1)\n c.parts.forEach((q: any) => {\n if (q.obj === w) q.done = true\n })\n c.spin = c.spin.filter((s: any) => s.o !== w)\n this.fling(w, c.dirToEffects(new V3(out.x * speed, up * 0.6, out.z * speed * 1.3)), new V3(0, 0, gentle ? 0.4 : 6 * (out.z || 1)), trail)\n this.sag(w)\n moved = true\n }\n // the tyre went with the rim unless it was already off\n const tp = this.model.parts.find((q) => q.role === 'tyre' && q.zoneId === p.zoneId)\n if (tp) this.gone.add(tp.id)\n void z\n break\n }\n case 'tyre': {\n const z = this.zone(p)\n const meshes = z ? (z.wheels as Obj[]).flatMap((w) => (this.I.tireMeshes(w) as Obj[]).filter((m) => m.parent)) : []\n if (meshes.length) {\n const w = meshes[0].parent\n const g = new this.THREE.Group()\n w.add(g)\n for (const m of meshes) g.attach(m)\n this.fling(g, vel(), new V3(0, 0, gentle ? 0.5 : 8), trail)\n moved = true\n }\n break\n }\n default:\n break\n }\n return moved\n }\n /** Objects of a part that has just been marked gone (the lookup in `objectsOf` skips them). */\n private objectsOfGone(p: PartDef): Obj[] {\n this.gone.delete(p.id)\n const r = this.objectsOf(p.id)\n this.gone.add(p.id)\n return r\n }\n private cutZone(z: any): Obj[] {\n const I = this.I\n const B = z.box\n const a = I.axisOf(z.dir)\n const ax = [0, 1, 2].filter((k) => k !== a)\n const u0 = I.boxLo(B, ax[0])\n const u1 = I.boxHi(B, ax[0])\n const v0 = I.boxLo(B, ax[1])\n const v1 = I.boxHi(B, ax[1])\n const mg = Math.min(0.05, (u1 - u0) * 0.08, (v1 - v0) * 0.08)\n const dirty = new Set<Obj>()\n let pcs: Array<{ mesh?: Obj }> = []\n try {\n pcs = I.cutPanel(this.c, z, [u0 + mg, u1 - mg, v0 + mg, v1 - mg], true, dirty)\n } catch {\n pcs = []\n }\n dirty.forEach((msh) => {\n const g = msh.geometry\n if (g.userData.crease || !g.index) I.crease(g, 42)\n else g.computeVertexNormals()\n g.computeBoundingSphere()\n g.computeBoundingBox()\n })\n return pcs.map((q) => q.mesh).filter((m): m is Obj => !!m)\n }\n /** The corner of a vehicle that lost a wheel settles on its brake: tilt and lower the body. */\n private sag(w: Obj): void {\n const c: any = this.c\n const m = c.meta\n if (m.kind === 'plane' || m.kind === 'heli' || m.kind === 'boat') return\n const r = w.userData.r || 0.3\n const cx = ((m.front ?? 1) + (m.rear ?? -1)) / 2\n const dx = w.position.x - cx\n const dz = w.position.z\n const d = r * 0.8\n const clamp = (v: number) => Math.max(-0.25, Math.min(0.25, v))\n if (Math.abs(dx) > 0.2) c.vehicle.rotation.z += clamp(-d / (2 * dx))\n if (Math.abs(dz) > 0.2) c.vehicle.rotation.x += clamp(d / (2 * dz))\n c.vehicle.position.y -= d / 4\n }\n}\n","/** Open and close clips for the doors, the hood and the trunk lid, in the `AnimationClipSpec` of the contracts. */\nimport type { AnimationClipSpec, AnimationPose } from '@adatechnology/game-contracts'\nimport type { VehicleContext, VehicleKit } from '../api'\nimport type { VehicleModel } from './model'\nimport type { VehicleVisuals } from './visual'\n\n/** Seconds an opening or closing takes. */\nconst DURATION = 1.2\n\nexport function createVehicleClips(model: VehicleModel, vis: VehicleVisuals | null, kit: VehicleKit, c: VehicleContext): AnimationClipSpec[] {\n const zones = kit.zonesOf(c) as any[]\n const doors: Record<string, AnimationPose> = {}\n const hood: Record<string, AnimationPose> = {}\n const lid: Record<string, AnimationPose> = {}\n for (const p of model.parts) {\n if (p.role === 'door') {\n const z = zones.find((q) => q.id === p.zoneId)\n if (!z || (vis && !vis.plates.has(p.id))) continue\n const sgn = z.hinge === 'rear' ? -1 : 1\n doors[p.id] = { rotation: [0, (z.side < 0 ? -1 : 1) * sgn * 1.15, 0] }\n } else if (p.role === 'lid' && (!vis || vis.plates.has(p.id))) lid[p.id] = { rotation: [0, 0, -1.15] }\n else if (p.role === 'hood' && (!vis || vis.hood?.id === p.id)) hood[p.id] = { rotation: [0, 0, (vis?.hood?.open ?? (c as any).hood?.open ?? 1) * (vis?.hood?.sign ?? (c as any).hood?.sign ?? 1)] }\n }\n const clips: AnimationClipSpec[] = []\n const pair = (name: string, poses: Record<string, AnimationPose>, latch: string): void => {\n if (!Object.keys(poses).length) return\n const closed: Record<string, AnimationPose> = {}\n for (const k of Object.keys(poses)) closed[k] = { rotation: [0, 0, 0] }\n clips.push({\n id: `open_${name}`,\n duration: DURATION,\n keys: [{ t: 0, parts: closed }, { t: DURATION, parts: poses }],\n events: [{ t: 0.1, type: 'sound', data: { key: `${latch}_latch` } }],\n })\n clips.push({\n id: `close_${name}`,\n duration: DURATION,\n keys: [{ t: 0, parts: poses }, { t: DURATION, parts: closed }],\n events: [{ t: DURATION, type: 'sound', data: { key: `${latch}_shut` } }],\n })\n }\n pair('doors', doors, 'door')\n pair('hood', hood, 'hood')\n pair('trunk', lid, 'trunk')\n return clips\n}\n","/**\n * `createVehicleDestructible`: a vehicle that follows the destruction contract of `@adatechnology/game-contracts` and brings its own rules.\n * Every damage zone and mechanical part is a part with a material, hits become events (dent, hole, crack, fracture, detach, leak, ignite,\n * melt, explode), joints come apart by wear, by a wrench or by breaking, and the hidden mechanics change how the vehicle drives.\n *\n * It depends on the contracts only (types) and on the kit it is given: not on the default destruction world.\n */\nimport type {\n AnimationClipSpec,\n DamageType,\n DestructibleImpl,\n DestructibleSpec,\n DestructionEvent,\n Hit,\n JointSpec,\n ObjectState,\n PartSpec,\n PartState,\n ToolKind,\n Vec3,\n} from '@adatechnology/game-contracts'\nimport type { VehicleContext, VehicleKit } from '../api'\nimport { clamp, rng, strHash } from '../util'\nimport { buildVehicleModel, kindOf, type JointDef, type PartDef, type PartRole, type VehicleModel } from './model'\nimport { VehicleVisuals } from './visual'\nimport { createVehicleClips } from './clips'\n\nexport interface VehicleDestructibleOptions {\n /** Object id the host gives (`DestructibleImpl.id`). Default: the vehicle key. */\n id?: string\n /** Display name. Default: the vehicle name. */\n name?: string\n /** Object whose space `describe()` answers in (the wrapper the host placed the vehicle in). Default: `c.root`. */\n frame?: any\n /** Tow hitch: the option wins over the spec flag, the spec flag over the seeded choice. */\n hitch?: boolean\n /** Do not create or move any mesh (logic only, for servers and tests that need no scene). */\n headless?: boolean\n /** Extra seed for the choices that are random in the real world (which way a broken steering pulls). */\n seed?: number\n}\n\n/** What the vehicle can do now, from the state of its hidden mechanics. */\nexport interface VehicleStatus {\n /** Battery, alternator, engine and fuel are in order. */\n canStart: boolean\n /** Headlights and taillights are powered (battery and alternator in order). */\n lightsOn: boolean\n /** Engine runs and the gearbox transmits. */\n canDrive: boolean\n /** 1 is normal; worn or missing brakes make the stopping distance this many times longer. */\n brakeFactor: number\n /** -1..1: the sideways pull of a damaged steering or flat tyres (negative is left). */\n steerPull: number\n flatTyres: string[]\n detached: string[]\n leaking: string[]\n burning: string[]\n exploded: boolean\n fuelLiters: number\n}\n\nexport interface VehicleDestructible extends DestructibleImpl {\n readonly vehicle: VehicleContext\n readonly model: VehicleModel\n /** Display name of a part (from the kit locale). */\n partName(partId: string): string\n status(): VehicleStatus\n /** Open and close clips for the doors, the hood and the trunk lid the vehicle has. */\n animations(): AnimationClipSpec[]\n /** World position of a part's centre. */\n partWorldCenter(partId: string): Vec3\n /** Rolls the vehicle over (the roof, the glass and the fluids are hurt when it lands). */\n rollover(side?: number): void\n /** Part ids that are no longer attached to the main body. */\n detachedParts(): string[]\n}\n\ninterface PState {\n def: PartDef\n hp: number\n temp: number\n burning: boolean\n fuelKg: number\n burnRate: number\n char: number\n melt: number\n dents: PartState['dents']\n holes: PartState['holes']\n cracks: PartState['cracks']\n liters: number | undefined\n lost: boolean\n status: PartState['status']\n flat: boolean\n fireLoss: number\n}\n\ninterface JState {\n def: JointDef\n hp: number\n progress: number\n open: boolean\n by?: 'break' | 'tool' | 'part_lost'\n reported: number\n}\n\ninterface Leak {\n rate: number\n fluid: string\n pud: any\n}\n\n/** Joules a projectile needs to get through one layer of the material (before the role factor). */\nconst RESIST: Record<string, number> = { steel: 380, aluminium: 220, glass: 90, plastic: 70, rubber: 120 }\nconst ROLE_RESIST: Partial<Record<PartRole, number>> = {\n frame: 6,\n engine: 10,\n gearbox: 8,\n pillar: 4,\n fuel_tank: 0.4,\n radiator: 0.3,\n battery: 0.8,\n brakes: 5,\n steering: 4,\n shocks: 4,\n alternator: 3,\n oil_pan: 0.6,\n hitch: 5,\n rim: 4,\n}\n/** Scale of blunt damage by material. */\nconst BLUNT: Record<string, number> = { steel: 0.8, aluminium: 1, glass: 1.5, plastic: 1.2, rubber: 0.3 }\n/** Parts inside the body take a fraction of an outside blow. */\nconst SHIELDED: ReadonlySet<PartRole> = new Set<PartRole>(['engine', 'gearbox', 'frame', 'radiator', 'fuel_tank', 'oil_pan', 'battery', 'alternator', 'brakes', 'steering', 'shocks'])\nconst AMBIENT = 20\nconst FLAME = 700\n\nconst FRACTURE: Record<string, 'shatter' | 'snap' | 'tear' | 'none'> = { glass: 'shatter', plastic: 'snap', rubber: 'tear', steel: 'none', aluminium: 'none' }\n\nconst add3 = (a: Vec3, b: Vec3): Vec3 => [a[0] + b[0], a[1] + b[1], a[2] + b[2]]\nconst r3 = (v: Vec3): Vec3 => [Math.round(v[0] * 1e5) / 1e5, Math.round(v[1] * 1e5) / 1e5, Math.round(v[2] * 1e5) / 1e5]\nconst r2 = (n: number): number => Math.round(n * 1e4) / 1e4\n\nexport function createVehicleDestructible(kit: VehicleKit, vehicleCtx: VehicleContext, options: VehicleDestructibleOptions = {}): VehicleDestructible {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = (kit as any)._ as Record<string, any>\n let c = vehicleCtx\n const id = options.id ?? c.key\n const headless = !!options.headless\n const seedBase = strHash(`${c.key}|${id}|${options.seed ?? 0}`)\n let rand = rng(seedBase)\n let clock = 0\n\n let model: VehicleModel\n let vis: VehicleVisuals | null = null\n const ps = new Map<string, PState>()\n let js: JState[] = []\n let leaks = new Map<string, Leak>()\n let queue: DestructionEvent[] = []\n let visualDone = new Set<string>()\n let exploded = false\n let blastHandled = false\n let rolled = false\n let rollHandled = false\n let groupsCache: string[][] = []\n let groupOf = new Map<string, number>()\n let wasLit = true\n let deadEngine = false\n let steerSign = 1\n let specCache: DestructibleSpec | null = null\n\n const frame = (): any => options.frame ?? c.root\n const sync = (): void => {\n c.root.updateWorldMatrix(true, true)\n frame().updateWorldMatrix(true, false)\n }\n const toFrameMatrix = (): any => {\n sync()\n return new THREE.Matrix4().copy(frame().matrixWorld).invert().multiply(c.vehicle.matrixWorld)\n }\n const toWorld = (v: Vec3 | any): Vec3 => {\n const p = Array.isArray(v) ? new V3(v[0], v[1], v[2]) : v.clone()\n const w = c.vehicle.localToWorld(p)\n return [w.x, w.y, w.z]\n }\n const toLocal = (w: Vec3): any => c.vehicle.worldToLocal(new V3(w[0], w[1], w[2]))\n const dirToLocal = (d: Vec3): any => {\n const inv = new THREE.Matrix4().copy(c.vehicle.matrixWorld).invert()\n return new V3(d[0], d[1], d[2]).transformDirection(inv)\n }\n const dirToWorld = (v: any): Vec3 => {\n const d = v.clone().transformDirection(c.vehicle.matrixWorld)\n return [d.x, d.y, d.z]\n }\n const ev = <T extends DestructionEvent['type']>(e: { type: T } & Record<string, unknown>): DestructionEvent => ({ ...e, object: id, time: r2(clock) }) as unknown as DestructionEvent\n\n // ---- setup ---------------------------------------------------------------------------------------------------------------------------\n const burnKg = (d: PartDef): number => {\n if (d.role === 'tyre') return d.mass * 0.6\n if (d.material === 'plastic') return d.mass * 0.8\n if (d.role === 'engine') return 4\n if (d.role === 'battery') return 1.5\n if (d.role === 'fuel_tank') return 0\n return d.ignitionC ? 1 : 0\n }\n const setup = (): void => {\n model = buildVehicleModel(kit, c, { hitch: options.hitch })\n ps.clear()\n for (const d of model.parts) {\n const kg = burnKg(d)\n ps.set(d.id, {\n def: d,\n hp: d.hp,\n temp: AMBIENT,\n burning: false,\n fuelKg: kg,\n burnRate: Math.max(0.05, kg / 25),\n char: 0,\n melt: 0,\n dents: [],\n holes: [],\n cracks: [],\n liters: d.contains?.liters,\n lost: false,\n status: 'intact',\n flat: false,\n fireLoss: 0,\n })\n }\n js = model.joints.map((d) => ({ def: d, hp: d.strength, progress: 0, open: false, reported: 0 }))\n leaks = new Map()\n queue = []\n visualDone = new Set()\n exploded = false\n blastHandled = false\n rolled = false\n rollHandled = false\n wasLit = true\n deadEngine = false\n rand = rng(seedBase)\n steerSign = rand() < 0.5 ? -1 : 1\n vis = headless ? null : new VehicleVisuals(kit, c, model)\n recomputeGroups()\n }\n\n // ---- groups and joints ---------------------------------------------------------------------------------------------------------------------\n const recomputeGroups = (): string[][] => {\n const live = model.parts.filter((p) => !ps.get(p.id)!.lost).map((p) => p.id)\n const parent = new Map<string, string>(live.map((p) => [p, p]))\n const find = (x: string): string => {\n let r = x\n while (parent.get(r) !== r) r = parent.get(r)!\n parent.set(x, r)\n return r\n }\n for (const j of js) if (!j.open && parent.has(j.def.a) && parent.has(j.def.b)) parent.set(find(j.def.a), find(j.def.b))\n const comps = new Map<string, string[]>()\n for (const p of live) {\n const r = find(p)\n if (!comps.has(r)) comps.set(r, [])\n comps.get(r)!.push(p)\n }\n const hubRoot = parent.has(model.hub) ? find(model.hub) : ''\n const list = [...comps.entries()].sort((a, b) => (a[0] === hubRoot ? -1 : b[0] === hubRoot ? 1 : 0))\n groupsCache = list.map(([, v]) => v)\n groupOf = new Map()\n groupsCache.forEach((g, i) => g.forEach((p) => groupOf.set(p, i)))\n return groupsCache\n }\n const attached = (partId: string): boolean => groupOf.get(partId) === 0\n\n const openJoint = (j: JState, by: 'break' | 'tool' | 'part_lost', out: DestructionEvent[]): void => {\n if (j.open) return\n j.open = true\n j.by = by\n j.progress = 1\n const before = new Set(groupsCache[0] ?? [])\n const groups = recomputeGroups()\n out.push(ev({ type: 'detach', joint: j.def.id, parts: [j.def.a, j.def.b], by, groups: groups.map((g) => [...g]) }))\n if (by === 'part_lost' || !vis) return\n for (const gid of before) {\n if (attached(gid) || ps.get(gid)!.lost || visualDone.has(gid)) continue\n const p = ps.get(gid)!.def\n if (!p.visual) continue\n visualDone.add(gid)\n vis.detach(p, { by: by === 'tool' ? 'tool' : 'break' })\n }\n }\n\n const wear = (p: PState, amount: number, out: DestructionEvent[]): void => {\n for (const j of js) {\n if (j.open || j.def.a !== p.def.id) continue\n j.hp -= amount * 0.25\n if (j.hp <= 0) openJoint(j, 'break', out)\n }\n }\n\n const syncZone = (p: PState): void => {\n const zid = p.def.zoneId\n if (!zid) return\n const z = (kit.zonesOf(c) as any[]).find((q) => q.id === zid)\n if (!z) return\n const h = Math.round(clamp((p.hp / p.def.hp) * 100, 0, 100))\n z.health = h\n z.band = kit.bandOf(h)\n if (c.zoneState) c.zoneState.health[zid] = h\n }\n\n const lose = (p: PState, status: 'broken' | 'melted' | 'ashes', out: DestructionEvent[], point?: Vec3): void => {\n if (p.lost) return\n p.lost = true\n p.status = status\n p.hp = 0\n const d = p.def\n const centre = toWorld(d.box.center)\n if (status === 'broken') {\n out.push(ev({ type: 'fracture', part: d.id, style: FRACTURE[d.material] ?? 'none', fragments: [], point: point ?? centre }))\n }\n syncZone(p)\n if (vis && !visualDone.has(d.id)) {\n visualDone.add(d.id)\n switch (d.role) {\n case 'glass':\n vis.glassBreak(d)\n break\n case 'light':\n vis.breakLight(d, true)\n break\n case 'tyre':\n vis.tyreFlat(d, 0.34)\n break\n case 'mirror':\n case 'bumper':\n case 'door':\n case 'hood':\n case 'lid':\n case 'fender':\n case 'battery':\n case 'hitch':\n if (!vis.detach(d, { by: 'break' }) && status !== 'melted' && d.zoneId && (d.role === 'bumper' || d.role === 'door' || d.role === 'fender')) vis.tearOff(d)\n break\n case 'rim':\n vis.detach(d, { by: 'break' })\n break\n case 'roof':\n case 'panel':\n case 'other':\n vis.tearOff(d)\n break\n default:\n break\n }\n }\n for (const j of js) if (!j.open && (j.def.a === d.id || j.def.b === d.id)) openJoint(j, 'part_lost', out)\n recomputeGroups()\n }\n\n const damage = (p: PState, amount: number, dtype: DamageType, source: string | undefined, out: DestructionEvent[], cause?: Vec3): void => {\n if (p.lost || !(amount > 0)) return\n const before = p.hp\n p.hp = Math.max(0, p.hp - amount)\n out.push(ev({ type: 'damage', part: p.def.id, amount: r2(before - p.hp), hp: r2(p.hp), damageType: dtype, ...(source ? { source } : {}) }))\n wear(p, amount, out)\n syncZone(p)\n if (p.hp <= 0) lose(p, 'broken', out, cause)\n if (p.def.role === 'tyre' && !p.flat && p.hp < p.def.hp * 0.6 && !p.lost) {\n p.flat = true\n vis?.tyreFlat(p.def, 0.24)\n }\n }\n\n // ---- geometry helpers ----------------------------------------------------------------------------------------------------------------\n const distToBox = (d: PartDef, v: any): number => {\n const dx = Math.max(Math.abs(v.x - d.box.center[0]) - d.box.size[0] / 2, 0)\n const dy = Math.max(Math.abs(v.y - d.box.center[1]) - d.box.size[1] / 2, 0)\n const dz = Math.max(Math.abs(v.z - d.box.center[2]) - d.box.size[2] / 2, 0)\n return Math.hypot(dx, dy, dz)\n }\n const vol = (d: PartDef): number => d.box.size[0] * d.box.size[1] * d.box.size[2]\n const locate = (v: any, tol: number, skip?: (p: PState) => boolean): PState | null => {\n let best: PState | null = null\n let bd = Infinity\n for (const d of model.parts) {\n const p = ps.get(d.id)!\n if (p.lost || (skip && skip(p))) continue\n const dist = distToBox(d, v)\n if (dist > tol) continue\n if (dist < bd - 1e-6 || (Math.abs(dist - bd) <= 1e-6 && best && vol(d) < vol(best.def))) {\n best = p\n bd = dist\n }\n }\n return best\n }\n const faceNormal = (d: PartDef, v: any): any => {\n const rel = [(v.x - d.box.center[0]) / (d.box.size[0] / 2), (v.y - d.box.center[1]) / (d.box.size[1] / 2), (v.z - d.box.center[2]) / (d.box.size[2] / 2)]\n const k = rel.map(Math.abs).indexOf(Math.max(...rel.map(Math.abs)))\n const n = [0, 0, 0]\n n[k] = rel[k] >= 0 ? 1 : -1\n return new V3(n[0], n[1], n[2])\n }\n const fromVehicle = (v: any, M: any): Vec3 => {\n const p = v.clone().applyMatrix4(M)\n return [p.x, p.y, p.z]\n }\n const armour = (): number => (c.meta.armored || c.meta.bullet ? 30 : 1)\n const resist = (d: PartDef, p: PState): number => {\n let base = RESIST[d.material] ?? 100\n if (d.material === 'glass' && d.hp > 1000) base = 120\n if (d.material === 'glass' && c.meta.bullet) base *= 30\n const k = ROLE_RESIST[d.role] ?? 1\n const arm = d.material === 'steel' || d.material === 'aluminium' ? armour() : 1\n return base * k * arm * (p.dents.length > 3 ? 0.9 : 1)\n }\n\n // ---- fluids --------------------------------------------------------------------------------------------------------------------------\n const fluidKind = (fluid: string): string => (fluid === 'fuel' ? ((c.spec as any).fuel === 'diesel' ? 'diesel' : 'gasoline') : fluid)\n const startLeak = (p: PState, holePoint: any, caliber: number, out: DestructionEvent[], dirLocal: any): void => {\n const d = p.def\n if (!d.contains || (p.liters ?? 0) <= 0) return\n const cap = d.contains.liters\n const level = d.box.center[1] - d.box.size[1] / 2 + d.box.size[1] * clamp((p.liters ?? 0) / cap, 0.05, 1)\n if (holePoint.y > level + 0.03) return\n const head = clamp((level - holePoint.y) / Math.max(0.05, d.box.size[1]), 0, 1)\n const rate = (d.contains.pressurized ? 0.25 : 0.04 + 0.08 * head) * Math.pow(Math.max(caliber, 3) / 9, 2)\n const cur = leaks.get(d.id)\n const fluid = d.contains.fluid\n if (cur) cur.rate += rate\n else {\n const l: Leak = { rate, fluid, pud: null }\n leaks.set(d.id, l)\n if (vis) {\n const pos = new V3(d.box.center[0], Math.max(0.2, (c.meta.clearance ?? 0.3) * 0.8), d.box.center[2])\n if (fluid === 'coolant') kit.addEmitter(c, new V3(d.box.center[0], d.box.center[1] + 0.2, d.box.center[2]), 'white', { rate: 5, s: 0.8 })\n else if ((c.meta.kind ?? 'car') !== 'boat') l.pud = I.puddle(c, fluidKind(fluid), pos, fluid === 'oil' ? 0.8 : 1.1)\n }\n }\n const out3 = dirToWorld(new V3(dirLocal.x * 0.5, dirLocal.y * 0.5 - 0.6, dirLocal.z * 0.5))\n out.push(ev({ type: 'leak', part: d.id, fluid, point: toWorld(holePoint), direction: r3(out3), rate: r2(rate), pressurized: !!d.contains.pressurized }))\n }\n\n // ---- fire ----------------------------------------------------------------------------------------------------------------------------\n const centreOf = (d: PartDef): any => new V3(d.box.center[0], d.box.center[1], d.box.center[2])\n const ignite = (p: PState, out: DestructionEvent[]): void => {\n if (p.burning || p.lost) return\n const d = p.def\n p.burning = true\n out.push(ev({ type: 'ignite', part: d.id, point: toWorld(d.box.center) }))\n if (!vis) return\n const cen = centreOf(d)\n kit.addEmitter(c, cen.clone().add(new V3(0, 0.1, 0)), 'fire', { rate: d.role === 'tyre' ? 7 : 10, s: d.role === 'tyre' ? 0.6 : 0.9 })\n kit.addEmitter(c, cen.clone().add(new V3(0, 0.6, 0)), 'black', { rate: 4, s: 1.1 })\n if (d.role === 'fuel_tank' || d.role === 'engine') {\n const l = leaks.get('fuel_tank')\n if (l?.pud && l.fluid === 'fuel') I.igniteFuel(c, l.pud)\n }\n }\n const burningBlast = (centreLocal: any, radius: number, energy: number, source: string | undefined, out: DestructionEvent[]): void => {\n for (const d of model.parts) {\n const p = ps.get(d.id)!\n if (p.lost) continue\n const dist = distToBox(d, centreLocal)\n if (dist > radius) continue\n const base = energy / (1 + dist * dist * 4)\n const shield = SHIELDED.has(d.role) ? 0.25 : 1\n damage(p, base * (BLUNT[d.material] ?? 1) * shield * 0.04, 'explosive', source, out)\n }\n }\n const explode = (tank: PState, source: string | undefined, out: DestructionEvent[]): void => {\n if (exploded) return\n exploded = true\n const d = tank.def\n const spec = d.explodes ?? { energy: 8e5, radius: 5, atC: 320 }\n out.push(ev({ type: 'explode', part: d.id, point: toWorld(d.box.center), energy: spec.energy, radius: spec.radius }))\n tank.liters = 0\n leaks.delete(d.id)\n if (vis) kit.explode(c, { delay: 0.6 })\n else (c as any).blast = (c as any).blast ?? { phase: 'fire', t: 0, T: 0.6 }\n lose(tank, 'broken', out)\n burningBlast(centreOf(d), spec.radius, spec.energy, source, out)\n for (const q of ps.values()) if (!q.lost && q.def.ignitionC && q.def.role !== 'fuel_tank') q.temp = Math.max(q.temp, q.def.ignitionC)\n }\n const heat = (centreLocal: any, radius: number, temp: number, dur: number, out: DestructionEvent[], falloff = 0.05): void => {\n for (const d of model.parts) {\n const p = ps.get(d.id)!\n if (p.lost) continue\n const dist = distToBox(d, centreLocal)\n if (dist > radius + falloff) continue\n const f = 1 - dist / (radius + falloff)\n const k = 1.2 / (1 + d.mass / 10)\n p.temp += (temp - p.temp) * Math.min(1, k * dur * f * 2)\n }\n void out\n }\n const thermal = (out: DestructionEvent[]): void => {\n for (const p of ps.values()) {\n const d = p.def\n if (p.lost) continue\n const fuelTank = d.role === 'fuel_tank'\n const flammable = !!d.ignitionC && (fuelTank ? (p.liters ?? 0) > 0.5 : p.fuelKg > 0)\n if (!p.burning && flammable && p.temp >= (d.ignitionC as number)) ignite(p, out)\n if (fuelTank && d.explodes && p.temp >= d.explodes.atC && (p.liters ?? 0) > 1) explode(p, undefined, out)\n }\n }\n const stepFire = (dt: number, out: DestructionEvent[]): void => {\n const flames: PState[] = []\n for (const p of ps.values()) {\n if (p.lost) continue\n const d = p.def\n if (p.burning) {\n flames.push(p)\n p.temp += (FLAME - p.temp) * Math.min(1, dt * 0.4)\n p.char = Math.min(1, p.char + dt * 0.02)\n if (d.role === 'fuel_tank') {\n if ((p.liters ?? 0) > 0) p.liters = Math.max(0, (p.liters ?? 0) - dt * 0.6)\n if ((p.liters ?? 0) <= 0.01) p.burning = false\n } else {\n p.fuelKg = Math.max(0, p.fuelKg - p.burnRate * dt)\n if (p.fuelKg <= 0) {\n p.burning = false\n out.push(ev({ type: 'burnout', part: d.id, point: toWorld(d.box.center) }))\n }\n }\n p.fireLoss += dt\n if (p.fireLoss >= 0.5) {\n const amount = p.def.hp * 0.012 * p.fireLoss\n p.fireLoss = 0\n damage(p, amount, 'fire', undefined, out)\n }\n // rubber and plastic sag as they burn\n if (!p.lost && (d.material === 'rubber' || d.material === 'plastic')) {\n const before = Math.floor(p.melt * 4)\n p.melt = Math.min(1, p.melt + dt / 12)\n if (Math.floor(p.melt * 4) > before || p.melt >= 1) {\n out.push(ev({ type: 'melt', part: d.id, melt: r2(p.melt) }))\n if (d.role === 'tyre') vis?.tyreMelt(d, p.melt)\n }\n if (p.melt >= 1) lose(p, 'melted', out)\n }\n } else if (d.material === 'plastic' && p.temp > 200) {\n const before = Math.floor(p.melt * 4)\n p.melt = Math.min(1, p.melt + (dt * (p.temp - 200)) / 4000)\n if (Math.floor(p.melt * 4) > before) out.push(ev({ type: 'melt', part: d.id, melt: r2(p.melt) }))\n if (p.melt >= 1) lose(p, 'melted', out)\n }\n if (!p.burning && p.temp > AMBIENT) p.temp = Math.max(AMBIENT, p.temp - dt * 6)\n }\n for (const f of flames) heat(centreOf(f.def), 0.8, 500, dt * 0.5, out, 0)\n thermal(out)\n }\n\n // ---- hits ----------------------------------------------------------------------------------------------------------------------------\n const normalOf = (d: PartDef, v: any): any => faceNormal(d, v)\n const ballistic = (h: Hit, out: DestructionEvent[]): void => {\n sync()\n const M = toFrameMatrix()\n const v = toLocal(h.point)\n const p = locate(v, 0.2)\n if (!p) return\n const d = p.def\n const E = h.energy ?? 0\n const cal = h.caliber ?? 9\n const dir = dirToLocal(h.direction ?? [0, 0, -1]).normalize()\n const n = normalOf(d, v)\n const res = resist(d, p)\n const through = E >= res\n const cosInc = Math.abs(dir.dot(n))\n const metal = d.material === 'steel' || d.material === 'aluminium'\n const worldPoint = toWorld(v)\n if (metal && !through && cosInc < 0.3 && E > 40) {\n const refl = dir.clone().addScaledVector(n, -2 * dir.dot(n))\n out.push(ev({ type: 'ricochet', part: d.id, point: worldPoint, direction: r3(dirToWorld(refl)), energy: r2(E * 0.4) }))\n damage(p, E * 0.05, 'ballistic', h.source, out, worldPoint)\n vis?.spark([v.x, v.y, v.z], [refl.x, refl.y, refl.z], 6)\n return\n }\n const holeDiam = Math.max(0.006, (cal / 1000) * (d.material === 'glass' ? 1.4 : 1))\n const push = (hole: boolean): void => {\n if (!hole) return\n const hp: PartState['holes'][number] = { point: r3(fromVehicle(v, M)), normal: r3(fromVehicle(n, new THREE.Matrix4().extractRotation(M))), diameter: r2(holeDiam), through }\n p.holes.push(hp)\n out.push(ev({ type: 'hole', part: d.id, hole: hp, worldPoint, ...(through ? { exitPoint: add3(worldPoint, r3(dirToWorld(dir.clone().multiplyScalar(Math.max(0.02, Math.min(d.box.size[0], d.box.size[1], d.box.size[2])))))) } : {}) }))\n vis?.holeDecal([v.x, v.y, v.z], [n.x, n.y, n.z], holeDiam)\n startLeak(p, v, cal, out, dir)\n }\n switch (d.material) {\n case 'glass': {\n const laminated = d.hp > 1000\n const force = clamp(E / 800, 0.3, 1.2)\n const broke = vis ? vis.hitGlass(d, [v.x, v.y, v.z], [dir.x, dir.y, dir.z], force) : !laminated\n if (through || !laminated) push(true)\n if (laminated && !broke) {\n const crack = { point: r3(fromVehicle(v, M)), normal: r3(fromVehicle(n, new THREE.Matrix4().extractRotation(M))), length: r2(0.15 + force * 0.35), rays: 6 + Math.round(force * 6) }\n p.cracks.push(crack)\n out.push(ev({ type: 'crack', part: d.id, crack, worldPoint }))\n damage(p, E * 0.5, 'ballistic', h.source, out, worldPoint)\n } else damage(p, laminated ? E * 0.5 : p.hp, 'ballistic', h.source, out, worldPoint)\n break\n }\n case 'rubber': {\n push(through)\n damage(p, E * 0.4, 'ballistic', h.source, out, worldPoint)\n if (through && !p.lost && !p.flat) {\n p.flat = true\n vis?.tyreFlat(d, 0.24)\n }\n break\n }\n default: {\n push(through)\n if (!through && E > 50) {\n const dent: PartState['dents'][number] = { point: r3(fromVehicle(v, M)), normal: r3(fromVehicle(n, new THREE.Matrix4().extractRotation(M))), radius: r2(Math.max(0.02, holeDiam * 2)), depth: r2(Math.min(0.03, E / 60000 + 0.002)) }\n p.dents.push(dent)\n out.push(ev({ type: 'dent', part: d.id, dent, worldPoint }))\n }\n vis?.spark([v.x, v.y, v.z], [dir.x, dir.y, dir.z], through ? 4 : 8)\n let amount = through ? E * 0.6 : E * 0.25\n // a pierced battery or alternator is finished\n if (through && (d.role === 'battery' || d.role === 'alternator')) amount = Math.max(amount, p.hp * 0.65)\n damage(p, amount, 'ballistic', h.source, out, worldPoint)\n if (d.role === 'fuel_tank' && E > 1500 && (p.liters ?? 0) > 1) p.temp = Math.max(p.temp, d.ignitionC ?? 260)\n }\n }\n }\n\n const blunt = (h: Hit, out: DestructionEvent[]): void => {\n sync()\n const M = toFrameMatrix()\n const v = toLocal(h.point)\n const E = h.energy ?? 0\n const first = locate(v, 0.3)\n if (!first) return\n const big = E >= 4000\n const dirv = h.direction ? dirToLocal(h.direction).normalize() : new V3(((c.meta.front ?? 1) + (c.meta.rear ?? -1)) / 2 - v.x, 0, -v.z).normalize()\n const force = clamp(0.3 + E / 70000, 0.3, 1.4)\n if (big && vis) kit.impact(c, v, dirv, force)\n const reach = big ? 0.55 + 0.45 * force : Math.max(h.radius ?? 0.03, 0.05) + 0.08\n const rot = new THREE.Matrix4().extractRotation(M)\n for (const d of model.parts) {\n const p = ps.get(d.id)!\n if (p.lost) continue\n const dist = distToBox(d, v)\n if (dist > reach) continue\n const w = (1 - dist / reach) ** 2\n const shield = SHIELDED.has(d.role) && !big ? 0 : SHIELDED.has(d.role) ? 0.3 : 1\n const amount = E * w * (BLUNT[d.material] ?? 1) * shield\n if (amount <= 0.5) continue\n const n = normalOf(d, v)\n const worldPoint = toWorld(v)\n if (d.material === 'glass') {\n if (amount < d.hp) {\n const crack = { point: r3(fromVehicle(v, M)), normal: r3(fromVehicle(n, rot)), length: r2(0.2 + Math.min(0.8, amount / d.hp)), rays: 8 }\n p.cracks.push(crack)\n out.push(ev({ type: 'crack', part: d.id, crack, worldPoint }))\n }\n if (vis && amount >= d.hp * 0.5) vis.hitGlass(d, [v.x, v.y, v.z], [dirv.x, dirv.y, dirv.z], clamp(amount / d.hp, 0.3, 1.2))\n } else if (d.material !== 'rubber' && amount > d.hp * 0.01) {\n const dent: PartState['dents'][number] = { point: r3(fromVehicle(v, M)), normal: r3(fromVehicle(n, rot)), radius: r2(reach * 0.6), depth: r2(clamp((0.35 * amount) / d.hp, 0.003, 0.28)) }\n p.dents.push(dent)\n out.push(ev({ type: 'dent', part: d.id, dent, worldPoint }))\n }\n damage(p, amount, 'blunt', h.source, out, worldPoint)\n }\n if (big && !exploded) {\n const tank = [...ps.values()].find((q) => q.def.role === 'fuel_tank' && !q.lost)\n if (tank && distToBox(tank.def, v) <= reach && E > 30000) startLeak(tank, centreOf(tank.def).setY(tank.def.box.center[1] - tank.def.box.size[1] / 2 + 0.05), 12, out, dirv)\n }\n }\n\n const explosive = (h: Hit, out: DestructionEvent[]): void => {\n sync()\n const v = toLocal(h.point)\n const E = h.energy ?? 0\n const radius = h.radius ?? 3\n const centre = new V3(((c.meta.front ?? 1) + (c.meta.rear ?? -1)) / 2, 0.6, 0)\n const away = centre.clone().sub(v)\n away.y = Math.max(away.y, 0)\n const dir = away.lengthSq() > 1e-6 ? away.normalize() : new V3(0, 1, 0)\n const nearest = Math.min(...model.parts.map((d) => distToBox(d, v)))\n if (nearest > radius) return\n if (vis && E >= 3000) kit.impact(c, v.clone().addScaledVector(dir, -0.1).setY(clamp(v.y, 0.3, 1.2)), dir, clamp(0.4 + E / 60000, 0.4, 1.4), { noStain: true })\n burningBlast(v, radius, E, h.source, out)\n const tank = [...ps.values()].find((q) => q.def.role === 'fuel_tank' && !q.lost)\n if (tank && !exploded) {\n const dist = distToBox(tank.def, v)\n if (dist <= radius) {\n const verdict = kit.blastDamage(c, E / (1 + dist * dist * 4) / 50)\n if (verdict === 'explosion') explode(tank, h.source, out)\n else if (verdict === 'fire') {\n tank.temp = Math.max(tank.temp, tank.def.ignitionC ?? 260)\n startLeak(tank, centreOf(tank.def).setY(tank.def.box.center[1] - tank.def.box.size[1] / 2 + 0.05), 12, out, dir)\n }\n }\n }\n // heat of the blast ignites tyres and plastics nearby\n heat(v, radius * 0.5, 450, 1, out)\n }\n\n const fireHit = (h: Hit, out: DestructionEvent[]): void => {\n sync()\n const v = toLocal(h.point)\n heat(v, h.radius ?? 0.4, h.temperature ?? FLAME, h.duration ?? 0.016, out)\n thermal(out)\n }\n\n // ---- mechanical status ---------------------------------------------------------------------------------------------------------------\n const sound = (role: PartRole): boolean => {\n const list = [...ps.values()].filter((p) => p.def.role === role)\n if (!list.length) return true\n return list.every((p) => !p.lost && attached(p.def.id) && p.hp >= p.def.hp * 0.5)\n }\n const tankPart = (): PState | undefined => [...ps.values()].find((p) => p.def.role === 'fuel_tank' && p.def.contains)\n const computeStatus = (): VehicleStatus => {\n const electric = (c.spec as any).fuel === 'electric'\n const tank = tankPart()\n const fuel = tank ? (tank.liters ?? 0) : electric ? 1 : 1\n const engineOk = sound('engine') && !exploded && fuel > 0.05\n const powered = sound('battery') && sound('alternator')\n const gearOk = sound('gearbox')\n const brakes = [...ps.values()].find((p) => p.def.role === 'brakes')\n const flat = [...ps.values()].filter((p) => p.def.role === 'tyre' && (p.flat || p.lost) && !p.burning).map((p) => p.def.id)\n const brakeLost = brakes ? brakes.lost || !attached(brakes.def.id) : false\n const brakeWorn = brakes ? brakes.hp < brakes.def.hp * 0.5 : false\n const brakeFactor = (brakeLost ? 3.5 : brakeWorn ? 1.8 : 1) * (1 + 0.15 * flat.length)\n const st = [...ps.values()].find((p) => p.def.role === 'steering')\n const stBad = st ? st.lost || !attached(st.def.id) : false\n const stWorn = st ? st.hp < st.def.hp * 0.5 : false\n const flatSide = flat.reduce((s, tid) => s + (ps.get(tid)!.def.box.center[2] < 0 ? -1 : 1), 0)\n const pull = clamp((stBad ? 0.6 : stWorn ? 0.25 : 0) * steerSign + flatSide * 0.12, -1, 1)\n const canStart = powered && engineOk\n return {\n canStart,\n lightsOn: powered,\n canDrive: canStart && gearOk,\n brakeFactor: r2(brakeFactor),\n steerPull: r2(pull),\n flatTyres: flat,\n detached: [...ps.values()].filter((p) => !p.lost && !attached(p.def.id)).map((p) => p.def.id),\n leaking: [...leaks.keys()],\n burning: [...ps.values()].filter((p) => p.burning).map((p) => p.def.id),\n exploded,\n fuelLiters: r2(tank ? (tank.liters ?? 0) : 0),\n } as VehicleStatus\n }\n const applyEffects = (): void => {\n const s = computeStatus()\n if (s.lightsOn !== wasLit) {\n wasLit = s.lightsOn\n vis?.setLights(s.lightsOn)\n }\n if (!s.canStart && !deadEngine) {\n deadEngine = true\n ;(c as any).engineHealth = 0\n } else if (s.canStart && deadEngine) {\n deadEngine = false\n ;(c as any).engineHealth = 1\n }\n }\n\n // ---- blast and rollover sync -----------------------------------------------------------------------------------------------------------\n const afterBlast = (out: DestructionEvent[]): void => {\n if (blastHandled || !(c as any).exploded) return\n blastHandled = true\n // the kit threw the hood, the doors, the rear bumper and one wheel\n const hood = ps.get(vis?.hood?.id ?? '')\n if (hood && !hood.lost) hood.status = 'damaged'\n for (const p of ps.values()) {\n if (p.lost) continue\n const d = p.def\n if (d.role === 'hood' || d.role === 'door' || (d.role === 'bumper' && d.box.center[0] < 0)) {\n visualDone.add(d.id)\n for (const j of js) if (!j.open && j.def.a === d.id) openJoint(j, 'break', out)\n }\n }\n const left = new Set((c.wheels as any[]).filter((w) => w.parent))\n for (const p of ps.values()) {\n if (p.def.role !== 'rim' || p.lost) continue\n const z = (kit.zonesOf(c) as any[]).find((q) => q.id === p.def.zoneId)\n const ws = (z?.wheels ?? []) as any[]\n if (ws.length && ws.every((w) => !left.has(w))) {\n visualDone.add(p.def.id)\n for (const j of js) if (!j.open && j.def.a === p.def.id) openJoint(j, 'break', out)\n }\n }\n for (const p of ps.values()) {\n if (p.lost) continue\n if (p.def.role === 'tyre' || p.def.material === 'plastic') p.temp = Math.max(p.temp, p.def.ignitionC ?? 0)\n if (p.def.role === 'glass' || p.def.role === 'light') lose(p, 'broken', out)\n }\n }\n const afterRoll = (out: DestructionEvent[]): void => {\n if (rollHandled || !(c as any).flipped) return\n rollHandled = true\n const M = toFrameMatrix()\n const rot = new THREE.Matrix4().extractRotation(M)\n for (const p of ps.values()) {\n if (p.lost) continue\n const d = p.def\n if (d.role === 'roof') {\n const dent: PartState['dents'][number] = { point: r3(fromVehicle(centreOf(d), M)), normal: r3(fromVehicle(new V3(0, 1, 0), rot)), radius: r2(Math.max(d.box.size[0], d.box.size[2]) * 0.4), depth: 0.14 }\n p.dents.push(dent)\n out.push(ev({ type: 'dent', part: d.id, dent, worldPoint: toWorld(d.box.center) }))\n damage(p, d.hp * 0.6, 'blunt', 'rollover', out)\n } else if (d.role === 'pillar') damage(p, d.hp * 0.5, 'blunt', 'rollover', out)\n else if (d.role === 'glass') damage(p, d.material === 'glass' && d.hp > 1000 ? d.hp * 0.55 : d.hp, 'blunt', 'rollover', out)\n else if (d.role === 'mirror') damage(p, d.hp, 'blunt', 'rollover', out)\n }\n for (const tid of ['oil_pan', 'fuel_tank']) {\n const p = ps.get(tid)\n if (p && !p.lost && p.def.contains) {\n damage(p, p.def.hp * 0.2, 'blunt', 'rollover', out)\n startLeak(p, centreOf(p.def).setY(p.def.box.center[1] - p.def.box.size[1] / 2), 16, out, new V3(0, -1, 0))\n }\n }\n }\n\n // ---- the contract --------------------------------------------------------------------------------------------------------------------\n const describe = (): DestructibleSpec => {\n if (specCache) return specCache\n const M = toFrameMatrix()\n const parts: PartSpec[] = model.parts.map((d) => {\n const bb = new THREE.Box3(new V3(d.box.center[0] - d.box.size[0] / 2, d.box.center[1] - d.box.size[1] / 2, d.box.center[2] - d.box.size[2] / 2), new V3(d.box.center[0] + d.box.size[0] / 2, d.box.center[1] + d.box.size[1] / 2, d.box.center[2] + d.box.size[2] / 2)).applyMatrix4(M)\n const size = bb.getSize(new V3())\n const cen = bb.getCenter(new V3())\n return {\n id: d.id,\n material: d.material,\n shape: { kind: 'box', size: r3([Math.max(0.02, size.x), Math.max(0.02, size.y), Math.max(0.02, size.z)]) },\n position: r3([cen.x, cen.y, cen.z]),\n mass: r2(d.mass),\n hp: d.hp,\n ...(d.contains ? { contains: { fluid: d.contains.fluid, liters: d.contains.liters, ...(d.contains.pressurized ? { pressurized: true } : {}) } } : {}),\n ...(d.explodes ? { explodes: { ...d.explodes } } : {}),\n tags: [...d.tags, d.role],\n }\n })\n const joints: JointSpec[] = model.joints.map((j) => ({ id: j.id, a: j.a, b: j.b, kind: j.kind, strength: j.strength, tools: [...j.tools], seconds: j.seconds }))\n specCache = { name: options.name ?? (c.spec as any).name ?? c.key, parts, joints, tags: ['vehicle', kindOf(c)] }\n return specCache\n }\n\n const state = (): ObjectState => {\n const parts: PartState[] = model.parts.map((d) => {\n const p = ps.get(d.id)!\n const marked = p.dents.length > 0 || p.holes.length > 0 || p.cracks.length > 0\n const status = p.lost ? p.status : p.hp < p.def.hp || marked ? 'damaged' : 'intact'\n return {\n id: d.id,\n material: d.material,\n status,\n hp: r2(p.hp),\n maxHp: d.hp,\n mass: r2(d.mass * (1 - p.char * 0.2 * (p.def.material === 'plastic' || p.def.role === 'tyre' ? 1 : 0))),\n temperature: r2(p.temp),\n burning: p.burning,\n fuel: r2(p.fuelKg),\n char: r2(p.char),\n melt: r2(p.melt),\n dents: p.dents.map((x) => ({ ...x })),\n holes: p.holes.map((x) => ({ ...x })),\n cracks: p.cracks.map((x) => ({ ...x })),\n ...(p.liters !== undefined ? { liters: r2(p.liters) } : {}),\n group: p.lost ? -1 : (groupOf.get(d.id) ?? -1),\n }\n })\n const joints = js.map((j) => ({\n id: j.def.id,\n a: j.def.a,\n b: j.def.b,\n kind: j.def.kind,\n hp: r2(Math.max(0, j.hp)),\n maxHp: j.def.strength,\n progress: r2(j.progress),\n open: j.open,\n ...(j.open && j.by ? { openedBy: j.by } : {}),\n }))\n return { id, name: options.name ?? (c.spec as any).name ?? c.key, position: [0, 0, 0], rotation: [0, 0, 0, 1], parts, joints, groups: groupsCache.map((g) => [...g]), destroyed: parts.every((p) => p.status === 'broken' || p.status === 'melted' || p.status === 'ashes') }\n }\n\n const hit = (h: Hit): DestructionEvent[] => {\n const out: DestructionEvent[] = []\n const hh: Hit = h.space === 'local' ? { ...h, space: 'world', point: toWorld(h.point as Vec3) } : h\n if (hh.space === 'local' || !hh.point) return out\n switch (hh.type) {\n case 'ballistic':\n ballistic(hh, out)\n break\n case 'blunt':\n case 'slash':\n blunt(hh, out)\n break\n case 'explosive':\n explosive(hh, out)\n break\n case 'fire':\n case 'heat':\n fireHit(hh, out)\n break\n }\n applyEffects()\n return out\n }\n\n const update = (dt: number): DestructionEvent[] => {\n clock += dt\n const out: DestructionEvent[] = queue\n queue = []\n // a clip that turns the hood drives it: the kit keeps what it is told\n const hood = (c as any).hood\n if (hood) {\n const sign = hood.sign || 1\n const cur = hood.piv.rotation.z / sign\n if (Math.abs(cur - hood.ang) > 1e-4) {\n hood.ang = cur\n hood.target = cur\n }\n }\n if (vis) kit.tick(c, dt)\n else if ((c as any).blast) I.tickBoom?.(c, dt)\n stepFire(dt, out)\n for (const [pid, l] of leaks) {\n const p = ps.get(pid)!\n p.liters = Math.max(0, (p.liters ?? 0) - l.rate * dt)\n if ((p.liters ?? 0) <= 0) leaks.delete(pid)\n }\n afterBlast(out)\n afterRoll(out)\n applyEffects()\n return out\n }\n\n const disassemble = (jointId: string, tool: ToolKind, dt: number): number => {\n const j = js.find((x) => x.def.id === jointId)\n if (!j || !j.def.tools.includes(tool)) return -1\n if (j.open) return 1\n j.progress = Math.min(1, j.progress + dt / j.def.seconds)\n const step = Math.floor(j.progress * 4) / 4\n if (step > j.reported && j.progress < 1) {\n j.reported = step\n queue.push(ev({ type: 'disassemble_progress', joint: j.def.id, tool, progress: r2(j.progress) }))\n }\n if (j.progress >= 1) {\n const out: DestructionEvent[] = []\n openJoint(j, 'tool', out)\n queue.push(...out)\n applyEffects()\n }\n return j.progress\n }\n\n const extinguish = (partId?: string): void => {\n for (const p of ps.values()) {\n if (partId && p.def.id !== partId) continue\n if (p.burning) {\n p.burning = false\n queue.push(ev({ type: 'extinguish', part: p.def.id }))\n }\n p.temp = Math.min(p.temp, 120)\n }\n if (!partId) {\n c.emitters = (c.emitters as any[]).filter((e) => e.kind !== 'fire' && e.kind !== 'black')\n }\n }\n\n const reset = (): void => {\n const old = c\n const parent = old.root.parent\n const next = kit.build(old.key, old.state)\n if (parent) {\n next.root.position.copy(old.root.position)\n next.root.quaternion.copy(old.root.quaternion)\n next.root.scale.copy(old.root.scale)\n parent.add(next.root)\n parent.remove(old.root)\n }\n kit.dispose(old)\n c = next\n ;(c.root as any).userData = { ...(c.root as any).userData, ...(old.root as any).userData }\n clock = 0\n setup()\n }\n\n const rollover = (side = 1): void => {\n if (kit.roll(c, side)) rolled = true\n void rolled\n }\n\n setup()\n\n const impl: VehicleDestructible = {\n id,\n name: options.name ?? (c.spec as any).name,\n get vehicle() {\n return c\n },\n get model() {\n return model\n },\n describe,\n hit,\n update,\n state,\n reset,\n disassemble,\n extinguish,\n serialize: () => ({\n clock,\n parts: [...ps.entries()].map(([k, p]) => [k, p.hp, p.liters, p.lost, p.status, p.flat]),\n joints: js.map((j) => [j.def.id, j.hp, j.progress, j.open, j.by ?? null]),\n }),\n partName: (pid) => ps.get(pid)?.def.name ?? pid,\n status: computeStatus,\n animations: () => createVehicleClips(model, vis, kit, c),\n partWorldCenter: (pid) => {\n sync()\n const d = ps.get(pid)?.def\n return d ? toWorld(d.box.center) : [0, 0, 0]\n },\n rollover,\n detachedParts: () =>\n [...ps.values()]\n .filter((p) => (!p.lost && !attached(p.def.id)) || (p.lost && p.def.visual && js.some((j) => j.open && j.def.a === p.def.id)))\n .map((p) => p.def.id),\n }\n return impl\n}\n","import type { VehicleContext, VehicleKit } from '../api'\nimport type { BuildState } from '../api'\n\nexport interface VehicleItemOptions {\n state?: BuildState\n /** Build in the light mode of the kit (`kit.lod`): fewer segments and no interior, for crowds and for budgets. Default off. */\n lod?: boolean\n}\n\nexport interface VehicleItem {\n /** Add this to the scene: origin at the centre of the footprint on the floor, front facing +z. */\n root: any\n /** The built vehicle inside it. */\n vehicle: VehicleContext\n}\n\n/**\n * Builds vehicle `key` as an item for a viewer that expects the origin at the centre of the footprint on the floor and the front facing +z\n * (the test room). The vehicle itself keeps the kit axes (+x front) inside a turned, centred group. Pass `root` as `frame` to\n * `createVehicleDestructible` so `describe()` answers in the item's space.\n */\nexport function buildVehicleItem(kit: VehicleKit, key: string, options: VehicleItemOptions = {}): VehicleItem {\n const THREE = kit.THREE\n const vehicle = options.lod ? kit.build(key, options.state ?? 'intact', undefined, { lod: true }) : kit.build(key, options.state ?? 'intact')\n const m = vehicle.meta\n const root = new THREE.Group()\n root.name = key\n const turn = new THREE.Group()\n turn.rotation.y = -Math.PI / 2\n root.add(turn)\n vehicle.root.position.x = -(((m.front ?? 1) + (m.rear ?? -1)) / 2)\n turn.add(vehicle.root)\n root.userData.vehicle = vehicle\n return { root, vehicle }\n}\n"],"mappings":"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","names":["side","document","n","out","g","r2","document","side","document","a","b","e","side","document","d","q","slug","v","document","document","kindOf","options","kg","gh","clamp","side"]}
1
+ {"version":3,"sources":["../src/kit.ts","../src/locales/en.json","../src/locales/pt-BR.json","../src/locale.ts","../src/util.ts","../src/legacy-seeds.ts","../src/materials.ts","../src/geometry.ts","../src/context.ts","../src/warp.ts","../src/body.ts","../src/glass.ts","../src/lights.ts","../src/interior.ts","../src/hood.ts","../src/car.ts","../src/trucks.ts","../src/wheels.ts","../src/particles.ts","../src/fluids.ts","../src/glass-damage.ts","../src/impact.ts","../src/explosion.ts","../src/rollover.ts","../src/tick.ts","../src/armor.ts","../src/zone-core.ts","../src/zone-decals.ts","../src/zone-dent.ts","../src/damage-panels.ts","../src/damage-parts.ts","../src/zone-derive.ts","../src/zone-auto.ts","../src/zone-apply.ts","../src/scenarios.ts","../src/ui.ts","../src/lod.ts","../src/damageables.ts","../src/destructible/impl.ts","../src/destructible/model.ts","../src/destructible/visual.ts","../src/destructible/clips.ts","../src/destructible/item.ts"],"sourcesContent":["import { shapeGeometries } from '@adatechnology/game-shapes-three'\n\nimport { assignDeep, createMatchers, createTranslate, registerLocale, resolveStrings } from './locale'\nimport { LEGACY_STATES, registerLegacySeeds } from './legacy-seeds'\nimport { clamp, hash, markDecal, rng, smooth, strHash } from './util'\nimport type { Kit } from './types'\nimport type { VehicleKit, VehicleKitOptions } from './api'\nimport { installMaterials } from './materials'\nimport { installGeometry } from './geometry'\nimport { installContext } from './context'\nimport { installWarp } from './warp'\nimport { installBody } from './body'\nimport { installGlass } from './glass'\nimport { installLights } from './lights'\nimport { installInterior } from './interior'\nimport { installHood } from './hood'\nimport { installCar } from './car'\nimport { installTrucks } from './trucks'\nimport { installWheels } from './wheels'\nimport { installParticles } from './particles'\nimport { installFluids } from './fluids'\nimport { installGlassDamage } from './glass-damage'\nimport { installImpact } from './impact'\nimport { installExplosion } from './explosion'\nimport { installRollover } from './rollover'\nimport { installTick } from './tick'\nimport { installArmor } from './armor'\nimport { installZoneCore } from './zone-core'\nimport { installZoneDecals } from './zone-decals'\nimport { installZoneDent } from './zone-dent'\nimport { installDamagePanels } from './damage-panels'\nimport { installDamageParts } from './damage-parts'\nimport { installZoneDerive } from './zone-derive'\nimport { installZoneAuto } from './zone-auto'\nimport { installZoneApply } from './zone-apply'\nimport { installScenarios } from './scenarios'\nimport { installUi } from './ui'\nimport { createLod, installLod, wrapThreeForLod } from './lod'\nimport { installDamageables } from './damageables'\n\n/**\n * Creates a vehicle kit bound to a three.js namespace and a locale.\n * The returned object is the public API; every call creates an independent kit (its own registry, caches and configuration).\n */\nexport function createVehicleKit(options: VehicleKitOptions): VehicleKit {\n const opts: any = options || {}\n if (!opts.THREE || !opts.THREE.Vector3) throw new Error('createVehicleKit: options.THREE (the three.js namespace) is required')\n /* the light mode settings, and the three.js namespace whose generators obey them */\n const lod = createLod(opts.lod)\n // its primitive geometries are made by game-shapes (bit-identical to three's, cached by parameters), then thinned by the light mode\n const THREE = wrapThreeForLod(shapeGeometries(opts.THREE), lod)\n const strings = resolveStrings(opts.locale)\n const t = createTranslate(strings)\n const doc = opts.document || (typeof document !== 'undefined' ? document : undefined)\n\n const kit: Kit = {\n THREE,\n lod,\n V3: THREE.Vector3,\n PI: Math.PI,\n document: doc,\n strings,\n t,\n matchers: createMatchers(strings),\n hash,\n clamp,\n smooth,\n _: {},\n }\n\n /* ================= data ================= */\n /* registries filled by the content pack (configure({ fuels, groups, waterGroups })) */\n kit.fuels = {}\n kit.groups = []\n kit.waterGroups = {}\n /* live configuration: everything that is content comes in through configure() / plugin() */\n kit.config = {\n defaultGroup: t('groups.default'),\n plate: 'ABC1D23',\n impactStain: null,\n defaultSplat: 'stain',\n damagedScenario: null,\n texts: { who: t('texts.who'), noEffect: t('texts.no_effect') },\n }\n kit.fleet = []\n kit.builders = {}\n kit.register = function (spec: any, build: any) {\n if (!spec || !spec.key || typeof build !== 'function') throw new Error('kit.register: spec.key and a build function are required')\n const i = kit.fleet.findIndex(function (v: any) {\n return v.key === spec.key\n })\n spec.build = build\n if (!spec.group) spec.group = kit.config.defaultGroup\n if (i >= 0) kit.fleet[i] = spec\n else kit.fleet.push(spec)\n kit.builders[spec.key] = build\n return spec\n }\n kit.find = function (key: string) {\n return (\n kit.fleet.find(function (v: any) {\n return v.key === key\n }) || null\n )\n }\n\n /* ================= modules ================= */\n installMaterials(kit)\n installGeometry(kit)\n installContext(kit)\n installWarp(kit)\n installBody(kit)\n installGlass(kit)\n installLights(kit)\n installInterior(kit)\n installHood(kit)\n installCar(kit)\n installTrucks(kit)\n installWheels(kit)\n installParticles(kit)\n installFluids(kit)\n installGlassDamage(kit)\n installImpact(kit)\n installExplosion(kit)\n installRollover(kit)\n installTick(kit)\n installArmor(kit)\n installZoneCore(kit)\n installZoneDecals(kit)\n installZoneDent(kit)\n installDamagePanels(kit)\n installDamageParts(kit)\n installZoneDerive(kit)\n installZoneAuto(kit)\n installZoneApply(kit)\n installScenarios(kit)\n installUi(kit)\n installLod(kit)\n installDamageables(kit)\n\n const I = kit._\n\n /* ================= extension: configure, plugin, hooks ================= */\n const HOOKS: Record<string, Array<(...args: any[]) => void>> = {}\n /** `kit.on(event, fn)` / `kit.hook(event, ...args)`. Events: `defaultDamage(c)` after the default damage of a car. */\n kit.on = function (ev: string, fn: (...args: any[]) => void) {\n ;(HOOKS[ev] = HOOKS[ev] || []).push(fn)\n return kit\n }\n kit.hook = function (ev: string, ...args: any[]) {\n ;(HOOKS[ev] || []).forEach(function (fn) {\n fn.apply(kit, args)\n })\n }\n kit.configure = function (o: any) {\n o = o || {}\n if (o.bands)\n o.bands.forEach(function (b: any, i: number) {\n if (kit.bands[i] && b) Object.assign(kit.bands[i], b)\n })\n if (o.zoneEffects)\n Object.keys(o.zoneEffects).forEach(function (k) {\n kit.zoneEffects[k] = o.zoneEffects[k]\n })\n if (o.partEffects) Object.assign(kit.partEffects, o.partEffects)\n if (o.scenarios) o.scenarios.forEach(kit.scenario)\n if (o.flagEffects)\n Object.keys(o.flagEffects).forEach(function (k) {\n kit.flagEffects[k] = Object.assign({ order: 50, settle: true }, o.flagEffects[k])\n })\n if (o.fluids)\n Object.keys(o.fluids).forEach(function (k) {\n kit.defineFluid(k, o.fluids[k])\n })\n if (o.fuels) Object.assign(kit.fuels, o.fuels)\n if (o.groups)\n o.groups.forEach(function (g: string) {\n if (kit.groups.indexOf(g) < 0) kit.groups.push(g)\n })\n if (o.waterGroups) Object.assign(kit.waterGroups, o.waterGroups)\n if (o.palette && o.palette.rust) I.RUST.set(o.palette.rust)\n if (o.plate != null) kit.config.plate = o.plate\n if (o.texts) {\n const tx = o.texts\n if (tx.who != null) kit.config.texts.who = tx.who\n if (tx.noEffect != null) kit.config.texts.noEffect = tx.noEffect\n if (tx.plate != null) kit.config.plate = tx.plate\n if (tx.ui) kit.config.texts.ui = Object.assign(kit.config.texts.ui || {}, tx.ui)\n }\n ;['impactStain', 'defaultSplat', 'defaultGroup', 'damagedScenario'].forEach(function (k) {\n if (o[k] !== undefined) kit.config[k] = o[k]\n })\n return kit\n }\n kit.plugins = []\n kit.plugin = function (p: any) {\n if (!p) return kit\n if (p.configure) kit.configure(p.configure)\n if (typeof p.install === 'function') p.install(kit)\n kit.plugins.push(p.name || '(unnamed)')\n return kit\n }\n /** Helpers for plugins that create their own scenario flag effects. */\n kit.internals = {\n rng,\n strHash,\n zonesOf: kit.zonesOf,\n worldInverseOf: I.worldInverseOf,\n hideObj: I.hideObj,\n markDecal,\n rayCaster: I._zr,\n boxCenter: I.boxCenter,\n wheelInfo: I.wheelInfo,\n }\n\n /* ================= assembly ================= */\n function defaultDamage(c: any) {\n const kd = c.meta.kind\n if (kd === 'plane') {\n kit.zoneImpact(c, 'front', 1.2)\n kit.zoneImpact(c, 'left', 1.1)\n kit.impact(c, new kit.V3(0.05, 0.45, 1.25), new kit.V3(0, 1, 0), 1.0, { noStain: true })\n } else if (kd === 'heli') {\n kit.zoneImpact(c, 'front', 1.1)\n kit.impact(c, new kit.V3(0, 0.12, -0.95), new kit.V3(0, 0, 1), 0.9, { noStain: true })\n kit.impact(c, new kit.V3(c.meta.rear + 0.3, 2.0, 0), new kit.V3(0.4, 0, 1), 1.0, { noStain: true })\n kit.impact(c, new kit.V3(-0.6, 2.4, 0.3), new kit.V3(0, -1, 0), 1.0, { noStain: true })\n } else if (kd === 'boat') {\n kit.zoneImpact(c, 'front', 1.1)\n kit.zoneImpact(c, 'left', 1.0)\n } else {\n kit.zoneImpact(c, 'front', 1.0)\n kit.zoneImpact(c, 'left', 0.7)\n kit.hook('defaultDamage', c)\n }\n }\n kit.defaultDamage = defaultDamage\n\n /**\n * Builds vehicle `key` in a state (`'intact' | 'damaged' | 'modified'`). Returns the context; add `c.root` to the scene.\n * `zoneState` (optional) = `{ health: { zoneId: 0..100 }, flags: { flipped, burnt, abandoned, ...plugin flags } }` applies the damage zones.\n * Without it, `'damaged'` uses the scenario `config.damagedScenario` when a plugin registered one.\n * `zoneState.scenario` (an id or name a pack registered) computes that scenario on the vehicle being built, so a burnt or wrecked\n * vehicle is one call; an explicit `health` / `flags` given alongside override the scenario's (health per zone id, flags by name).\n */\n kit.build = function (key: string, state?: string, zoneState?: any, options?: { lod?: boolean }) {\n const spec = kit.find(key)\n if (!spec) throw new Error('Unknown vehicle: ' + key)\n const lodBefore = lod.on\n if (options && options.lod != null) lod.on = !!options.lod\n try {\n return buildVehicle(spec, key, state, zoneState)\n } finally {\n lod.on = lodBefore\n }\n }\n function buildVehicle(spec: any, key: string, state?: string, zoneState?: any) {\n const st = state || 'intact'\n /* a vehicle renamed after the first release keeps its old key as the seed of every random stream */\n const seedKey = spec.seedKey || key\n const c = new kit.BuildContext(st, strHash(seedKey + (LEGACY_STATES[st] || st)))\n c.spec = spec\n c.key = key\n c.seedKey = seedKey\n spec.build(c, kit)\n const m = c.meta\n m.kind = m.kind || 'car'\n if (m.length == null || m.width == null || m.front == null) {\n const bb = new THREE.Box3().setFromObject(c.vehicle)\n const sz = bb.getSize(new kit.V3())\n if (m.length == null) m.length = sz.x\n if (m.width == null) m.width = sz.z\n if (m.front == null) m.front = bb.max.x\n if (m.rear == null) m.rear = bb.min.x\n if (m.top == null) m.top = bb.max.y\n if (m.clearance == null) m.clearance = Math.max(0.1, bb.min.y + 0.2)\n if (m.bodyHeight == null) m.bodyHeight = sz.y * 0.5\n if (m.belt == null) m.belt = m.clearance + m.bodyHeight\n }\n if (c.engineHealth == null) c.engineHealth = 1\n if (['electric', 'none'].indexOf(spec.fuel) < 0 && ['boat', 'plane', 'heli'].indexOf(m.kind) < 0 && m.exhaust !== false) {\n const ex = m.exhaust || new kit.V3(m.rear + 0.05, Math.max(0.2, (m.clearance || 0.3) * 0.7), (m.width || 1.6) * 0.3)\n kit.addEmitter(c, ex, 'exhaust', { dir: m.exhaustDir || new kit.V3(-1, 0, 0) })\n }\n try {\n kit.zonesOf(c)\n } catch (e: any) {\n c.zones = []\n ;(c.zoneErrors = c.zoneErrors || []).push('zones: ' + (e && e.message))\n }\n if (st === 'modified') {\n if (m.armor) m.armor(c, kit)\n else kit.applyArmor(c)\n }\n if (zoneState == null && st === 'damaged' && kit.config.damagedScenario) zoneState = kit.zoneScenario(c, kit.config.damagedScenario)\n else if (zoneState && zoneState.scenario != null) {\n c.scenario = zoneState.scenario\n let fromScenario: any = { health: {}, flags: {} }\n try {\n fromScenario = kit.zoneScenario(c, zoneState.scenario)\n } catch (e: any) {\n ;(c.zoneErrors = c.zoneErrors || []).push('scenario: ' + (e && e.message))\n }\n zoneState = {\n health: Object.assign({}, fromScenario.health, zoneState.health),\n flags: Object.assign({}, fromScenario.flags, zoneState.flags),\n }\n }\n if (zoneState) kit.applyZones(c, zoneState)\n else {\n c.zoneState = { health: {}, flags: {} }\n c.zones.forEach(function (z: any) {\n c.zoneState.health[z.id] = 100\n })\n }\n c.vehicle.traverse(function (o: any) {\n if (o.isMesh && !(o.material && o.material.transparent)) o.receiveShadow = true\n })\n return c\n }\n /** Releases the geometries of a built vehicle (shared particle geometries and materials are kept). */\n kit.dispose = function (c: any) {\n const shared = Object.values(I.PARTICLE_GEOMETRIES)\n c.root.traverse(function (o: any) {\n if (o.isSprite) {\n if (o.material && o.material.userData.dis) o.material.dispose()\n return\n }\n if (o.geometry && !shared.includes(o.geometry)) o.geometry.dispose()\n })\n }\n\n kit.registerLegacySeeds = registerLegacySeeds\n\n /* a content pack adds its own strings (under its own top-level key) to the locale this kit was created with */\n kit.registerLocale = function (code: string, table: Record<string, any>) {\n registerLocale(code, table)\n assignDeep(strings, resolveStrings(opts.locale))\n return kit\n }\n\n /* options that are configuration (everything except THREE, locale and document) */\n const { THREE: _three, lod: _lod, locale: _locale, document: _document, plugins, ...config } = opts\n void _three\n void _lod\n void _locale\n void _document\n kit.configure(config)\n ;(plugins || []).forEach(kit.plugin)\n\n return kit as unknown as VehicleKit\n}\n","{\n \"plate\": {\n \"band\": \"BRAZIL\"\n },\n \"parts\": {\n \"tire_front\": \"Front {side} tire\",\n \"tire_rear\": \"Rear {side} tire\",\n \"bike_tire_front\": \"Front tire\",\n \"bike_tire_rear\": \"Rear tire\",\n \"headlight\": \"{Side} headlight\",\n \"taillight\": \"{Side} taillight\",\n \"led_bar\": \"LED bar\",\n \"taillight_bar\": \"Taillight bar\",\n \"hood\": \"Hood\",\n \"engine\": \"Engine\",\n \"engine_electric\": \"Electric motor and inverter\",\n \"radiator\": \"Radiator\",\n \"bumper_front\": \"Front bumper\",\n \"bumper_rear\": \"Rear bumper\",\n \"fuel_tank\": \"Fuel tank\",\n \"diesel_tank\": \"Diesel tank\",\n \"windshield\": \"Windshield\",\n \"rear_window\": \"Rear window\",\n \"window_front\": \"Front window\",\n \"window_rear\": \"Rear window\",\n \"quarter_glass\": \"Rear quarter glass\",\n \"cab_window\": \"Cab window\",\n \"window\": \"Window\",\n \"glass\": \"Glass\",\n \"glass_side\": \"{label} ({side})\",\n \"glass_side_m\": \"{label} ({side})\",\n \"track\": \"{Side} track\"\n },\n \"texts\": {\n \"high_voltage\": \"HIGH VOLTAGE\",\n \"who\": \"whoever is on that side\",\n \"no_effect\": \"\"\n },\n \"blast\": {\n \"lethal\": \"Lethal radius {m} m\",\n \"injury\": \"Injuries up to {m} m\",\n \"tank_explosion\": \"Tank explosion\",\n \"explosion\": \"Explosion\"\n },\n \"zones\": {\n \"windshield\": \"Windshield\",\n \"glass_left\": \"Left side glass\",\n \"glass_right\": \"Right side glass\",\n \"rear_window\": \"Rear window\",\n \"light_bar_front\": \"Front light bar\",\n \"taillight\": \"Taillight\",\n \"light_bar_rear\": \"Taillight bar\",\n \"headlight\": \"{Side} headlight\",\n \"taillight_side\": \"{Side} taillight\",\n \"wheels\": \"Wheels\",\n \"wheels_axle_front\": \"Front axle wheels\",\n \"wheels_axle_rear\": \"Rear axle wheels\",\n \"wheels_axle_n\": \"Axle {n} wheels\",\n \"wheel_front_side\": \"Front {side} wheel\",\n \"wheel_rear_side\": \"Rear {side} wheel\",\n \"wheel_front\": \"Front wheel\",\n \"wheel_rear\": \"Rear wheel\",\n \"bumper_front\": \"Front bumper\",\n \"bumper_rear\": \"Rear bumper\",\n \"hood\": \"Hood\",\n \"fender_front\": \"Front {side} fender\",\n \"door_front\": \"Front {side} door\",\n \"door\": \"{Side} door\",\n \"door_rear\": \"Rear {side} door\",\n \"side_rear\": \"Rear {side} side panel\",\n \"roof\": \"Pillars and roof\",\n \"cargo_bed\": \"Cargo bed\",\n \"trunk_lid\": \"Trunk lid\",\n \"tail_lid\": \"Rear lid\",\n \"underbody\": \"Underbody and suspension\",\n \"engine\": \"Engine\",\n \"engine_electric\": \"Electric motor\",\n \"radiator\": \"Radiator\",\n \"fuel_tank\": \"Fuel tank\",\n \"battery\": \"Battery\",\n \"diesel_tank\": \"Diesel tank\",\n \"fairing\": \"Fairing and headlight\",\n \"handlebar_levers\": \"Handlebar and levers\",\n \"tank\": \"Tank\",\n \"seat_rack\": \"Seat and rack\",\n \"handlebar\": \"Handlebar\",\n \"frame\": \"Frame\",\n \"seat_tail\": \"Seat and tail\",\n \"exhaust\": \"Exhaust\",\n \"grille_front\": \"Grille and front\",\n \"engine_hood\": \"Engine hood\",\n \"fender_rear\": \"Rear {side} fender\",\n \"operator_station\": \"Operator station\",\n \"bus_front\": \"Bus front\",\n \"cab_front\": \"Cab (front)\",\n \"bus_front_side\": \"Front, {side} side\",\n \"cab_side\": \"Cab, {side} side\",\n \"body_saloon\": \"Saloon\",\n \"body_tank\": \"Tank\",\n \"body_body\": \"Body\",\n \"body_box\": \"Box\",\n \"body_side\": \"{label} ({side} side)\",\n \"body_rear\": \"{label} (rear)\",\n \"chassis\": \"Chassis\",\n \"armor_front\": \"Front armor\",\n \"armor_side\": \"{Side} armor\",\n \"armor_rear\": \"Rear armor\",\n \"cannon\": \"Cannon\",\n \"weapon\": \"Weapon\",\n \"turret\": \"Roof and turret\",\n \"track\": \"{Side} track\",\n \"wheels_side\": \"{Side} side wheels\",\n \"bow\": \"Bow\",\n \"port_side\": \"Port side\",\n \"starboard_side\": \"Starboard side\",\n \"stern\": \"Stern\",\n \"deck\": \"Deck and cabin\",\n \"outboard_engine\": \"Outboard engine\",\n \"nose_propeller\": \"Nose and propeller\",\n \"nose_engine\": \"Nose and engine\",\n \"cabin_glass\": \"Cabin and glass\",\n \"wing\": \"{Side} wing\",\n \"rear_fuselage\": \"Rear fuselage\",\n \"tail\": \"Tail\",\n \"landing_gear\": \"Landing gear\",\n \"wing_tanks\": \"Tanks (in the wings)\",\n \"nose_bubble\": \"Nose and bubble\",\n \"cabin\": \"Cabin\",\n \"tail_cone\": \"Tail cone\",\n \"main_rotor\": \"Main rotor\",\n \"tail_rotor\": \"Tail rotor\",\n \"skids\": \"Skids\",\n \"engine_transmission\": \"Engine and transmission\",\n \"front\": \"Front\",\n \"side\": \"{Side} side\",\n \"rear\": \"Rear\",\n \"top\": \"Roof\"\n },\n \"who\": {\n \"front_seats\": \"whoever rides in front\",\n \"rear_seats\": \"whoever rides in the back\",\n \"driver\": \"the driver\",\n \"passenger\": \"the front passenger\",\n \"rear_left\": \"whoever rides in the back on the left\",\n \"rear_right\": \"whoever rides in the back on the right\",\n \"left_side\": \"whoever is on the left side\",\n \"right_side\": \"whoever is on the right side\",\n \"cargo\": \"the cargo\",\n \"tractor_driver\": \"the tractor driver\",\n \"boarding_door\": \"the boarding door\",\n \"helper\": \"the helper\",\n \"seated_side\": \"whoever is seated on that side\",\n \"back_seats\": \"whoever rides at the back\",\n \"crew_side\": \"the crew on that side\",\n \"boat_side\": \"whoever is on that side of the boat\",\n \"pilot\": \"the pilot\",\n \"passengers\": \"the passengers\"\n },\n \"bands\": {\n \"intact\": \"Intact\",\n \"scratched\": \"Scratched\",\n \"dented\": \"Dented\",\n \"destroyed\": \"Destroyed\",\n \"torn_off\": \"Torn off\"\n },\n \"groups\": {\n \"default\": \"Vehicles\"\n },\n \"sides\": {\n \"left\": \"left\",\n \"right\": \"right\",\n \"leftM\": \"left\",\n \"rightM\": \"right\"\n },\n \"matchers\": {\n \"windshield\": \"windshield\",\n \"rear\": \"rear\",\n \"side\": \"left|right\",\n \"tank\": \"tank|tanker\",\n \"diesel\": \"diesel\",\n \"fuel\": \"gasoline|petrol|ethanol|alcohol|fuel\",\n \"glass_id\": \"glass|window|windshield|rear_window\"\n },\n \"ui\": {\n \"front\": \"▲ FRONT\",\n \"inside\": \"Inside\",\n \"aria\": \"Damage map seen from above, front up\",\n \"noZones\": \"This vehicle has no zones.\",\n \"health\": \"Overall health\"\n },\n \"mechanics\": {\n \"chassis\": \"Chassis frame\",\n \"battery\": \"Battery\",\n \"alternator\": \"Alternator\",\n \"gearbox\": \"Gearbox\",\n \"brakes\": \"Brakes\",\n \"steering\": \"Steering\",\n \"shock_absorbers\": \"Shock absorbers\",\n \"tow_hitch\": \"Tow hitch\",\n \"oil_pan\": \"Oil pan\",\n \"mirror\": \"{Side} mirror\",\n \"tyre\": \"{zone} tyre\",\n \"pillar_a\": \"{Side} A pillar\",\n \"pillar_c\": \"{Side} C pillar\",\n \"engine\": \"Engine\",\n \"radiator\": \"Radiator\",\n \"fuel_tank\": \"Fuel tank\"\n }\n}\n","{\n \"plate\": {\n \"band\": \"BRASIL\"\n },\n \"parts\": {\n \"tire_front\": \"Pneu dianteiro {sideM}\",\n \"tire_rear\": \"Pneu traseiro {sideM}\",\n \"bike_tire_front\": \"Pneu dianteiro\",\n \"bike_tire_rear\": \"Pneu traseiro\",\n \"headlight\": \"Farol {sideM}\",\n \"taillight\": \"Lanterna {side}\",\n \"led_bar\": \"Barra de LED\",\n \"taillight_bar\": \"Barra de lanterna\",\n \"hood\": \"Capô\",\n \"engine\": \"Motor\",\n \"engine_electric\": \"Motor elétrico e inversor\",\n \"radiator\": \"Radiador\",\n \"bumper_front\": \"Para-choque dianteiro\",\n \"bumper_rear\": \"Para-choque traseiro\",\n \"fuel_tank\": \"Tanque de combustível\",\n \"diesel_tank\": \"Tanque de diesel\",\n \"windshield\": \"Para-brisa\",\n \"rear_window\": \"Vidro traseiro\",\n \"window_front\": \"Janela dianteira\",\n \"window_rear\": \"Janela traseira\",\n \"quarter_glass\": \"Vidro lateral traseiro\",\n \"cab_window\": \"Janela da cabine\",\n \"window\": \"Janela\",\n \"glass\": \"Vidro\",\n \"glass_side\": \"{label} {side}\",\n \"glass_side_m\": \"{label} {sideM}\",\n \"track\": \"Lagarta {side}\"\n },\n \"texts\": {\n \"high_voltage\": \"ALTA TENSÃO\",\n \"who\": \"quem está desse lado\",\n \"no_effect\": \"\"\n },\n \"blast\": {\n \"lethal\": \"Raio letal {m} m\",\n \"injury\": \"Ferimentos até {m} m\",\n \"tank_explosion\": \"Explosão do tanque\",\n \"explosion\": \"Explosão\"\n },\n \"zones\": {\n \"windshield\": \"Para-brisa\",\n \"glass_left\": \"Vidros do lado esquerdo\",\n \"glass_right\": \"Vidros do lado direito\",\n \"rear_window\": \"Vidro traseiro\",\n \"light_bar_front\": \"Barra de luz dianteira\",\n \"taillight\": \"Lanterna\",\n \"light_bar_rear\": \"Barra de lanterna\",\n \"headlight\": \"Farol {sideM}\",\n \"taillight_side\": \"Lanterna {side}\",\n \"wheels\": \"Rodas\",\n \"wheels_axle_front\": \"Rodas do eixo dianteiro\",\n \"wheels_axle_rear\": \"Rodas do eixo traseiro\",\n \"wheels_axle_n\": \"Rodas do eixo {n}\",\n \"wheel_front_side\": \"Roda dianteira {side}\",\n \"wheel_rear_side\": \"Roda traseira {side}\",\n \"wheel_front\": \"Roda dianteira\",\n \"wheel_rear\": \"Roda traseira\",\n \"bumper_front\": \"Para-choque dianteiro\",\n \"bumper_rear\": \"Para-choque traseiro\",\n \"hood\": \"Capô\",\n \"fender_front\": \"Paralama dianteiro {sideM}\",\n \"door_front\": \"Porta dianteira {side}\",\n \"door\": \"Porta {side}\",\n \"door_rear\": \"Porta traseira {side}\",\n \"side_rear\": \"Lateral traseira {side}\",\n \"roof\": \"Colunas e teto\",\n \"cargo_bed\": \"Caçamba\",\n \"trunk_lid\": \"Tampa do porta-malas\",\n \"tail_lid\": \"Tampa traseira\",\n \"underbody\": \"Assoalho e suspensão\",\n \"engine\": \"Motor\",\n \"engine_electric\": \"Motor elétrico\",\n \"radiator\": \"Radiador\",\n \"fuel_tank\": \"Tanque de combustível\",\n \"battery\": \"Bateria\",\n \"diesel_tank\": \"Tanque de diesel\",\n \"fairing\": \"Carenagem e farol\",\n \"handlebar_levers\": \"Guidão e manetes\",\n \"tank\": \"Tanque\",\n \"seat_rack\": \"Banco e bagageiro\",\n \"handlebar\": \"Guidão\",\n \"frame\": \"Quadro\",\n \"seat_tail\": \"Banco e rabeta\",\n \"exhaust\": \"Escapamento\",\n \"grille_front\": \"Grade e frente\",\n \"engine_hood\": \"Capô do motor\",\n \"fender_rear\": \"Paralama traseiro {sideM}\",\n \"operator_station\": \"Posto do operador\",\n \"bus_front\": \"Frente do ônibus\",\n \"cab_front\": \"Cabine (frente)\",\n \"bus_front_side\": \"Frente, lado {sideM}\",\n \"cab_side\": \"Cabine, lado {sideM}\",\n \"body_saloon\": \"Salão\",\n \"body_tank\": \"Tanque\",\n \"body_body\": \"Carroceria\",\n \"body_box\": \"Baú\",\n \"body_side\": \"{label} (lado {sideM})\",\n \"body_rear\": \"{label} (traseira)\",\n \"chassis\": \"Chassi\",\n \"armor_front\": \"Blindagem frontal\",\n \"armor_side\": \"Blindagem lateral {side}\",\n \"armor_rear\": \"Blindagem traseira\",\n \"cannon\": \"Canhão\",\n \"weapon\": \"Arma\",\n \"turret\": \"Teto e torre\",\n \"track\": \"Lagarta {side}\",\n \"wheels_side\": \"Rodas do lado {sideM}\",\n \"bow\": \"Proa\",\n \"port_side\": \"Costado de bombordo\",\n \"starboard_side\": \"Costado de boreste\",\n \"stern\": \"Popa\",\n \"deck\": \"Convés e cabine\",\n \"outboard_engine\": \"Motor de popa\",\n \"nose_propeller\": \"Nariz e hélice\",\n \"nose_engine\": \"Nariz e motor\",\n \"cabin_glass\": \"Cabine e vidros\",\n \"wing\": \"Asa {side}\",\n \"rear_fuselage\": \"Fuselagem traseira\",\n \"tail\": \"Cauda\",\n \"landing_gear\": \"Trem de pouso\",\n \"wing_tanks\": \"Tanques (nas asas)\",\n \"nose_bubble\": \"Nariz e bolha\",\n \"cabin\": \"Cabine\",\n \"tail_cone\": \"Cone de cauda\",\n \"main_rotor\": \"Rotor principal\",\n \"tail_rotor\": \"Rotor de cauda\",\n \"skids\": \"Esquis\",\n \"engine_transmission\": \"Motor e transmissão\",\n \"front\": \"Frente\",\n \"side\": \"Lado {sideM}\",\n \"rear\": \"Traseira\",\n \"top\": \"Teto\"\n },\n \"who\": {\n \"front_seats\": \"quem vai na frente\",\n \"rear_seats\": \"quem vai atrás\",\n \"driver\": \"o motorista\",\n \"passenger\": \"o carona\",\n \"rear_left\": \"quem vai atrás à esquerda\",\n \"rear_right\": \"quem vai atrás à direita\",\n \"left_side\": \"quem está do lado esquerdo\",\n \"right_side\": \"quem está do lado direito\",\n \"cargo\": \"a carga\",\n \"tractor_driver\": \"o tratorista\",\n \"boarding_door\": \"a porta de embarque\",\n \"helper\": \"o ajudante\",\n \"seated_side\": \"quem está sentado desse lado\",\n \"back_seats\": \"quem vai no fundo\",\n \"crew_side\": \"a tripulação desse lado\",\n \"boat_side\": \"quem está desse bordo\",\n \"pilot\": \"o piloto\",\n \"passengers\": \"os passageiros\"\n },\n \"bands\": {\n \"intact\": \"Intacto\",\n \"scratched\": \"Arranhado\",\n \"dented\": \"Amassado\",\n \"destroyed\": \"Destruído\",\n \"torn_off\": \"Arrancado\"\n },\n \"groups\": {\n \"default\": \"Veículos\"\n },\n \"sides\": {\n \"left\": \"esquerda\",\n \"right\": \"direita\",\n \"leftM\": \"esquerdo\",\n \"rightM\": \"direito\"\n },\n \"matchers\": {\n \"windshield\": \"para-brisa\",\n \"rear\": \"traseir\",\n \"side\": \"esquerd|direit\",\n \"tank\": \"tanque\",\n \"diesel\": \"diesel\",\n \"fuel\": \"gasolina|etanol|álcool|combust\",\n \"glass_id\": \"glass|window|windshield|rear_window|vidro|janela|para_brisa\"\n },\n \"ui\": {\n \"front\": \"▲ FRENTE\",\n \"inside\": \"Por dentro\",\n \"aria\": \"Mapa de danos visto de cima, frente para cima\",\n \"noZones\": \"Este veículo não tem zonas.\",\n \"health\": \"Saúde geral\"\n },\n \"mechanics\": {\n \"chassis\": \"Chassi\",\n \"battery\": \"Bateria\",\n \"alternator\": \"Alternador\",\n \"gearbox\": \"Caixa de câmbio\",\n \"brakes\": \"Freios\",\n \"steering\": \"Direção\",\n \"shock_absorbers\": \"Amortecedores\",\n \"tow_hitch\": \"Engate de reboque\",\n \"oil_pan\": \"Cárter\",\n \"mirror\": \"Retrovisor {sideM}\",\n \"tyre\": \"Pneu ({zone})\",\n \"pillar_a\": \"Coluna A {sideM}\",\n \"pillar_c\": \"Coluna C {sideM}\",\n \"engine\": \"Motor\",\n \"radiator\": \"Radiador\",\n \"fuel_tank\": \"Tanque de combustível\"\n }\n}\n","import en from './locales/en.json'\nimport ptBR from './locales/pt-BR.json'\n\n/** Every user-visible string of the engine, grouped by area. Missing keys of a locale fall back to English. */\nexport type LocaleStrings = typeof en\n\n/** A locale given by the caller: any subset of {@link LocaleStrings}. */\nexport type PartialLocaleStrings = { [K in keyof LocaleStrings]?: Partial<LocaleStrings[K]> }\n\nconst registry: Record<string, PartialLocaleStrings> = { en, 'pt-BR': ptBR }\n\n/** Registers (or extends) a locale under a code such as `es` or `pt-BR`. Missing keys fall back to English. */\nexport function registerLocale(code: string, strings: PartialLocaleStrings | Record<string, any>): void {\n registry[code] = merge(registry[code] || {}, strings)\n}\n\n/** Codes of the registered locales. */\nexport function listLocales(): string[] {\n return Object.keys(registry)\n}\n\nfunction merge(base: any, extra: any): any {\n const out: any = Array.isArray(base) ? base.slice() : Object.assign({}, base)\n Object.keys(extra || {}).forEach(function (k) {\n const v = extra[k]\n if (v && typeof v === 'object' && !Array.isArray(v)) out[k] = merge(out[k] && typeof out[k] === 'object' ? out[k] : {}, v)\n else if (v !== undefined) out[k] = v\n })\n return out\n}\n\n/** Copies `source` into `target` in place, level by level (the string table of a live kit has to stay the same object). */\nexport function assignDeep(target: any, source: any): any {\n Object.keys(source || {}).forEach(function (k) {\n const v = source[k]\n if (v && typeof v === 'object' && !Array.isArray(v)) target[k] = assignDeep(target[k] && typeof target[k] === 'object' ? target[k] : {}, v)\n else if (v !== undefined) target[k] = v\n })\n return target\n}\n\n/**\n * Resolves a locale to a complete string table.\n * Accepts a registered code (`'pt-BR'`; `'pt'` finds `'pt-BR'`, `'en-US'` finds `'en'`), or a partial table that overrides English.\n */\nexport function resolveStrings(locale?: string | PartialLocaleStrings): LocaleStrings {\n /* English is the base of every locale, including the keys content packs add to it with registerLocale */\n const base = registry.en || en\n if (locale && typeof locale === 'object') return merge(base, locale)\n const code = locale || 'en'\n const hit = findLocale(code)\n return hit ? merge(base, hit) : (merge(base, {}) as LocaleStrings)\n}\n\nfunction findLocale(code: string): PartialLocaleStrings | null {\n if (registry[code]) return registry[code]\n const lower = code.toLowerCase()\n const exact = Object.keys(registry).find((k) => k.toLowerCase() === lower)\n if (exact) return registry[exact]\n const lang = lower.split(/[-_]/)[0]\n const byLang = Object.keys(registry).find((k) => k.toLowerCase().split(/[-_]/)[0] === lang)\n return byLang ? registry[byLang] : null\n}\n\n/** Replaces `{name}` in a template. `{Name}` (capital first letter) capitalises the value of `name`. Unknown names stay as written. */\nexport function format(template: string, vars?: Record<string, unknown>): string {\n if (!vars) return template\n return template.replace(/\\{(\\w+)\\}/g, function (whole, name: string) {\n if (name in vars) return String(vars[name])\n const lower = name.charAt(0).toLowerCase() + name.slice(1)\n if (lower !== name && lower in vars) {\n const v = String(vars[lower])\n return v.charAt(0).toUpperCase() + v.slice(1)\n }\n return whole\n })\n}\n\n/** A function that looks up a dotted key (`'zones.hood'`) and fills in its variables. */\nexport type Translate = (key: string, vars?: Record<string, unknown>) => string\n\n/**\n * Builds the translate function of a string table. The variable `s` (-1 left, +1 right) is expanded to\n * `{side}` (feminine word) and `{sideM}` (masculine word), so one template reads right in languages with grammatical gender.\n */\nexport function createTranslate(strings: LocaleStrings): Translate {\n return function t(key, vars) {\n let cur: any = strings\n for (const part of key.split('.')) {\n cur = cur == null ? undefined : cur[part]\n if (cur === undefined) break\n }\n if (typeof cur !== 'string') return key\n if (vars && typeof vars.s === 'number') {\n const left = vars.s < 0\n vars = Object.assign({ side: strings.sides[left ? 'left' : 'right'], sideM: strings.sides[left ? 'leftM' : 'rightM'] }, vars)\n }\n return format(cur, vars)\n }\n}\n\n/** Regular expressions that recognise a part by its label when no `key` was given. Built from the `matchers` of the string table. */\nexport interface Matchers {\n windshield: RegExp\n rear: RegExp\n side: RegExp\n tank: RegExp\n diesel: RegExp\n fuel: RegExp\n /** Zone ids that already start like a glass id, so no `glass_` prefix is added. */\n glassId: RegExp\n}\n\nexport function createMatchers(strings: LocaleStrings): Matchers {\n const m = strings.matchers\n return {\n windshield: new RegExp(m.windshield, 'i'),\n rear: new RegExp(m.rear, 'i'),\n side: new RegExp(m.side, 'i'),\n tank: new RegExp(m.tank, 'i'),\n diesel: new RegExp(m.diesel, 'i'),\n fuel: new RegExp(m.fuel, 'i'),\n glassId: new RegExp('^(?:' + m.glass_id + ')'),\n }\n}\n","/** Pure helpers shared by every module. They never touch three.js. */\n\n/** Deterministic hash of three numbers to [0, 1). */\nexport function hash(a: number, b: number, c: number): number {\n const h = Math.sin(a * 127.1 + b * 311.7 + c * 74.7) * 43758.5453\n return h - Math.floor(h)\n}\n\nexport function clamp(v: number, a: number, b: number): number {\n return Math.max(a, Math.min(b, v))\n}\n\n/** Smoothstep on [0, 1]. */\nexport function smooth(t: number): number {\n t = clamp(t, 0, 1)\n return t * t * (3 - 2 * t)\n}\n\n/** Mulberry32 pseudo random generator. The same seed always gives the same sequence. */\nexport function rng(seed: number): () => number {\n let a = seed >>> 0\n return function () {\n a = (a + 0x6d2b79f5) | 0\n let t = Math.imul(a ^ (a >>> 15), 1 | a)\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n}\n\n/** FNV-1a hash of a string, used to derive seeds from vehicle keys and zone ids. */\nexport function strHash(s: string): number {\n let h = 2166136261\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i)\n h = Math.imul(h, 16777619)\n }\n return h >>> 0\n}\n\n/** Marks an object and all its children as decals (ignored by raycasts, rollover and crash fields). */\nexport function markDecal(o: any): void {\n o.traverse((x: any) => {\n x.userData.decal = true\n })\n}\n\n/** Lower-case ASCII identifier made from free text (\"Rear window 2\" -> \"rear_window_2\"). */\nexport function slug(text: unknown): string {\n return String(text)\n .toLowerCase()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_|_$/g, '')\n}\n","/**\n * Legacy seeds. Every damage effect is deterministic: the random stream of a zone comes from a hash of the vehicle key, the\n * zone id and the band. The first version of the engine used Portuguese ids and salts, so ids and salts that were renamed\n * keep their original text here, and the seed is built from the legacy text. A vehicle that looked a given way before\n * renaming still looks exactly the same.\n */\nimport { slug } from './util'\n\n/** Build states: new English name -> original seed text. */\nexport const LEGACY_STATES: Record<string, string> = { intact: 'intacto', damaged: 'danificado', modified: 'modificado' }\n\n/** Salts mixed into the seed of each phase of `applyZones`. */\nexport const SEED_SALTS = { rust: '|ferrugem|', scenario: '|cenario', settle: '|assenta', rollover: '|capota' }\n\n/** Auto-derived zone ids: new id -> original id. Ids that did not change are not listed. */\nexport const LEGACY_ZONE_IDS: Record<string, string> = {\n bumper_front: 'parachoque_d',\n bumper_rear: 'parachoque_t',\n fender_front_left: 'paralama_de',\n fender_front_right: 'paralama_dd',\n door_front_left: 'porta_de',\n door_front_right: 'porta_dd',\n door_rear_left: 'porta_te',\n door_rear_right: 'porta_td',\n side_rear_left: 'lateral_te',\n side_rear_right: 'lateral_td',\n hood: 'capo',\n roof: 'teto',\n lid: 'tampa',\n underbody: 'assoalho',\n cargo_bed: 'cacamba',\n engine: 'motor',\n radiator: 'radiador',\n fuel_tank: 'tanque',\n battery: 'bateria',\n fairing: 'carenagem',\n handlebar: 'guidao',\n seat: 'banco',\n frame: 'quadro',\n exhaust: 'escapamento',\n front: 'frente',\n rear: 'traseira',\n top: 'topo',\n tractor_hood: 'capo_trator',\n fender_rear_left: 'paralama_te',\n fender_rear_right: 'paralama_td',\n operator_station: 'posto',\n cab_front: 'cab_frente',\n cab_left: 'cab_e',\n cab_right: 'cab_d',\n body_left: 'corpo_e',\n body_right: 'corpo_d',\n body_rear: 'corpo_t',\n chassis: 'chassi',\n armor_front: 'blind_frente',\n armor_left: 'blind_e',\n armor_right: 'blind_d',\n armor_rear: 'blind_t',\n weapon: 'arma',\n turret: 'torre',\n track_left: 'lagarta_e',\n track_right: 'lagarta_d',\n wheels_left: 'rodas_e',\n wheels_right: 'rodas_d',\n bow: 'proa',\n side_left: 'costado_e',\n side_right: 'costado_d',\n stern: 'popa',\n deck: 'conves',\n nose: 'nariz',\n cab: 'cabine',\n wing_left: 'asa_e',\n wing_right: 'asa_d',\n fuselage: 'fuselagem',\n tail: 'cauda',\n landing_gear: 'trem',\n fuel_tanks: 'tanques',\n tail_cone: 'cone',\n rotor: 'rotor',\n tail_rotor: 'rotor_cauda',\n skids: 'esquis',\n}\n\n/**\n * Lets a content pack add its own legacy seeds: `zones` maps a new zone id to the original id and `glassLabels` maps the key of a\n * glass part to its original label. The tables are shared by every kit of the process; an id keeps one meaning, so a different\n * text for an id that is already known is an error.\n */\nexport function registerLegacySeeds(tables: { zones?: Record<string, string>; glassLabels?: Record<string, string> }): void {\n const add = (target: Record<string, string>, source: Record<string, string> | undefined, what: string) => {\n Object.keys(source || {}).forEach(function (k) {\n if (target[k] !== undefined && target[k] !== source![k]) throw new Error('registerLegacySeeds: ' + what + ' \"' + k + '\" already maps to \"' + target[k] + '\"')\n target[k] = source![k]\n })\n }\n add(LEGACY_ZONE_IDS, tables.zones, 'zone id')\n add(LEGACY_GLASS_LABELS, tables.glassLabels, 'glass label')\n}\n\n/** The text a zone contributes to its seed: an explicit `seedId`, the legacy id, or the id itself. */\nexport function legacyZoneId(z: { id: string; seedId?: string }): string {\n return z.seedId || LEGACY_ZONE_IDS[z.id] || z.id\n}\n\n/** Original glass labels by part key; the zone id of a pane was the slug of its (Portuguese) label. */\nexport const LEGACY_GLASS_LABELS: Record<string, string> = {\n windshield: 'Para-brisa',\n rear_window: 'Vidro traseiro',\n window_front: 'Janela dianteira',\n window_rear: 'Janela traseira',\n quarter_glass: 'Vidro lateral traseiro',\n cab_window: 'Janela da cabine',\n window: 'Janela',\n glass: 'Vidro',\n}\n\n/**\n * Original zone id of a glass pane. `key` is the part key (null for free-text labels), `label` the current label,\n * `side` -1/1 for panes made by `sideWindows`, `appended` 'left'/'right' when the zone added a side word itself and\n * `fallback` the new id, used when the label was free text (then the id never changed).\n */\nexport function legacyGlassId(key: string | null, label: string, side: number, appended: string | null, fallback: string): string {\n if (!key || !(key in LEGACY_GLASS_LABELS)) return fallback\n let text = LEGACY_GLASS_LABELS[key]\n if (side) text += side < 0 ? ' esquerda' : ' direita'\n else if (appended) text += appended === 'left' ? ' esquerdo' : ' direito'\n let id = slug(text)\n if (!/^vidro|^janela|^para_brisa/.test(id)) id = 'vidro_' + id\n void label\n return id\n}\n\n/** Original id of a light zone: `farol_e`, `lanterna_c`, `farol_d_2`... */\nexport function legacyLightId(kind: string, side: string, index: number): string {\n const k = kind === 'taillight' ? 'lanterna' : 'farol'\n const s = side === 'center' ? 'c' : side === 'left' ? 'e' : 'd'\n return k + '_' + s + (index ? '_' + (index + 1) : '')\n}\n","/** Shared materials, studio environment map, paint colours and text textures. */\nimport type { Kit } from './types'\n\nexport function installMaterials(kit: Kit): void {\n const THREE = kit.THREE\n const I = kit._\n const document = kit.document\n\n /* ================= materiais ================= */\n const RUST = new THREE.Color('#5e3220')\n /* kit.configure({ palette: { rust } }) changes the rust tone of aged paint */\n const cache: any = {}\n /* studio environment map (canvas cube): without it every very metallic material (chrome, reflector, aluminium) renders almost black.\n Grey-blue sky, a light band on the horizon and a dark floor. It is added automatically to every material with metalness >= 0.6. */\n let envTex: any = null\n function studioEnvironment() {\n if (envTex) return envTex\n const faces = []\n const S = 64\n for (let f = 0; f < 6; f++) {\n const cv = document.createElement('canvas')\n cv.width = cv.height = S\n const x: any = cv.getContext('2d')\n if (f === 2) {\n x.fillStyle = '#7d8a99'\n x.fillRect(0, 0, S, S)\n x.fillStyle = 'rgba(235,240,245,0.55)'\n x.fillRect(S * 0.3, S * 0.3, S * 0.4, S * 0.4)\n } else if (f === 3) {\n x.fillStyle = '#16181a'\n x.fillRect(0, 0, S, S)\n } else {\n const gr = x.createLinearGradient(0, 0, 0, S)\n gr.addColorStop(0, '#7a8796')\n gr.addColorStop(0.42, '#b9c2cb')\n gr.addColorStop(0.5, '#e6eaee')\n gr.addColorStop(0.56, '#5b6066')\n gr.addColorStop(1, '#1a1c1e')\n x.fillStyle = gr\n x.fillRect(0, 0, S, S)\n if (f === 0 || f === 4) {\n x.fillStyle = 'rgba(255,255,255,0.35)'\n x.fillRect(S * 0.15, S * 0.12, S * 0.25, S * 0.22)\n }\n }\n faces.push(cv)\n }\n envTex = new THREE.CubeTexture(faces)\n envTex.needsUpdate = true\n return envTex\n }\n kit.studioEnvironment = studioEnvironment\n function makeMaterial(color: any, o: any) {\n o = o || {}\n const c = color instanceof THREE.Color ? color : new THREE.Color(color)\n const key =\n 's' +\n c.getHexString() +\n JSON.stringify(o, function (k, v) {\n return v && v.isColor ? '#' + v.getHexString() : v && v.isTexture ? v.uuid : v\n })\n if (!cache[key]) {\n const o2 = Object.assign({}, o)\n delete o2.noEnv\n const mt = new THREE.MeshStandardMaterial(Object.assign({ color: c, roughness: 0.8, metalness: 0, flatShading: false }, o2))\n if (!o.envMap && o.noEnv !== true && mt.metalness >= 0.6) {\n mt.envMap = studioEnvironment()\n if (o.envMapIntensity == null) mt.envMapIntensity = 0.55 + (mt.metalness - 0.6) * 1.6\n }\n cache[key] = mt\n }\n return cache[key]\n }\n function makeFlatMaterial(color: any, o: any) {\n return makeMaterial(color, Object.assign({ flatShading: true, roughness: 0.92 }, o || {}))\n }\n const DOUBLE_SIDE = THREE.DoubleSide\n function toColor(hex: any) {\n return new THREE.Color(hex)\n }\n const MATERIALS = {\n trim: makeMaterial('#17191b', { roughness: 0.7 }),\n rubber: makeMaterial('#111111', { roughness: 0.95, side: DOUBLE_SIDE }),\n chrome: makeMaterial('#b8bcbf', { metalness: 0.9, roughness: 0.28 }),\n steel: makeMaterial('#6c7175', { metalness: 0.7, roughness: 0.45 }),\n glass: makeMaterial('#2a3c44', { roughness: 0.05, metalness: 0.25, transparent: true, opacity: 0.4, depthWrite: false, side: DOUBLE_SIDE }),\n tint: makeMaterial('#121a1e', { roughness: 0.05, metalness: 0.3, transparent: true, opacity: 0.62, depthWrite: false, side: DOUBLE_SIDE }),\n /* rear glass: darker, so the interior does not look like an open bed seen from behind */\n rearTint: makeMaterial('#0c1114', { roughness: 0.04, metalness: 0.45, transparent: true, opacity: 0.84, depthWrite: false, side: DOUBLE_SIDE }),\n glassDark: makeMaterial('#0c1317', { roughness: 0.06, metalness: 0.75, side: DOUBLE_SIDE }),\n armorGlass: makeMaterial('#1d302d', { roughness: 0.08, metalness: 0.4, transparent: true, opacity: 0.6, depthWrite: false, side: DOUBLE_SIDE }),\n glassEdge: makeMaterial('#a9bcc1', { roughness: 0.25, metalness: 0.1, transparent: true, opacity: 0.6, depthWrite: false, side: DOUBLE_SIDE }),\n lens: makeMaterial('#eef3f5', { roughness: 0.03, metalness: 0.1, transparent: true, opacity: 0.16, depthWrite: false }),\n lensRed: makeMaterial('#c0281c', { roughness: 0.04, metalness: 0.1, transparent: true, opacity: 0.42, depthWrite: false }),\n lensAmber: makeMaterial('#d88a2a', { roughness: 0.04, transparent: true, opacity: 0.4, depthWrite: false }),\n housing: makeMaterial('#111214', { roughness: 0.45, metalness: 0.2 }),\n reflector: makeMaterial('#dfe3e6', { metalness: 0.9, roughness: 0.12, side: DOUBLE_SIDE }),\n reflectorLit: makeMaterial('#e8e2cc', { metalness: 0.6, roughness: 0.18, emissive: toColor('#cfc19a'), emissiveIntensity: 1.6, side: DOUBLE_SIDE }),\n hole: makeMaterial('#040506', { roughness: 1, side: DOUBLE_SIDE }),\n dark: makeMaterial('#0a0b0c', { roughness: 1, side: DOUBLE_SIDE }),\n head: makeMaterial('#efe6c9', { emissive: toColor('#f0dcaa'), emissiveIntensity: 1.7, roughness: 0.2 }),\n led: makeMaterial('#e6f2ff', { emissive: toColor('#cfe6ff'), emissiveIntensity: 1.6, roughness: 0.2 }),\n tail: makeMaterial('#8a1a14', { emissive: toColor('#7a0d08'), emissiveIntensity: 0.8, roughness: 0.25 }),\n amber: makeMaterial('#c8781e', { emissive: toColor('#b0600c'), emissiveIntensity: 0.8, roughness: 0.3 }),\n rev: makeMaterial('#cfcfc8', { emissive: toColor('#5a5a55'), emissiveIntensity: 0.35, roughness: 0.3 }),\n blue: makeMaterial('#1d4f9a', { emissive: toColor('#2f6fe0'), emissiveIntensity: 1.2, roughness: 0.3 }),\n green: makeMaterial('#1d7a3a', { emissive: toColor('#2fbf5a'), emissiveIntensity: 1.0, roughness: 0.3 }),\n broken: makeMaterial('#1b1b1a', { roughness: 0.6 }),\n bulbBroken: makeMaterial('#232220', { roughness: 0.7, metalness: 0.2 }),\n wood: makeMaterial('#6b4a2e', { roughness: 0.9 }),\n leather: makeMaterial('#4a2f20', { roughness: 0.7 }),\n seat: makeMaterial('#1e1f22', { roughness: 0.85 }),\n alu: makeMaterial('#8e959a', { metalness: 0.6, roughness: 0.42, side: DOUBLE_SIDE }),\n carpet: makeMaterial('#141517', { roughness: 1 }),\n plastic: makeMaterial('#1f2023', { roughness: 0.75 }),\n headliner: makeMaterial('#6f6c66', { roughness: 0.95, side: DOUBLE_SIDE }),\n gauge: makeMaterial('#0d1512', { emissive: toColor('#4fbf8a'), emissiveIntensity: 0.35, roughness: 0.4 }),\n screen: makeMaterial('#0b1220', { emissive: toColor('#3d6cb0'), emissiveIntensity: 0.4, roughness: 0.2 }),\n bay: makeMaterial('#2c3033', { roughness: 0.8, metalness: 0.2, emissive: toColor('#0c0e10'), emissiveIntensity: 1, side: DOUBLE_SIDE }),\n hoodLiner: makeMaterial('#1c1d1e', { roughness: 0.95, side: DOUBLE_SIDE }),\n block: makeMaterial('#a3abb0', { metalness: 0.55, roughness: 0.38, emissive: toColor('#1a1d1f'), emissiveIntensity: 1 }),\n cover: makeMaterial('#3c4044', { metalness: 0.4, roughness: 0.35, emissive: toColor('#101213'), emissiveIntensity: 1 }),\n radiator: makeMaterial('#3a3f42', { metalness: 0.5, roughness: 0.55 }),\n yellow: makeMaterial('#e0b81c', { roughness: 0.4 }),\n capBlue: makeMaterial('#2a63c4', { roughness: 0.4 }),\n postRed: makeMaterial('#b3261e', { roughness: 0.4 }),\n postBlack: makeMaterial('#0c0c0c', { roughness: 0.4 }),\n coolant: makeMaterial('#e85fa3', { roughness: 0.15, transparent: true, opacity: 0.5, depthWrite: false }),\n coolantLiq: makeMaterial('#d0307a', { roughness: 0.3, emissive: toColor('#3a0a1e'), emissiveIntensity: 0.4 }),\n washer: makeMaterial('#9fd2ea', { roughness: 0.15, transparent: true, opacity: 0.5, depthWrite: false }),\n hv: makeMaterial('#e4670f', { roughness: 0.5 }),\n hose: makeMaterial('#121212', { roughness: 0.8 }),\n }\n kit.makeMaterial = makeMaterial\n kit.makeFlatMaterial = makeFlatMaterial\n kit.materials = MATERIALS\n function paintColor(hex: any, st: any) {\n const c = new THREE.Color(hex)\n if (st === 'damaged') {\n c.lerp(RUST, 0.22)\n c.multiplyScalar(0.9)\n }\n return c\n }\n kit.paintColor = paintColor\n const texCache: any = {}\n function textTexture(text: any, o: any) {\n o = o || {}\n const key = text + JSON.stringify(o)\n if (texCache[key]) return texCache[key]\n const w = o.w || 512\n const h = o.h || 128\n const cv = document.createElement('canvas')\n cv.width = w\n cv.height = h\n const x: any = cv.getContext('2d')\n if (o.bg) {\n x.fillStyle = o.bg\n x.fillRect(0, 0, w, h)\n }\n if (o.band) {\n x.fillStyle = o.band\n x.fillRect(0, 0, w, h * 0.24)\n x.fillStyle = '#fff'\n x.font = '600 ' + Math.round(h * 0.15) + \"px 'IBM Plex Sans', Arial, sans-serif\"\n x.textAlign = 'center'\n x.textBaseline = 'middle'\n x.fillText(kit.t('plate.band'), w / 2, h * 0.125)\n }\n x.fillStyle = o.fg || '#111'\n x.textAlign = 'center'\n x.textBaseline = 'middle'\n /* shrink the font until the text fits the width (never clips) */\n let fs = Math.round(h * (o.size || 0.6))\n const fam = (o.weight || '700') + ' '\n const ff = 'px ' + (o.font || \"'Saira Condensed', 'Arial Narrow', sans-serif\")\n x.font = fam + fs + ff\n while (fs > 6 && x.measureText(text).width > w * 0.94) {\n fs -= 1\n x.font = fam + fs + ff\n }\n x.fillText(text, w / 2, o.band ? h * 0.62 : h / 2 + 2)\n const t = new THREE.CanvasTexture(cv)\n texCache[key] = t\n return t\n }\n kit.textTexture = textTexture\n\n Object.assign(I, { RUST, cache, studioEnvironment, makeMaterial, makeFlatMaterial, DOUBLE_SIDE, toColor, MATERIALS, paintColor, texCache, textTexture })\n}\n","/** Geometry helpers: rounded boxes, lofts, creasing, subdivision, merging and convex hulls. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installGeometry(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const lod = kit.lod\n\n /* ================= geometry ================= */\n function roundedBoxGeometry(w: any, h: any, d: any, r: any) {\n r = Math.max(0.002, Math.min(r, w * 0.45, h * 0.45, d * 0.45))\n /* light mode: a small or hard-edged box is a plain box (12 triangles), the rest gets fewer rounding rings */\n if (lod.on && (r < 0.012 || Math.max(w, h, d) < lod.flatBoxEdge || Math.min(w, h, d) < 0.08)) return new THREE.BoxGeometry(w, h, d)\n const nb = lod.on ? lod.roundingRings : 3\n const n = 2 * nb + 1\n const g = new THREE.BoxGeometry(1, 1, 1, n, n, n)\n const p = g.attributes.position\n const nr = g.attributes.normal\n const hx = w / 2 - r\n const hy = h / 2 - r\n const hz = d / 2 - r\n function map(v: any, hi: any) {\n const i = Math.round((v + 0.5) * n)\n return i <= nb ? -hi - (r * (nb - i)) / nb : hi + (r * (i - nb - 1)) / nb\n }\n const q = new V3()\n const c = new V3()\n const dir = new V3()\n for (let i = 0; i < p.count; i++) {\n q.set(map(p.getX(i), hx), map(p.getY(i), hy), map(p.getZ(i), hz))\n c.set(clamp(q.x, -hx, hx), clamp(q.y, -hy, hy), clamp(q.z, -hz, hz))\n dir.subVectors(q, c)\n if (dir.lengthSq() > 1e-12) {\n dir.normalize()\n q.copy(c).addScaledVector(dir, r)\n nr.setXYZ(i, dir.x, dir.y, dir.z)\n }\n p.setXYZ(i, q.x, q.y, q.z)\n }\n return g\n }\n function taper(geo: any, t: any) {\n geo.computeBoundingBox()\n const bb = geo.boundingBox\n const h = bb.max.y - bb.min.y\n const p = geo.attributes.position\n const sx = t.sx == null ? 1 : t.sx\n const sz = t.sz == null ? 1 : t.sz\n const sh = t.shift || 0\n for (let i = 0; i < p.count; i++) {\n const k = (p.getY(i) - bb.min.y) / h\n p.setX(i, p.getX(i) * (1 + (sx - 1) * k) + sh * k)\n p.setZ(i, p.getZ(i) * (1 + (sz - 1) * k))\n }\n p.needsUpdate = true\n geo.computeVertexNormals()\n }\n function subdivide(geo: any, maxLen: any) {\n if (lod.on) maxLen = maxLen * lod.subdivisionFactor\n const src = geo.index ? geo.toNonIndexed() : geo\n const a = src.attributes.position.array\n const out: any = []\n function d(p: any, q: any) {\n return Math.hypot(p[0] - q[0], p[1] - q[1], p[2] - q[2])\n }\n function m(p: any, q: any) {\n return [(p[0] + q[0]) / 2, (p[1] + q[1]) / 2, (p[2] + q[2]) / 2]\n }\n function tri(A: any, B: any, C: any, depth: any) {\n const ab = d(A, B)\n const bc = d(B, C)\n const ca = d(C, A)\n const mx = Math.max(ab, bc, ca)\n if (mx <= maxLen || depth > 12) {\n out.push(A[0], A[1], A[2], B[0], B[1], B[2], C[0], C[1], C[2])\n return\n }\n if (mx === ab) {\n const D = m(A, B)\n tri(A, D, C, depth + 1)\n tri(D, B, C, depth + 1)\n } else if (mx === bc) {\n const E2 = m(B, C)\n tri(A, B, E2, depth + 1)\n tri(A, E2, C, depth + 1)\n } else {\n const F = m(C, A)\n tri(A, B, F, depth + 1)\n tri(F, B, C, depth + 1)\n }\n }\n for (let i = 0; i < a.length; i += 9) tri([a[i], a[i + 1], a[i + 2]], [a[i + 3], a[i + 4], a[i + 5]], [a[i + 6], a[i + 7], a[i + 8]], 0)\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(out, 3))\n g.userData.crease = true\n return g\n }\n function crease(geo: any, deg: any) {\n if (geo.index) {\n const ni = geo.toNonIndexed()\n Object.keys(ni.attributes).forEach(function (k) {\n geo.setAttribute(k, ni.attributes[k])\n })\n geo.setIndex(null)\n }\n const p = geo.attributes.position\n const n = p.count\n /* face normals in one array (x, y, z per face): the same arithmetic as the vector operations, without an object per face */\n const faces = n / 3\n const FN = new Float64Array(faces * 3)\n const map = new Map<number | string, number[]>()\n /* vertices closer than 1/2000 share a key; the three rounded coordinates pack into one number (17 bits each) so the lookup hashes no string */\n const RANGE = 65536\n function key(i: any): number | string {\n const x = Math.round(p.getX(i) * 2000)\n const y = Math.round(p.getY(i) * 2000)\n const z = Math.round(p.getZ(i) * 2000)\n if (Math.abs(x) < RANGE && Math.abs(y) < RANGE && Math.abs(z) < RANGE) return ((x + RANGE) * 131072 + (y + RANGE)) * 131072 + (z + RANGE)\n return x + ',' + y + ',' + z\n }\n const keys = new Array(n)\n for (let f = 0; f < faces; f++) {\n const ax = p.getX(3 * f)\n const ay = p.getY(3 * f)\n const az = p.getZ(3 * f)\n const bx = p.getX(3 * f + 1)\n const by = p.getY(3 * f + 1)\n const bz = p.getZ(3 * f + 1)\n const cx = p.getX(3 * f + 2)\n const cy = p.getY(3 * f + 2)\n const cz = p.getZ(3 * f + 2)\n /* cross(C - B, A - B) */\n const e1x = cx - bx\n const e1y = cy - by\n const e1z = cz - bz\n const e2x = ax - bx\n const e2y = ay - by\n const e2z = az - bz\n let nx = e1y * e2z - e1z * e2y\n let ny = e1z * e2x - e1x * e2z\n let nz = e1x * e2y - e1y * e2x\n if (nx * nx + ny * ny + nz * nz > 1e-20) {\n const inv = 1 / (Math.sqrt(nx * nx + ny * ny + nz * nz) || 1)\n nx *= inv\n ny *= inv\n nz *= inv\n }\n FN[3 * f] = nx\n FN[3 * f + 1] = ny\n FN[3 * f + 2] = nz\n for (let k = 0; k < 3; k++) {\n const kk = key(3 * f + k)\n keys[3 * f + k] = kk\n const list = map.get(kk)\n if (list) list.push(f)\n else map.set(kk, [f])\n }\n }\n const cs = Math.cos((deg * PI) / 180)\n const out = new Float32Array(n * 3)\n for (let i = 0; i < n; i++) {\n const fi = ((i / 3) | 0) * 3\n const list = map.get(keys[i]) as number[]\n let sx = 0\n let sy = 0\n let sz = 0\n for (let j = 0; j < list.length; j++) {\n const g = list[j] * 3\n if (FN[g] * FN[fi] + FN[g + 1] * FN[fi + 1] + FN[g + 2] * FN[fi + 2] >= cs) {\n sx += FN[g]\n sy += FN[g + 1]\n sz += FN[g + 2]\n }\n }\n if (sx * sx + sy * sy + sz * sz < 1e-20) {\n sx = FN[fi]\n sy = FN[fi + 1]\n sz = FN[fi + 2]\n }\n const inv = 1 / (Math.sqrt(sx * sx + sy * sy + sz * sz) || 1)\n out[3 * i] = sx * inv\n out[3 * i + 1] = sy * inv\n out[3 * i + 2] = sz * inv\n }\n geo.setAttribute('normal', new THREE.BufferAttribute(out, 3))\n geo.userData.crease = true\n return geo\n }\n function pathShape(items: any) {\n const s = new THREE.Shape()\n const n = items.length\n function sp(it: any) {\n return it.arc ? [it.arc[0] + it.arc[2] * Math.cos(it.arc[3]), it.arc[1] + it.arc[2] * Math.sin(it.arc[3])] : [it[0], it[1]]\n }\n function ep(it: any) {\n return it.arc ? [it.arc[0] + it.arc[2] * Math.cos(it.arc[4]), it.arc[1] + it.arc[2] * Math.sin(it.arc[4])] : [it[0], it[1]]\n }\n const ins = []\n const outs = []\n for (let i = 0; i < n; i++) {\n const it = items[i]\n if (it.arc) {\n ins.push(sp(it))\n outs.push(ep(it))\n continue\n }\n const r = it[2] || 0\n const pv = ep(items[(i - 1 + n) % n])\n const nx = sp(items[(i + 1) % n])\n const dp = Math.hypot(pv[0] - it[0], pv[1] - it[1]) || 1\n const dn = Math.hypot(nx[0] - it[0], nx[1] - it[1]) || 1\n const rp = Math.min(r, dp * 0.45)\n const rn = Math.min(r, dn * 0.45)\n ins.push([it[0] + ((pv[0] - it[0]) / dp) * rp, it[1] + ((pv[1] - it[1]) / dp) * rp])\n outs.push([it[0] + ((nx[0] - it[0]) / dn) * rn, it[1] + ((nx[1] - it[1]) / dn) * rn])\n }\n s.moveTo(outs[0][0], outs[0][1])\n for (let j = 1; j <= n; j++) {\n const idx = j % n\n const it2 = items[idx]\n s.lineTo(ins[idx][0], ins[idx][1])\n if (it2.arc) s.absarc(it2.arc[0], it2.arc[1], it2.arc[2], it2.arc[3], it2.arc[4], !!it2.arc[5])\n else if ((it2[2] || 0) > 0) s.quadraticCurveTo(it2[0], it2[1], outs[idx][0], outs[idx][1])\n }\n return s\n }\n function tumble(geo: any, T: any) {\n if (!T) return\n const p = geo.attributes.position\n for (let i = 0; i < p.count; i++) {\n const t = clamp((p.getY(i) - T.belt) / (T.top - T.belt), 0, 1)\n p.setZ(i, p.getZ(i) * (1 - T.k * t))\n }\n p.needsUpdate = true\n }\n function loftGeometry(st: any, seg: any, pw: any, colorFn: any) {\n seg = seg || 22\n pw = pw || 2\n const pos: any = []\n const col: any = []\n const idx = []\n const ring = seg + 1\n st.forEach(function (s: any) {\n for (let j = 0; j <= seg; j++) {\n const a = (j / seg) * PI * 2\n const c = Math.cos(a)\n const sn = Math.sin(a)\n const e = 2 / (s.p || pw)\n const yy = s.y + (s.h / 2) * Math.sign(sn) * Math.pow(Math.abs(sn), e)\n const zz = (s.w / 2) * Math.sign(c) * Math.pow(Math.abs(c), e)\n pos.push(s.x, yy, zz)\n if (colorFn) {\n const cc = colorFn(s.x, yy, zz, s)\n col.push(cc.r, cc.g, cc.b)\n }\n }\n })\n for (let i = 0; i < st.length - 1; i++)\n for (let k = 0; k < seg; k++) {\n const a0 = i * ring + k\n const b0 = a0 + ring\n idx.push(a0, a0 + 1, b0, a0 + 1, b0 + 1, b0)\n }\n ;[0, st.length - 1].forEach(function (si, e) {\n const s = st[si]\n if (s.w < 0.01) return\n const ci = pos.length / 3\n pos.push(s.x, s.y, 0)\n if (colorFn) {\n const cc = colorFn(s.x, s.y, 0, s)\n col.push(cc.r, cc.g, cc.b)\n }\n for (let k = 0; k < seg; k++) {\n const a = si * ring + k\n if (e === 0) idx.push(ci, a + 1, a)\n else idx.push(ci, a, a + 1)\n }\n })\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n if (colorFn) g.setAttribute('color', new THREE.Float32BufferAttribute(col, 3))\n g.setIndex(idx)\n g.computeVertexNormals()\n return g\n }\n function hullGeometry(o: any, colorFn: any) {\n const n = o.n || 18\n const m = 14\n const pos = []\n const col = []\n const idx = []\n for (let i = 0; i <= n; i++) {\n const t = i / n\n const x = -o.L / 2 + t * o.L\n const b = o.beam(t)\n const ky = o.keel(t)\n const sy = o.sheer(t)\n for (let j = 0; j <= m; j++) {\n const v = (j / m) * 2 - 1\n const z = b * v\n const y = ky + (sy - ky) * Math.pow(Math.abs(v), o.p || 2)\n pos.push(x, y, z)\n if (colorFn) {\n const c = colorFn(x, y, z)\n col.push(c.r, c.g, c.b)\n }\n }\n }\n for (let a = 0; a < n; a++)\n for (let k = 0; k < m; k++) {\n const p0 = a * (m + 1) + k\n const p1 = p0 + m + 1\n idx.push(p0, p1, p0 + 1, p0 + 1, p1, p1 + 1)\n }\n const ci = pos.length / 3\n const x0 = -o.L / 2\n const sy0 = o.sheer(0)\n pos.push(x0, sy0, 0)\n if (colorFn) {\n const c0 = colorFn(x0, sy0, 0)\n col.push(c0.r, c0.g, c0.b)\n }\n for (let q = 0; q < m; q++) idx.push(ci, q, q + 1)\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n if (colorFn) g.setAttribute('color', new THREE.Float32BufferAttribute(col, 3))\n g.setIndex(idx)\n g.computeVertexNormals()\n return g\n }\n /* Cuts triangles: each test { sel(normal, centre) -> bool, sdf(x,y,z) -> number (negative = remove), tag }.\n Triangles crossing the edge are cut along the line sdf = 0. Removed pieces with a tag come back in .cut[tag]. */\n function cutGeometry(geo: any, tests: any) {\n const src = geo.index ? geo.toNonIndexed() : geo\n const names = ['position'].concat(\n ['color', 'uv'].filter(function (n) {\n return !!src.attributes[n]\n }),\n )\n const sizes = names.map(function (n) {\n return src.attributes[n].itemSize\n })\n const arrs = names.map(function (n) {\n return src.attributes[n].array\n })\n const nv = src.attributes.position.count\n let tris: any = []\n for (let f = 0; f < nv; f += 3) {\n const t = []\n for (let k = 0; k < 3; k++) {\n const v = []\n for (let a = 0; a < names.length; a++) for (let q = 0; q < sizes[a]; q++) v.push(arrs[a][(f + k) * sizes[a] + q])\n t.push(v)\n }\n tris.push(t)\n }\n const cut: any = {}\n const n = new V3()\n const e1 = new V3()\n const e2 = new V3()\n const ce = new V3()\n function lerp(P: any, Q: any, k: any) {\n const o = new Array(P.length)\n for (let i = 0; i < P.length; i++) o[i] = P[i] + (Q[i] - P[i]) * k\n return o\n }\n function clip(t: any, d: any, s: any) {\n const out = []\n for (let i = 0; i < 3; i++) {\n const j = (i + 1) % 3\n const di = s * d[i]\n const dj = s * d[j]\n if (di >= 0) out.push(t[i])\n if (di >= 0 !== dj >= 0) out.push(lerp(t[i], t[j], di / (di - dj)))\n }\n return out\n }\n function fan(poly: any, arr: any) {\n for (let i = 1; i < poly.length - 1; i++) arr.push([poly[0], poly[i], poly[i + 1]])\n }\n tests.forEach(function (T: any) {\n const next: any = []\n const rem = T.tag ? (cut[T.tag] = cut[T.tag] || []) : null\n tris.forEach(function (t: any) {\n const A = t[0]\n const B = t[1]\n const C = t[2]\n e1.set(B[0] - A[0], B[1] - A[1], B[2] - A[2])\n e2.set(C[0] - A[0], C[1] - A[1], C[2] - A[2])\n n.crossVectors(e1, e2)\n const len = n.length()\n if (len < 1e-12) {\n next.push(t)\n return\n }\n n.multiplyScalar(1 / len)\n ce.set((A[0] + B[0] + C[0]) / 3, (A[1] + B[1] + C[1]) / 3, (A[2] + B[2] + C[2]) / 3)\n if (T.sel && !T.sel(n, ce)) {\n next.push(t)\n return\n }\n const d = [T.sdf(A[0], A[1], A[2]), T.sdf(B[0], B[1], B[2]), T.sdf(C[0], C[1], C[2])]\n const ins = (d[0] < 0 ? 1 : 0) + (d[1] < 0 ? 1 : 0) + (d[2] < 0 ? 1 : 0)\n if (ins === 0) next.push(t)\n else if (ins === 3) {\n if (rem) rem.push(t)\n } else {\n fan(clip(t, d, 1), next)\n if (rem) fan(clip(t, d, -1), rem)\n }\n })\n tris = next\n })\n function build(list: any) {\n const g = new THREE.BufferGeometry()\n let off = 0\n names.forEach(function (nm, a) {\n const arr = new Float32Array(list.length * 3 * sizes[a])\n let w = 0\n list.forEach(function (t: any) {\n for (let k = 0; k < 3; k++) for (let q = 0; q < sizes[a]; q++) arr[w++] = t[k][off + q]\n })\n g.setAttribute(nm, new THREE.BufferAttribute(arr, sizes[a]))\n off += sizes[a]\n })\n g.userData.crease = true\n return g\n }\n const out: any = { geo: build(tris), cut: {} }\n Object.keys(cut).forEach(function (k) {\n out.cut[k] = crease(build(cut[k]), 42)\n })\n return out\n }\n /* Merges geometries (already transformed) into one, for repeated parts such as track links and honeycomb. */\n function mergeGeometries(list: any) {\n const pos: any = []\n const nor: any = []\n list.forEach(function (g: any) {\n const n = g.index ? g.toNonIndexed() : g\n if (!n.attributes.normal) n.computeVertexNormals()\n const pa = n.attributes.position.array\n const na = n.attributes.normal.array\n for (let i = 0; i < pa.length; i++) {\n pos.push(pa[i])\n nor.push(na[i])\n }\n })\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n g.setAttribute('normal', new THREE.Float32BufferAttribute(nor, 3))\n return g\n }\n /* Normalised 0..1 UV projecting onto the two axes of greatest extent (or onto the given axes, e.g. \"xy\"). */\n function uvProject(geo: any, axes: any) {\n geo.computeBoundingBox()\n const bb = geo.boundingBox\n const sz = new V3().subVectors(bb.max, bb.min)\n const ax = axes\n ? [axes.charCodeAt(0) - 120, axes.charCodeAt(1) - 120]\n : [0, 1, 2]\n .sort(function (a, b) {\n return sz.getComponent(b) - sz.getComponent(a)\n })\n .slice(0, 2)\n .sort()\n const p = geo.attributes.position\n const uv = new Float32Array(p.count * 2)\n const v = new V3()\n for (let i = 0; i < p.count; i++) {\n v.fromBufferAttribute(p, i)\n uv[2 * i] = (v.getComponent(ax[0]) - bb.min.getComponent(ax[0])) / (sz.getComponent(ax[0]) || 1)\n uv[2 * i + 1] = (v.getComponent(ax[1]) - bb.min.getComponent(ax[1])) / (sz.getComponent(ax[1]) || 1)\n }\n geo.setAttribute('uv', new THREE.BufferAttribute(uv, 2))\n return sz.getComponent(ax[0]) / (sz.getComponent(ax[1]) || 1)\n }\n kit.geo = {\n roundedBox: roundedBoxGeometry,\n taper: taper,\n subdivide: subdivide,\n crease: crease,\n pathShape: pathShape,\n tumble: tumble,\n loft: loftGeometry,\n hull: hullGeometry,\n cut: cutGeometry,\n merge: mergeGeometries,\n uvProject: uvProject,\n }\n /* Ready-made holes for shell({ holes }) and geo.cut */\n kit.holeTop = function (x0: any, x1: any, z: any, yMin: any, tag: any) {\n return {\n tag: tag,\n sel: function (n: any, ce: any) {\n return n.y > 0.3 && ce.y > yMin\n },\n sdf: function (x: any, y: any, zz: any) {\n return Math.max(x0 - x, x - x1, Math.abs(zz) - z)\n },\n }\n }\n kit.holeSide = function (poly: any, o: any) {\n o = o || {}\n let area = 0\n for (let i = 0; i < poly.length; i++) {\n const a = poly[i]\n const b = poly[(i + 1) % poly.length]\n area += a[0] * b[1] - b[0] * a[1]\n }\n const sg = area > 0 ? 1 : -1\n const E2 = poly.map(function (a: any, i: any) {\n const b = poly[(i + 1) % poly.length]\n const dx = b[0] - a[0]\n const dy = b[1] - a[1]\n const L = Math.hypot(dx, dy) || 1\n return [a[0], a[1], (sg * dy) / L, (-sg * dx) / L]\n })\n const sh = o.shrink || 0\n const zMin = o.zMin || 0\n return {\n tag: o.tag,\n sel: function (n: any, ce: any) {\n return Math.abs(n.z) > 0.5 && Math.abs(ce.z) >= zMin && (o.side == null || Math.sign(ce.z) === o.side)\n },\n sdf: function (x: any, y: any) {\n let d = -1e9\n for (let i = 0; i < E2.length; i++) {\n const e = E2[i]\n d = Math.max(d, (x - e[0]) * e[2] + (y - e[1]) * e[3])\n }\n return d + sh\n },\n }\n }\n kit.holeQuad = function (q: any, margin: any) {\n margin = margin || 0\n return {\n sel: function (n: any) {\n return n.x * q.n[0] + n.y * q.n[1] > 0.55\n },\n sdf: function (x: any, y: any, z: any) {\n const rx = x - q.pb[0]\n const ry = y - q.pb[1]\n const s = rx * q.u[0] + ry * q.u[1]\n const dn = rx * q.n[0] + ry * q.n[1]\n const s0 = q.ins\n const s1 = q.L - q.ins * 1.3\n const k = clamp((s - s0) / (s1 - s0), 0, 1)\n const hw = q.hb + (q.ht - q.hb) * k - margin\n return Math.max(s0 + margin - s, s - s1 + margin, Math.abs(z) - hw, Math.abs(dn - q.bev) - 0.08)\n },\n }\n }\n kit.holeBox = function (min: any, max: any, sel: any, tag: any) {\n return {\n tag: tag,\n sel: sel || null,\n sdf: function (x: any, y: any, z: any) {\n return Math.max(min[0] - x, x - max[0], min[1] - y, y - max[1], min[2] - z, z - max[2])\n },\n }\n }\n kit.holeWhere = function (sel: any, tag: any) {\n return {\n tag: tag,\n sel: sel,\n sdf: function () {\n return -1\n },\n }\n }\n\n Object.assign(I, { roundedBoxGeometry, taper, subdivide, crease, pathShape, tumble, loftGeometry, hullGeometry, cutGeometry, mergeGeometries, uvProject })\n}\n","import type { Kit } from './types'\nimport { clamp, rng } from './util'\n\nexport function installContext(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, DOUBLE_SIDE, MATERIALS, crease, mergeGeometries, paintColor, roundedBoxGeometry, subdivide, taper, textTexture } = I\n\n /**\n * Normalises a label argument. A plain string is used as given; `{ key }` takes the text from the locale (`parts.<key>`);\n * `{ key, label }` uses the given text but keeps the key, which the zone derivation uses to recognise the part.\n */\n function resolveLabel(l: any): { label: string; key?: string } {\n if (l && typeof l === 'object') return { key: l.key, label: l.label != null ? l.label : kit.t('parts.' + l.key) }\n return { label: l }\n }\n kit.resolveLabel = resolveLabel\n I.resolveLabel = resolveLabel\n\n /* ================= build context ================= */\n /** The object every vehicle builder receives. Axes: +x front, +y up, +z right (driver at negative z), ground at y = 0, metres. */\n class BuildContext {\n [key: string]: any\n constructor(state: string, seed?: number) {\n this.root = new THREE.Group()\n this.vehicle = new THREE.Group()\n this.effects = new THREE.Group()\n this.root.add(this.vehicle)\n this.root.add(this.effects)\n this.state = state\n this.glass = []\n this.quads = []\n this.deform = []\n this.wheels = []\n this.parts = []\n this.spin = []\n this.lights = []\n this.fluids = []\n this.meta = {}\n this.log = []\n this.paints = new Set()\n this.zoneDefs = []\n this.particles = []\n this.emitters = []\n this.seatTops = []\n this.hood = null\n this.rollState = null\n this.flipped = false\n this.time = 0\n this.rand = rng(seed || 7)\n }\n add(geo: any, mat: any, x: any, y: any, z: any, parent: any) {\n const m = new THREE.Mesh(geo, mat)\n m.position.set(x || 0, y || 0, z || 0)\n m.castShadow = true\n m.receiveShadow = true\n ;(parent || this.vehicle).add(m)\n return m\n }\n /** Paint material; `meta.matte` (or `o.matte`) gives a matte finish to everything, including parts created later (damage, hood). */\n paint(hex: any, o: any) {\n o = Object.assign({}, o || {})\n const matte = o.matte != null ? o.matte : this.meta.matte\n delete o.matte\n const base = matte\n ? { roughness: this.state === 'damaged' ? 0.92 : 0.82, metalness: 0.08, side: DOUBLE_SIDE }\n : { roughness: this.state === 'damaged' ? 0.75 : 0.42, metalness: 0.3, side: DOUBLE_SIDE }\n const pm = makeMaterial(paintColor(hex, this.state), Object.assign(base, o))\n this.paints.add(pm)\n return pm\n }\n roundBox(w: any, h: any, d: any, r: any, mat: any, x: any, y: any, z: any, o: any) {\n o = o || {}\n let geo = roundedBoxGeometry(w, h, d, r)\n if (o.taper) taper(geo, o.taper)\n if (o.sub) geo = crease(subdivide(geo, o.sub), 40)\n else if (o.def) geo = crease(geo.toNonIndexed(), 50)\n const m = this.add(geo, mat, x, y, z, o.parent)\n if (o.rot) m.rotation.set(o.rot[0], o.rot[1], o.rot[2])\n if (o.def) this.deform.push(m)\n return m\n }\n cylinder(r1: any, r2: any, h: any, mat: any, x: any, y: any, z: any, axis: any, o: any) {\n o = o || {}\n const m = this.add(new THREE.CylinderGeometry(r1, r2, h, o.seg || 20, 1, !!o.open), mat, x, y, z, o.parent)\n if (axis === 'x') m.rotation.z = -PI / 2\n else if (axis === 'z') m.rotation.x = PI / 2\n return m\n }\n sphere(r: any, mat: any, x: any, y: any, z: any, sx: any, sy: any, sz: any, o: any) {\n o = o || {}\n const m = this.add(new THREE.SphereGeometry(r, o.ws || 18, o.hs || 12, 0, PI * 2, 0, o.tl || PI), mat, x, y, z, o.parent)\n m.scale.set(sx || 1, sy || 1, sz || 1)\n return m\n }\n rod(a: any, b: any, r: any, mat: any, o: any) {\n o = o || {}\n const len = a.distanceTo(b)\n const m = this.add(\n new THREE.CylinderGeometry(r, o.r2 == null ? r : o.r2, len, o.seg || 10),\n mat,\n (a.x + b.x) / 2,\n (a.y + b.y) / 2,\n (a.z + b.z) / 2,\n o.parent,\n )\n m.quaternion.setFromUnitVectors(new V3(0, 1, 0), new V3().subVectors(b, a).normalize())\n return m\n }\n tube(pts: any, r: any, mat: any, o: any) {\n o = o || {}\n const curve = new THREE.CatmullRomCurve3(\n pts.map(function (p: any) {\n return p.isVector3 ? p.clone() : new V3(p[0], p[1], p[2] || 0)\n }),\n !!o.closed,\n )\n return this.add(new THREE.TubeGeometry(curve, o.seg || 40, r, o.rs || 8, !!o.closed), mat, 0, 0, 0, o.parent)\n }\n text(txt: any, w: any, h: any, x: any, y: any, z: any, face: any, o: any) {\n o = o || {}\n const mat = new THREE.MeshStandardMaterial({ map: textTexture(txt, o), transparent: !o.bg, roughness: 0.6, alphaTest: o.bg ? 0 : 0.3 })\n if (o.glow) {\n mat.emissive = new THREE.Color(o.glow)\n mat.emissiveMap = mat.map\n mat.emissiveIntensity = 0.6\n }\n const m = this.add(new THREE.PlaneGeometry(w, h), mat, x, y, z, o.parent)\n m.castShadow = false\n if (face === '+y' || face === '-y') m.rotation.x = face === '+y' ? -PI / 2 : PI / 2\n else m.rotation.y = ({ '+z': 0, '-z': PI, '+x': PI / 2, '-x': -PI / 2 } as Record<string, number>)[face] || 0\n return m\n }\n plate(x: any, y: any, z: any, face: any, txt: any) {\n /* the plate is rigid: soft body deformation (warp, sculpting) does not bend it; a dent carries it as a rigid body */\n const pl = this.text(txt || kit.config.plate, 0.4, 0.13, x, y, z, face, {\n w: 400,\n h: 130,\n bg: '#f2f2ee',\n band: '#1f4fa3',\n fg: '#151515',\n size: 0.5,\n font: \"'IBM Plex Mono', monospace\",\n weight: '500',\n })\n pl.userData.noWarp = true\n pl.userData.plate = true\n return pl\n }\n part(kind: any, label: any, obj: any, pos: any, reach?: any, o?: any) {\n const L = I.resolveLabel(label)\n const pt = Object.assign(\n { kind: kind, label: L.label, key: L.key, obj: obj, pos: pos.clone ? pos.clone() : new V3(pos[0], pos[1], pos[2]), reach: reach || 1 },\n o || {},\n )\n this.parts.push(pt)\n return pt\n }\n wheel(x: any, z: any, r: any, w: any, o: any) {\n o = o || {}\n const s = z >= 0 ? 1 : -1\n const g = new THREE.Group()\n g.position.set(x, o.y == null ? r : o.y, z)\n this.vehicle.add(g)\n const rr = r * (o.rimR || 0.6)\n const prof = [\n [rr, -w / 2 + 0.01],\n [r - 0.06, -w / 2],\n [r - 0.015, -w / 2 + 0.035],\n [r, -w / 2 + 0.08],\n [r, w / 2 - 0.08],\n [r - 0.015, w / 2 - 0.035],\n [r - 0.06, w / 2],\n [rr, w / 2 - 0.01],\n ].map(function (p) {\n return new THREE.Vector2(p[0], p[1])\n })\n const tire = new THREE.Mesh(crease(new THREE.LatheGeometry(prof, 30).toNonIndexed(), 55), MATERIALS.rubber)\n tire.rotation.x = PI / 2\n tire.castShadow = true\n g.add(tire)\n if (o.lugs) {\n const nl = Math.round(r * 30)\n const lugs: any = []\n for (let i = 0; i < nl; i++) {\n const a = (i / nl) * PI * 2\n ;[-1, 1].forEach(function (sd) {\n const lk = clamp(r / 0.55, 0.45, 1)\n const lg = roundedBoxGeometry((0.07 + r * 0.04) * lk, (0.05 + r * 0.03) * lk, w * 0.42, 0.015 * lk)\n const M = new THREE.Matrix4().compose(\n new V3(Math.cos(a) * (r + 0.01 * clamp(r / 0.55, 0.45, 1)), Math.sin(a) * (r + 0.01 * clamp(r / 0.55, 0.45, 1)), sd * w * 0.24),\n new THREE.Quaternion().setFromEuler(new THREE.Euler(0, sd * (o.chevron ? 0.45 : 0), a)),\n new V3(1, 1, 1),\n )\n lg.applyMatrix4(M)\n lugs.push(lg)\n })\n }\n const lm = new THREE.Mesh(mergeGeometries(lugs), MATERIALS.rubber)\n lm.castShadow = true\n g.add(lm)\n }\n const rimMat = o.rim || MATERIALS.steel\n const rim = new THREE.Mesh(new THREE.CylinderGeometry(rr, rr, w * 0.78, 24), rimMat)\n rim.rotation.x = PI / 2\n g.add(rim)\n const dish = new THREE.Mesh(new THREE.CylinderGeometry(rr * 0.92, rr * 0.7, 0.05, 24), rimMat)\n dish.rotation.x = PI / 2\n dish.position.z = s * w * 0.36\n g.add(dish)\n const ns = o.spokes == null ? 5 : o.spokes\n for (let k = 0; k < ns; k++) {\n const sp = new THREE.Mesh(roundedBoxGeometry(rr * 0.85, rr * 0.2, 0.04, 0.015), o.spokeMat || rimMat)\n const a2 = (k / ns) * PI * 2\n sp.position.set(Math.cos(a2) * rr * 0.45, Math.sin(a2) * rr * 0.45, s * (w * 0.4))\n sp.rotation.z = a2\n g.add(sp)\n }\n const cap = new THREE.Mesh(new THREE.SphereGeometry(rr * 0.22, 14, 8), MATERIALS.chrome)\n cap.scale.z = 0.5\n cap.position.z = s * w * 0.42\n g.add(cap)\n for (let n = 0; n < 5; n++) {\n const nut = new THREE.Mesh(new THREE.CylinderGeometry(0.014, 0.014, 0.03, 6), MATERIALS.chrome)\n const an = (n / 5) * PI * 2 + 0.3\n nut.rotation.x = PI / 2\n nut.position.set(Math.cos(an) * rr * 0.33, Math.sin(an) * rr * 0.33, s * w * 0.43)\n g.add(nut)\n }\n g.userData.r = r\n this.wheels.push(g)\n if (!o.noPart)\n this.part(\n 'wheel',\n o.label || kit.t(x >= 0 ? 'parts.tire_front' : 'parts.tire_rear', { s }),\n g,\n new V3(x, r, z + s * w * 0.4),\n 0.9,\n )\n return g\n }\n /** Point in `c.vehicle` coordinates to effects-group coordinates (vehicle world, ground y = 0). */\n toEffects(p: any) {\n this.vehicle.updateMatrix()\n return p.clone().applyMatrix4(this.vehicle.matrix)\n }\n dirToEffects(d: any) {\n return d.clone().applyQuaternion(this.vehicle.quaternion)\n }\n\n\n /** Declares or refines a damage zone: `c.zone(id, label, box, parts, options)`. Pass `label === false` to remove an auto-derived zone. */\n zone(id: string, label: any, box?: any, parts?: any, o?: any) {\n const d: any = Object.assign({ id: id }, o || {})\n if (label === false) d.remove = true\n else if (label) d.name = label\n if (box) d.box = I.normalizeBox(box)\n if (parts) d.objs = Array.isArray(parts) ? parts.slice() : [parts]\n this.zoneDefs.push(d)\n return d\n }\n }\n kit.BuildContext = BuildContext\n I.BuildContext = BuildContext\n}\n","/** Soft body warp (sculpting) used for panel deformation. */\nimport type { Kit } from './types'\nimport { clamp, smooth } from './util'\n\nexport function installWarp(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const lod = kit.lod\n const { crease } = I\n\n /* ================= global rounding (warp), resampled loft ================= */\n /* makeWarp(o) creates f(x, y, z) -> [x, y, z] that rounds the front/rear in plan view and curves the side.\n o: { xF, xR, Lf, Lr, hw, bowF, bowR, pinF, pinR, belt, ys, yb, kt, kb, dropF, dropY }. applyWarp(c, f) deforms everything already assembled. */\n function makeWarp(o: any) {\n function sec(y: any) {\n if (y >= o.belt) return o.kt\n if (y >= o.ys) {\n const a = (y - o.ys) / (o.belt - o.ys)\n return o.kt * a * a\n }\n const b = clamp((o.ys - y) / (o.ys - o.yb), 0, 1.25)\n return o.kb * b * b\n }\n const f = function (x: any, y: any, z: any) {\n const tF = smooth((x - (o.xF - o.Lf)) / o.Lf)\n const tR = smooth((o.xR + o.Lr - x) / o.Lr)\n const u = Math.min(1.15, Math.abs(z) / o.hw)\n const u2 = u * u\n const dropF = o.dropF ? o.dropF * tF * u2 * smooth((y - o.dropY) / 0.25) : 0\n return [x - o.bowF * tF * u2 + o.bowR * tR * u2, y - dropF, z * (1 - sec(y)) * (1 - o.pinF * tF * tF) * (1 - o.pinR * tR * tR)]\n }\n f.sec = sec\n return f\n }\n function applyWarp(c: any, Wf: any) {\n c.root.updateMatrixWorld(true)\n const gInv = new THREE.Matrix4().copy(c.vehicle.matrixWorld).invert()\n const rel = new THREE.Matrix4()\n const irel = new THREE.Matrix4()\n const v = new V3()\n const use = new Map()\n c.root.traverse(function (o: any) {\n if (o.isMesh) use.set(o.geometry, (use.get(o.geometry) || 0) + 1)\n })\n const skip = new Set(c.wheels)\n const dset = new Set(c.deform)\n const yAx = new V3(0, 1, 0)\n function warpMesh(msh: any) {\n const g = msh.geometry\n if (use.get(g) > 1 || !g.attributes.position) return false\n rel.multiplyMatrices(gInv, msh.matrixWorld)\n irel.copy(rel).invert()\n const p = g.attributes.position\n for (let i = 0; i < p.count; i++) {\n v.fromBufferAttribute(p, i).applyMatrix4(rel)\n const r = Wf(v.x, v.y, v.z)\n v.set(r[0], r[1], r[2]).applyMatrix4(irel)\n p.setXYZ(i, v.x, v.y, v.z)\n }\n p.needsUpdate = true\n if (g.userData.crease) crease(g, 42)\n else g.computeVertexNormals()\n g.computeBoundingSphere()\n g.computeBoundingBox()\n return true\n }\n function rigid(o: any) {\n const p = o.position\n const r = Wf(p.x, p.y, p.z)\n const a = Wf(p.x, p.y, p.z - 0.03)\n const b = Wf(p.x, p.y, p.z + 0.03)\n const yaw = Math.atan2(b[0] - a[0], b[2] - a[2])\n p.set(r[0], r[1], r[2])\n if (Math.abs(yaw) > 1e-4) o.quaternion.premultiply(new THREE.Quaternion().setFromAxisAngle(yAx, yaw))\n }\n c.glass.forEach(function (gm: any) {\n const GD = gm.userData.glass\n if (!GD || !GD.outline || GD.zpos == null) return\n let cx = 0\n let cy = 0\n GD.outline.forEach(function (p: any) {\n cx += p.x\n cy += p.y\n })\n cx /= GD.outline.length\n cy /= GD.outline.length\n const f = Wf(cx, cy, GD.zpos)[2] / GD.zpos\n GD.outline = GD.outline.map(function (p: any) {\n const r = Wf(p.x, p.y, GD.zpos)\n return new THREE.Vector2(r[0], r[1])\n })\n GD.zpos *= f\n GD.Wg *= f\n })\n c.vehicle.children.slice().forEach(function (o: any) {\n if (skip.has(o) || o.userData.noWarp) return\n if (o.isMesh) {\n if (!warpMesh(o)) rigid(o)\n return\n }\n const defs: any = []\n o.traverse(function (x: any) {\n if (x !== o && x.isMesh && dset.has(x)) defs.push(x)\n })\n if (defs.length) defs.forEach(warpMesh)\n else rigid(o)\n })\n }\n function resample(st: any, n: any) {\n if (lod.on) n = Math.max(lod.minStations, Math.round(n * lod.stationFraction))\n const out = []\n const L = st.length\n function P(i: any) {\n return st[Math.max(0, Math.min(L - 1, i))]\n }\n for (let k = 0; k <= n; k++) {\n const u = (k / n) * (L - 1)\n const i = Math.min(L - 2, Math.floor(u))\n const t = u - i\n const a = P(i - 1)\n const b = P(i)\n const c2 = P(i + 1)\n const d = P(i + 2)\n const row = []\n for (let j = 0; j < b.length; j++) {\n let p0 = a[j] == null ? b[j] : a[j]\n let p1 = b[j]\n let p2 = c2[j]\n let p3 = d[j] == null ? c2[j] : d[j]\n p0 = p0 || 0\n p1 = p1 || 0\n p2 = p2 || 0\n p3 = p3 || 0\n row.push(0.5 * (2 * p1 + (-p0 + p2) * t + (2 * p0 - 5 * p1 + 4 * p2 - p3) * t * t + (-p0 + 3 * p1 - 3 * p2 + p3) * t * t * t))\n }\n out.push(row)\n }\n return out\n }\n function smoothLoft(st: any, o: any) {\n o = o || {}\n if (lod.on) o = Object.assign({}, o, { seg: Math.max(lod.minLoftSegments, Math.round((o.seg || 24) * lod.loftSegmentFraction)) })\n if (o.smooth) st = resample(st, o.smooth)\n const seg = o.seg || 24\n const pos: any = []\n const idx = []\n const ring = seg + 1\n const axisY = o.axis === 'y'\n st.forEach(function (s: any) {\n const a0 = s[1]\n const b0 = s[2]\n const cc = (a0 + b0) / 2\n const hh = Math.abs(a0 - b0) / 2\n const w = s[3] / 2\n const e = 2 / (s[4] || o.p || 2.4)\n const zc = s[5] || 0\n for (let j = 0; j <= seg; j++) {\n const a = (j / seg) * PI * 2\n const cs = Math.cos(a)\n const sn = Math.sin(a)\n const u = cc + hh * Math.sign(sn) * Math.pow(Math.abs(sn), e)\n const z = zc + w * Math.sign(cs) * Math.pow(Math.abs(cs), e)\n if (axisY) pos.push(u, s[0], z)\n else pos.push(s[0], u, z)\n }\n })\n for (let i = 0; i < st.length - 1; i++)\n for (let k = 0; k < seg; k++) {\n const A = i * ring + k\n const B = A + ring\n if (axisY) idx.push(A, B, A + 1, A + 1, B, B + 1)\n else idx.push(A, A + 1, B, A + 1, B + 1, B)\n }\n ;[0, st.length - 1].forEach(function (si, e) {\n const s = st[si]\n if (s[3] < 0.004) return\n const ci = pos.length / 3\n const cc = (s[1] + s[2]) / 2\n if (axisY) pos.push(cc, s[0], s[5] || 0)\n else pos.push(s[0], cc, s[5] || 0)\n for (let k = 0; k < seg; k++) {\n const a = si * ring + k\n const flip = (e === 0) !== axisY\n if (flip) idx.push(ci, a + 1, a)\n else idx.push(ci, a, a + 1)\n }\n })\n let g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n g.setIndex(idx)\n g = crease(g.toNonIndexed(), o.crease || 60)\n return g\n }\n kit.makeWarp = makeWarp\n kit.applyWarp = applyWarp\n kit.geo.resample = resample\n kit.geo.smoothLoft = smoothLoft\n\n Object.assign(I, { makeWarp, applyWarp, resample, smoothLoft })\n}\n","/** Car body shell, panels and body helpers. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installBody(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { MATERIALS, crease, cutGeometry, pathShape, subdivide, tumble } = I\n\n /* ================= bodies ================= */\n function halfAt(Wg: any, T: any, y: any) {\n return (Wg / 2) * (T ? 1 - T.k * clamp((y - T.belt) / (T.top - T.belt), 0, 1) : 1)\n }\n kit.halfAt = halfAt\n function shell(c: any, o: any) {\n const items = o.items.slice()\n if (o.arches)\n o.arches\n .slice()\n .sort(function (a: any, b: any) {\n return b[0] - a[0]\n })\n .forEach(function (a: any) {\n const a0 = Math.asin(clamp((o.bottomY - a[1]) / a[2], -1, 1))\n items.push({ arc: [a[0], a[1], a[2], a0, PI - a0, false] })\n })\n const bev = o.bev == null ? 0.05 : o.bev\n let geo = new THREE.ExtrudeGeometry(pathShape(items), {\n depth: Math.max(0.01, o.W - 2 * bev),\n bevelEnabled: bev > 0,\n bevelThickness: bev,\n bevelSize: bev,\n bevelSegments: 4,\n curveSegments: 14,\n steps: 1,\n })\n geo.translate(0, 0, -(o.W - 2 * bev) / 2)\n geo = subdivide(geo, o.sub || 0.2)\n tumble(geo, o.T)\n const tests = (o.holes || []).slice()\n let cut: any = {}\n if (o.arches && o.archInner != null)\n o.arches.forEach(function (a: any) {\n const zk = o.archInner\n tests.push({\n sel: function (n: any, ce: any) {\n const dx = a[0] - ce.x\n const dy = a[1] - ce.y\n const d = Math.hypot(dx, dy) || 1\n return d < a[2] + 0.08 && (n.x * dx + n.y * dy) / d > 0.4\n },\n sdf: function (x: any, y: any, z: any) {\n return Math.abs(z) - zk\n },\n })\n })\n if (tests.length) {\n const r = cutGeometry(geo, tests)\n geo = r.geo\n cut = r.cut\n }\n crease(geo, 42)\n const m = c.add(geo, o.mat || c.paint(o.col))\n c.deform.push(m)\n m.userData.cut = cut\n if (o.arches)\n o.arches.forEach(function (a: any) {\n const a0 = Math.asin(clamp((o.bottomY - a[1]) / a[2], -1, 1))\n const rr = a[2] - 0.01\n if (o.archInner == null) {\n const wl = c.add(new THREE.CylinderGeometry(rr, rr, o.W - 0.12, 20, 1, true, a0 + PI / 2, PI - 2 * a0), MATERIALS.dark, a[0], a[1], 0)\n wl.rotation.x = PI / 2\n wl.castShadow = false\n } else\n [1, -1].forEach(function (s) {\n const len = o.W / 2 - 0.06 - o.archInner\n const w2 = c.add(\n new THREE.CylinderGeometry(rr, rr, len, 20, 1, true, a0 + PI / 2, PI - 2 * a0),\n MATERIALS.dark,\n a[0],\n a[1],\n s * (o.archInner + len / 2),\n )\n w2.rotation.x = PI / 2\n w2.castShadow = false\n const cap = c.add(new THREE.CircleGeometry(rr, 20, a0, PI - 2 * a0), MATERIALS.dark, a[0], a[1], s * o.archInner)\n cap.castShadow = false\n })\n })\n return m\n }\n kit.shell = shell\n function autoWindows(gh: any) {\n const inn = 0.075\n const yb = gh.belt + 0.06\n const yt = gh.roof - 0.075\n function lx(x0: any, x1: any, y: any) {\n return x0 + ((x1 - x0) * (y - gh.belt)) / (gh.roof - gh.belt)\n }\n function rearX(y: any) {\n return lx(gh.rb, gh.rt, y) + inn * 1.3\n }\n function frontX(y: any) {\n return lx(gh.fb, gh.ft, y) - inn * 1.3\n }\n const ps = gh.pillars.slice().sort(function (a: any, b: any) {\n return a - b\n })\n const bounds = [-1e9]\n ps.forEach(function (p: any) {\n bounds.push(p - 0.06, p + 0.06)\n })\n bounds.push(1e9)\n const polys = []\n for (let i = 0; i < bounds.length; i += 2) {\n ;(function (xa, xb) {\n const L = function (y: any) {\n return Math.max(xa, rearX(y))\n }\n const R = function (y: any) {\n return Math.min(xb, frontX(y))\n }\n if (R(yb) - L(yb) > 0.15 && R(yt) - L(yt) > 0.05)\n polys.push([\n [L(yb), yb],\n [R(yb), yb],\n [R(yt), yt],\n [L(yt), yt],\n ])\n })(bounds[i], bounds[i + 1])\n }\n return polys\n }\n kit.autoWindows = autoWindows\n function profX(items: any, y: any, front: any) {\n let best = front ? -1e9 : 1e9\n for (let i = 0; i < items.length; i++) {\n const a = items[i]\n const b = items[(i + 1) % items.length]\n if (a.arc || b.arc) continue\n if ((a[1] - y) * (b[1] - y) <= 0 && a[1] !== b[1]) {\n const x = a[0] + ((b[0] - a[0]) * (y - a[1])) / (b[1] - a[1])\n best = front ? Math.max(best, x) : Math.min(best, x)\n }\n }\n return best\n }\n kit.profX = profX\n /* Real surface of the bodywork by ray. The shell of kit.shell/kit.car bulges 2 to 8 cm beyond the profile (bevel, tumble, sculpting),\n so a part, plate or text placed with profX() can end up buried. Use this to seat parts on the finished skin.\n kit.surfaceAt(c, origin, direction, { all, max }) -> { p, n, obj } in c.vehicle coordinates, or null.\n By default only paint and the meshes that dent count; all: true accepts any visible mesh. */\n const _sr = new THREE.Raycaster()\n kit.surfaceAt = function (c: any, org: any, dir: any, o: any) {\n o = o || {}\n c.root.updateMatrixWorld(true)\n const Mw = c.vehicle.matrixWorld\n const inv = new THREE.Matrix4().copy(Mw).invert()\n const dset = new Set(c.deform)\n const cands: any = []\n c.vehicle.traverse(function (q: any) {\n if (!q.isMesh || !q.visible || q.userData.glass || q.userData.decal || q.isSprite) return\n if (o.all || dset.has(q) || (c.paints && c.paints.has(q.material))) cands.push(q)\n })\n const d = (dir.isVector3 ? dir.clone() : new V3(dir[0], dir[1], dir[2])).normalize()\n const p0 = org.isVector3 ? org.clone() : new V3(org[0], org[1], org[2])\n _sr.set(p0.clone().applyMatrix4(Mw), d.clone().transformDirection(Mw))\n _sr.near = 0\n _sr.far = o.max || 20\n const h = _sr.intersectObjects(cands, false)[0]\n if (!h) return null\n const n = h.face ? h.face.normal.clone().transformDirection(h.object.matrixWorld).transformDirection(inv) : d.clone().negate()\n if (n.dot(d) > 0) n.negate()\n return { p: h.point.clone().applyMatrix4(inv), n: n, obj: h.object }\n }\n /* x of the skin at the front (front = true) or at the rear, at height y and side z; falls back to profX(items) if the ray finds nothing */\n kit.surfaceX = function (c: any, y: any, z: any, front: any, items: any) {\n const m = c.meta\n const sg = front === false ? -1 : 1\n const x0 = sg > 0 ? (m.front || 3) + 2 : (m.rear || -3) - 2\n const h = kit.surfaceAt(c, new V3(x0, y, z || 0), new V3(-sg, 0, 0))\n return h ? h.p.x : items ? profX(items, y, front !== false) : null\n }\n\n Object.assign(I, { halfAt, shell, autoWindows, profX, _sr })\n}\n","/** Glass panes: windshield quads, side windows and ghost glass. */\nimport type { Kit } from './types'\n\nexport function installGlass(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n const { MATERIALS, crease, cutGeometry, pathShape, subdivide, tumble, uvProject } = I\n\n /* ================= glass ================= */\n kit.addGlass = function (c: any, geo: any, label: any, type?: any, o?: any) {\n o = o || {}\n if (!geo.attributes.uv || o.reuv) o.aspect = uvProject(geo, o.uvAxes)\n const m = c.add(geo, o.mat || MATERIALS.glass)\n m.castShadow = false\n m.receiveShadow = false\n m.renderOrder = 2\n const L = I.resolveLabel(label)\n m.userData.glass = {\n type: type || 'tempered',\n label: L.label,\n key: L.key,\n outline: o.outline || null,\n side: o.side,\n Wg: o.Wg,\n T: o.T,\n zpos: o.zpos,\n aspect: o.aspect || 1,\n hits: 0,\n broken: false,\n }\n c.glass.push(m)\n c.deform.push(m)\n let pos = o.pos\n if (!pos) {\n geo.computeBoundingBox()\n pos = geo.boundingBox.getCenter(new V3()).add(m.position)\n }\n c.part('glass', L, m, pos, o.reach || 0.9)\n return m\n }\n /* registers a ready mesh (roundBox, sphere...) as glass; type \"laminated\" cracks, \"tempered\" shatters */\n kit.asGlass = function (c: any, mesh: any, label: any, type: any, o: any) {\n o = o || {}\n const i = c.deform.indexOf(mesh)\n if (i >= 0) c.deform.splice(i, 1)\n if (mesh.parent) mesh.parent.remove(mesh)\n const geo = mesh.geometry\n geo.applyMatrix4(new THREE.Matrix4().compose(mesh.position, mesh.quaternion, mesh.scale))\n if (o.reuv !== false) o.reuv = true\n return kit.addGlass(c, geo, label, type, Object.assign({ mat: mesh.material }, o))\n }\n kit.sideWindows = function (c: any, polys: any, Wg: any, T: any, label: any, o: any) {\n o = o || {}\n ;(o.sides || [1, -1]).forEach(function (s: any) {\n polys.forEach(function (poly: any, i: any) {\n const shp = pathShape(\n poly.map(function (p: any) {\n return [p[0], p[1], 0.035]\n }),\n )\n const geo = new THREE.ExtrudeGeometry(shp, { depth: 0.008, bevelEnabled: false, curveSegments: 4 })\n const zpos = s > 0 ? Wg / 2 + 0.004 : -Wg / 2 - 0.012\n geo.translate(0, 0, zpos)\n tumble(geo, T)\n geo.computeVertexNormals()\n const asp = uvProject(geo, 'xy')\n let cx = 0\n let cy = 0\n poly.forEach(function (p: any) {\n cx += p[0]\n cy += p[1]\n })\n cx /= poly.length\n cy /= poly.length\n const base = I.resolveLabel(label ? label(i, polys.length) : { key: 'window' })\n const lab = { key: base.key, label: kit.t('parts.glass_side', { label: base.label, s }) }\n kit.addGlass(c, geo, lab, o.type || 'tempered', {\n mat: o.mat || (o.see === false ? MATERIALS.glassDark : MATERIALS.glass),\n pos: new V3(cx, cy, s * I.halfAt(Wg, T, cy)),\n outline: shp.getSpacedPoints(56),\n side: s,\n Wg: Wg,\n T: T,\n zpos: zpos,\n aspect: asp,\n })\n const pts = shp.getSpacedPoints(36).map(function (p: any) {\n return [p.x, p.y, s * (I.halfAt(Wg, T, p.y) + 0.005)]\n })\n pts.pop()\n const seal = c.tube(pts, 0.011, MATERIALS.trim, { closed: true, seg: 72, rs: 5 })\n seal.castShadow = false\n })\n })\n }\n /* Cuts a ready mesh (mesh local coordinates) and recomputes the normals. */\n kit.cutMesh = function (mesh: any, tests: any, deg: any, o: any) {\n /* o.sub: subdivide first (edges longer than o.sub, in m) for windows inside large faces; drops colour/uv */\n const src = o && o.sub ? subdivide(mesh.geometry, o.sub) : mesh.geometry\n const r = cutGeometry(src, tests)\n crease(r.geo, deg || 42)\n mesh.geometry.dispose()\n mesh.geometry = r.geo\n return r.cut\n }\n kit.quadDef = function (pb: any, pt: any, Wg: any, T: any, which: any, bev: any, o: any) {\n o = o || {}\n bev = bev == null ? 0.05 : bev\n const dx = pt[0] - pb[0]\n const dy = pt[1] - pb[1]\n const L = Math.hypot(dx, dy)\n const ux = dx / L\n const uy = dy / L\n const nx = which === 'front' ? uy : -uy\n const ny = which === 'front' ? -ux : ux\n const ins = o.inset || 0.09\n const off = bev + 0.006\n const sd = o.side || 0.1\n const b = [pb[0] + ux * ins + nx * off, pb[1] + uy * ins + ny * off]\n const t = [pt[0] - ux * ins * 1.3 + nx * off, pt[1] - uy * ins * 1.3 + ny * off]\n const hb = I.halfAt(Wg, T, b[1]) - sd\n const ht = I.halfAt(Wg, T, t[1]) - sd\n return { pb: pb, pt: pt, L: L, u: [ux, uy], n: [nx, ny], ins: ins, b: b, t: t, hb: hb, ht: ht, which: which, bev: bev, Wg: Wg, T: T }\n }\n kit.glassQuad = function (c: any, q: any, label: any, o: any) {\n o = o || {}\n const NX = 10\n const NY = 8\n const pos = []\n const uv = []\n const idx = []\n for (let j = 0; j <= NY; j++)\n for (let i = 0; i <= NX; i++) {\n const u = i / NX\n const v = j / NY\n const x = q.b[0] + (q.t[0] - q.b[0]) * v\n const y = q.b[1] + (q.t[1] - q.b[1]) * v\n const hw = q.hb + (q.ht - q.hb) * v\n pos.push(x, y, -hw + 2 * hw * u)\n uv.push(u, v)\n }\n for (let jj = 0; jj < NY; jj++)\n for (let ii = 0; ii < NX; ii++) {\n const a = jj * (NX + 1) + ii\n const b = a + 1\n const cc = a + NX + 2\n const d = a + NX + 1\n if (q.which === 'front') idx.push(a, b, cc, a, cc, d)\n else idx.push(a, cc, b, a, d, cc)\n }\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n g.setAttribute('uv', new THREE.Float32BufferAttribute(uv, 2))\n g.setIndex(idx)\n g.computeVertexNormals()\n const m = kit.addGlass(c, g, label, o.type || 'laminated', {\n mat: o.mat || (o.see === false ? MATERIALS.glassDark : MATERIALS.glass),\n pos: new V3((q.b[0] + q.t[0]) / 2, (q.b[1] + q.t[1]) / 2, 0),\n aspect: (q.hb + q.ht) / (q.L - q.ins * 2.3),\n reach: 1.0,\n })\n const B0 = new V3(q.b[0], q.b[1], -q.hb)\n const B1 = new V3(q.b[0], q.b[1], q.hb)\n const T0 = new V3(q.t[0], q.t[1], -q.ht)\n const T1 = new V3(q.t[0], q.t[1], q.ht)\n ;[\n [B0, B1],\n [B1, T1],\n [T1, T0],\n [T0, B0],\n ].forEach(function (e) {\n c.rod(e[0], e[1], 0.012, MATERIALS.trim, { seg: 6 }).castShadow = false\n })\n c.quads.push(q)\n return m\n }\n\n Object.assign(I, {})\n}\n","/** Headlights and taillights in several styles, with beams and glow. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installLights(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const document = kit.document\n const { MATERIALS, mergeGeometries, roundedBoxGeometry, taper } = I\n\n /* ================= headlights, taillights, grilles ================= */\n function lampGroup(c: any, x: any, y: any, z: any, rotY: any) {\n const g = new THREE.Group()\n g.position.set(x, y, z)\n g.rotation.y = rotY || 0\n g.userData.rigid = true\n c.vehicle.add(g)\n return g\n }\n function gm(g: any, geo: any, mat: any, x?: any, y?: any, z?: any) {\n const m = new THREE.Mesh(geo, mat)\n m.position.set(x || 0, y || 0, z || 0)\n m.castShadow = false\n g.add(m)\n return m\n }\n function wedgeY(geo: any, w: any, s: any, k: any) {\n const p = geo.attributes.position\n for (let i = 0; i < p.count; i++) {\n const t = clamp((p.getZ(i) * s) / w + 0.5, 0, 1)\n p.setY(i, p.getY(i) * (1 - k * t) + k * t * 0.0)\n }\n p.needsUpdate = true\n geo.computeVertexNormals()\n return geo\n }\n /* additive halo of the headlight/taillight (sprite without raycast) */\n let haloTex: any = null\n function glowTexture() {\n if (haloTex) return haloTex\n const cv = document.createElement('canvas')\n cv.width = cv.height = 64\n const x: any = cv.getContext('2d')\n const gr = x.createRadialGradient(32, 32, 0, 32, 32, 32)\n gr.addColorStop(0, 'rgba(255,255,255,1)')\n gr.addColorStop(0.18, 'rgba(255,255,255,0.55)')\n gr.addColorStop(0.5, 'rgba(255,255,255,0.12)')\n gr.addColorStop(1, 'rgba(255,255,255,0)')\n x.fillStyle = gr\n x.fillRect(0, 0, 64, 64)\n haloTex = new THREE.CanvasTexture(cv)\n return haloTex\n }\n const haloMats: any = {}\n function halo(parent: any, x: any, y: any, z: any, size: any, hex: any, op: any) {\n const key = hex + op\n if (!haloMats[key])\n haloMats[key] = new THREE.SpriteMaterial({\n map: glowTexture(),\n color: new THREE.Color(hex),\n blending: THREE.AdditiveBlending,\n transparent: true,\n depthWrite: false,\n opacity: op,\n })\n const sp = new THREE.Sprite(haloMats[key])\n sp.position.set(x, y, z)\n sp.scale.set(size, size, 1)\n sp.raycast = function () {}\n sp.userData.decal = true\n sp.userData.halo = true\n sp.renderOrder = 4\n parent.add(sp)\n return sp\n }\n kit.halo = halo\n function lampKit(g: any, d: any, inner: any, lens: any, lensMat: any, refl?: any) {\n refl = refl || MATERIALS.reflector\n return {\n housing: function (w: any, h: any, y?: any, z?: any, geoFn?: any) {\n const geo = roundedBoxGeometry(d, h, w, Math.min(0.03, h * 0.4))\n if (geoFn) geoFn(geo)\n return gm(g, geo, MATERIALS.housing, 0, y || 0, z || 0)\n },\n lens: function (w: any, h: any, y?: any, z?: any, geoFn?: any) {\n const geo = roundedBoxGeometry(0.03, h + 0.006, w + 0.006, Math.min(0.025, h * 0.4))\n if (geoFn) geoFn(geo)\n const L = gm(g, geo, lensMat, d / 2 - 0.004, y || 0, z || 0)\n L.renderOrder = 3\n lens.push(L)\n return L\n },\n glow: function (geo: any, mat: any, x: any, y: any, z: any) {\n const m = gm(g, geo, mat, x, y, z)\n inner.push(m)\n return m\n },\n proj: function (y: any, z: any, r: any, mat: any) {\n const bz = gm(g, new THREE.CylinderGeometry(r * 1.3, r * 1.45, 0.03, 18), refl, d / 2 - 0.03, y, z)\n bz.rotation.z = -PI / 2\n if (refl !== MATERIALS.reflector) inner.push(bz)\n const e = gm(g, new THREE.SphereGeometry(r, 14, 10), mat, d / 2 - 0.022, y, z)\n e.scale.x = 0.55\n inner.push(e)\n return e\n },\n }\n }\n /* Headlight. o: { style: round|dround|rect|slim|split|wedge|ledbar|truck, x, y, z, w, h, d, side (+1 right / -1 left), yaw, mat, label } */\n kit.headlight = function (c: any, o: any) {\n const st = o.style || 'rect'\n const w = o.w || 0.32\n const h = o.h || 0.12\n const d = o.d || 0.09\n const s = o.side || (o.z >= 0 ? 1 : -1)\n const g = lampGroup(c, o.x, o.y, o.z, -s * (o.yaw || 0))\n const inner: any = []\n const lens: any = []\n const B = o.mat || MATERIALS.head\n const K = lampKit(g, d, inner, lens, o.lens || MATERIALS.lens, MATERIALS.reflectorLit)\n if (st === 'round' || st === 'dround') {\n const nR = st === 'dround' ? 2 : 1\n const r = Math.min(h / 2, w / (2 * nR)) * 0.95\n for (let i = 0; i < nR; i++) {\n const pz = nR === 1 ? 0 : ((i ? 1 : -1) * w) / 4\n const back = gm(g, new THREE.CylinderGeometry(r * 1.06, r * 1.06, d * 0.8, 22), MATERIALS.housing, 0, 0, pz)\n back.rotation.z = PI / 2\n const ring = gm(g, new THREE.TorusGeometry(r * 1.02, 0.013, 8, 30), MATERIALS.chrome, d / 2 - 0.006, 0, pz)\n ring.rotation.y = PI / 2\n const bowl = gm(g, new THREE.SphereGeometry(r * 0.96, 18, 10, 0, PI * 2, 0, PI / 2), MATERIALS.reflectorLit, d / 2 - 0.012, 0, pz)\n bowl.rotation.z = PI / 2\n bowl.scale.y = 0.55\n inner.push(bowl)\n K.glow(new THREE.SphereGeometry(r * 0.24, 12, 8), B, d / 2 - r * 0.3, 0, pz)\n const ln = gm(g, new THREE.SphereGeometry(r, 18, 10, 0, PI * 2, 0, PI / 2), o.lens || MATERIALS.lens, d / 2 - 0.008, 0, pz)\n ln.rotation.z = -PI / 2\n ln.scale.y = 0.3\n ln.renderOrder = 3\n lens.push(ln)\n }\n } else if (st === 'rect' || st === 'truck') {\n K.housing(w, h)\n const pr = Math.min(h * 0.3, w * 0.14)\n K.proj(0, -w * 0.2, pr, B)\n K.proj(0, st === 'truck' ? w * 0.08 : w * 0.18, pr, B)\n if (st === 'truck') K.glow(roundedBoxGeometry(0.02, h * 0.8, w * 0.2, 0.01), MATERIALS.amber, d / 2 - 0.02, 0, s * w * 0.38)\n else K.glow(roundedBoxGeometry(0.012, h * 0.2, w * 0.16, 0.006), MATERIALS.amber, d / 2 - 0.016, -h * 0.34, s * w * 0.4)\n K.lens(w, h)\n } else if (st === 'slim' || st === 'ledbar') {\n K.housing(w, h)\n K.glow(roundedBoxGeometry(0.012, Math.max(0.012, h * 0.18), w * 0.92, 0.005), MATERIALS.led, d / 2 - 0.014, h * 0.3, 0)\n K.proj(-h * 0.08, -s * w * 0.22, h * 0.26, B)\n K.proj(-h * 0.08, s * w * 0.06, h * 0.22, B)\n K.lens(w, h)\n } else if (st === 'split') {\n const hu = h * 0.26\n const hl = h * 0.62\n K.housing(w, hu, h / 2 - hu / 2)\n K.glow(roundedBoxGeometry(0.012, hu * 0.45, w * 0.92, 0.005), MATERIALS.led, d / 2 - 0.014, h / 2 - hu / 2, 0)\n K.lens(w, hu, h / 2 - hu / 2)\n K.housing(w * 0.8, hl, -h / 2 + hl / 2, -s * w * 0.08)\n K.proj(-h / 2 + hl / 2, -s * w * 0.25, hl * 0.3, B)\n K.proj(-h / 2 + hl / 2, s * w * 0.05, hl * 0.3, B)\n K.lens(w * 0.8, hl, -h / 2 + hl / 2, -s * w * 0.08)\n } else if (st === 'wedge') {\n const wf = function (geo: any) {\n wedgeY(geo, w, s, 0.45)\n }\n K.housing(w, h, 0, 0, wf)\n K.proj(h * 0.05, -s * w * 0.24, h * 0.25, B)\n K.proj(h * 0.05, s * w * 0.0, h * 0.2, B)\n K.glow(roundedBoxGeometry(0.012, 0.014, w * 0.72, 0.005), MATERIALS.led, d / 2 - 0.014, -h * 0.32, -s * w * 0.1)\n K.glow(roundedBoxGeometry(0.012, h * 0.42, 0.014, 0.005), MATERIALS.led, d / 2 - 0.014, -h * 0.14, s * w * 0.26)\n K.lens(w, h, 0, 0, wf)\n }\n const L: any = { group: g, inner: inner, lens: lens, kind: 'headlight', tint: 'clear', broken: false }\n if (o.halo !== false) L.halo = [halo(g, d / 2 + 0.03, 0, 0, Math.max(w, h) * 1.9 + 0.12, '#ffe7b8', 0.55)]\n c.lights.push(L)\n if (!o.noPart) {\n const pt = c.part('headlight', o.label || kit.t('parts.headlight', { s }), g, new V3(o.x, o.y, o.z), o.reach || 0.8)\n pt.light = L\n }\n return L\n }\n /* Taillight. o: { style: wrap|bar|vertical|L|round2, x, y, z, w, h, d, side, wrap (length of the wrap-around) } */\n kit.taillight = function (c: any, o: any) {\n const st = o.style || 'wrap'\n const w = o.w || 0.3\n const h = o.h || 0.14\n const d = o.d || 0.08\n const s = o.side || (o.z >= 0 ? 1 : -1)\n const ls = -s\n const g = lampGroup(c, o.x, o.y, o.z, PI)\n const inner: any = []\n const lens: any = []\n const K = lampKit(g, d, inner, lens, MATERIALS.lensRed)\n if (st === 'round2') {\n ;[-1, 1].forEach(function (q) {\n const r = Math.min(h / 2, w / 4) * 0.92\n const pz = (q * w) / 4\n const back = gm(g, new THREE.CylinderGeometry(r * 1.08, r * 1.08, d * 0.7, 20), MATERIALS.housing, 0, 0, pz)\n back.rotation.z = PI / 2\n const e = gm(g, new THREE.CylinderGeometry(r * 0.9, r * 0.9, 0.012, 20), q * ls > 0 ? MATERIALS.tail : MATERIALS.tail, d / 2 - 0.02, 0, pz)\n e.rotation.z = PI / 2\n inner.push(e)\n const ring = gm(g, new THREE.TorusGeometry(r, 0.01, 6, 24), MATERIALS.chrome, d / 2 - 0.004, 0, pz)\n ring.rotation.y = PI / 2\n const ln = gm(g, new THREE.SphereGeometry(r, 16, 8, 0, PI * 2, 0, PI / 2), MATERIALS.lensRed, d / 2 - 0.01, 0, pz)\n ln.rotation.z = -PI / 2\n ln.scale.y = 0.25\n ln.renderOrder = 3\n lens.push(ln)\n })\n } else if (st === 'vertical') {\n K.housing(w, h)\n K.glow(roundedBoxGeometry(0.012, h * 0.55, w * 0.8, 0.006), MATERIALS.tail, d / 2 - 0.016, h * 0.18, 0)\n K.glow(roundedBoxGeometry(0.012, h * 0.16, w * 0.8, 0.006), MATERIALS.amber, d / 2 - 0.016, -h * 0.22, 0)\n K.glow(roundedBoxGeometry(0.012, h * 0.12, w * 0.8, 0.006), MATERIALS.rev, d / 2 - 0.016, -h * 0.4, 0)\n K.lens(w, h)\n } else if (st === 'L') {\n const th = h * 0.42\n K.housing(w, th, h / 2 - th / 2)\n K.glow(roundedBoxGeometry(0.012, th * 0.6, w * 0.9, 0.006), MATERIALS.tail, d / 2 - 0.016, h / 2 - th / 2, 0)\n K.lens(w, th, h / 2 - th / 2)\n K.housing(w * 0.3, h - th, -th / 2, ls * w * 0.35)\n K.glow(roundedBoxGeometry(0.012, (h - th) * 0.7, w * 0.22, 0.006), MATERIALS.tail, d / 2 - 0.016, -th / 2, ls * w * 0.35)\n K.lens(w * 0.3, h - th, -th / 2, ls * w * 0.35)\n K.glow(roundedBoxGeometry(0.012, th * 0.4, w * 0.25, 0.006), MATERIALS.rev, d / 2 - 0.016, -h * 0.25, -ls * w * 0.1)\n } else {\n K.housing(w, h)\n K.glow(roundedBoxGeometry(0.012, h * 0.42, w * 0.88, 0.006), MATERIALS.tail, d / 2 - 0.016, h * 0.18, 0)\n K.glow(roundedBoxGeometry(0.012, h * 0.22, w * 0.3, 0.006), MATERIALS.rev, d / 2 - 0.016, -h * 0.22, -ls * w * 0.25)\n K.glow(roundedBoxGeometry(0.012, h * 0.22, w * 0.3, 0.006), MATERIALS.amber, d / 2 - 0.016, -h * 0.22, ls * w * 0.2)\n K.lens(w, h)\n if (st === 'wrap') {\n const wl = o.wrap || 0.2\n const side = gm(g, roundedBoxGeometry(wl, h * 0.9, 0.04, 0.015), MATERIALS.housing, d / 2 - wl / 2, 0, ls * (w / 2 - 0.01))\n const sg = gm(g, roundedBoxGeometry(wl * 0.85, h * 0.5, 0.012, 0.005), MATERIALS.tail, d / 2 - wl / 2, h * 0.12, ls * (w / 2 + 0.008))\n inner.push(sg)\n const sl = gm(g, roundedBoxGeometry(wl, h * 0.9 + 0.006, 0.014, 0.006), MATERIALS.lensRed, d / 2 - wl / 2, 0, ls * (w / 2 + 0.016))\n sl.renderOrder = 3\n lens.push(sl)\n side.castShadow = false\n }\n }\n const L: any = { group: g, inner: inner, lens: lens, kind: 'taillight', tint: 'red', broken: false }\n if (o.halo !== false) L.halo = [halo(g, d / 2 + 0.03, 0, 0, Math.max(w, h) * 1.5 + 0.08, '#ff2a1a', 0.4)]\n c.lights.push(L)\n if (!o.noPart) {\n const pt = c.part('taillight', o.label || kit.t('parts.taillight', { s }), g, new V3(o.x, o.y, o.z), o.reach || 0.8)\n pt.light = L\n }\n return L\n }\n /* light bar from end to end (ledbar at the front, bar at the rear). face: +1 front, -1 rear */\n kit.lightBar = function (c: any, x: any, y: any, z0: any, z1: any, h: any, face: any, mat: any) {\n const len = Math.abs(z1 - z0)\n const zc = (z0 + z1) / 2\n const f = face || 1\n const hs = c.roundBox(0.04, h + 0.012, len, 0.008, MATERIALS.housing, x, y, zc)\n hs.castShadow = false\n const gl = c.roundBox(0.014, h, len, 0.006, mat || (f > 0 ? MATERIALS.led : MATERIALS.tail), x + f * 0.016, y, zc)\n gl.castShadow = false\n const ln = c.roundBox(0.012, h + 0.014, len + 0.006, 0.006, f > 0 ? MATERIALS.lens : MATERIALS.lensRed, x + f * 0.026, y, zc)\n ln.castShadow = false\n ln.renderOrder = 3\n const L = { group: null, inner: [gl], lens: [ln], kind: f > 0 ? 'headlight' : 'taillight', tint: f > 0 ? 'clear' : 'red', broken: false }\n c.lights.push(L)\n const pt = c.part(f > 0 ? 'headlight' : 'taillight', { key: f > 0 ? 'led_bar' : 'taillight_bar' }, gl, new V3(x, y, zc), 0.6)\n pt.light = L\n return L\n }\n /* Generic emblem (chrome circle with a bar), never a real logo */\n kit.emblem = function (c: any, x: any, y: any, z: any, r: any, parent: any) {\n r = r || 0.045\n const g = new THREE.Group()\n g.position.set(x, y, z)\n g.userData.rigid = true\n ;(parent || c.vehicle).add(g)\n const d1 = gm(g, new THREE.CylinderGeometry(r, r, 0.012, 24), MATERIALS.chrome)\n d1.rotation.z = PI / 2\n const d2 = gm(g, new THREE.CylinderGeometry(r * 0.78, r * 0.78, 0.014, 24), MATERIALS.trim)\n d2.rotation.z = PI / 2\n gm(g, roundedBoxGeometry(0.016, r * 0.32, r * 1.4, 0.005), MATERIALS.chrome)\n gm(g, roundedBoxGeometry(0.016, r * 1.0, r * 0.22, 0.005), MATERIALS.chrome, 0, 0, r * 0.25).rotation.x = 0.5\n return g\n }\n /* Grille. o: { style: bars|mesh|big|seven|closed|truck, x, y, z, w, h, col, emblem } */\n kit.grille = function (c: any, o: any) {\n const st = o.style || 'bars'\n const w = o.w || 0.6\n const h = o.h || 0.16\n const g = lampGroup(c, o.x, o.y, o.z || 0, 0)\n let i\n const paint = c.paint(o.col || c.meta.color || '#6a6a6a')\n if (st === 'bars') {\n gm(g, roundedBoxGeometry(0.05, h, w, Math.min(0.03, h * 0.3)), MATERIALS.trim)\n const nb = Math.max(2, Math.round(h / 0.05))\n for (i = 0; i < nb; i++) gm(g, roundedBoxGeometry(0.02, 0.016, w * 0.92, 0.006), MATERIALS.chrome, 0.03, -h / 2 + ((i + 0.5) * h) / nb, 0)\n } else if (st === 'mesh') {\n gm(g, roundedBoxGeometry(0.05, h, w, Math.min(0.03, h * 0.3)), MATERIALS.housing)\n const cell = 0.026\n const list = []\n const rows = Math.floor((h * 0.85) / (cell * 1.6))\n const cols = Math.floor((w * 0.9) / (cell * 1.8))\n for (let rI = 0; rI < rows; rI++)\n for (let cI = 0; cI < cols; cI++) {\n const hg = new THREE.CylinderGeometry(cell, cell, 0.02, 6)\n hg.rotateZ(PI / 2)\n hg.rotateX(PI / 6)\n hg.translate(0.026, -h * 0.42 + ((rI + 0.5) * h * 0.85) / rows, -w * 0.45 + ((cI + 0.5 + (rI % 2) * 0.5 - 0.25) * w * 0.9) / cols)\n list.push(hg)\n }\n if (list.length) gm(g, mergeGeometries(list), MATERIALS.trim)\n gm(g, roundedBoxGeometry(0.022, 0.014, w, 0.006), MATERIALS.chrome, 0.03, h / 2 - 0.008, 0)\n } else if (st === 'big') {\n const fr = roundedBoxGeometry(0.06, h, w, 0.03)\n taper(fr, { sz: 1.12 })\n gm(g, fr, MATERIALS.chrome)\n gm(g, roundedBoxGeometry(0.064, h * 0.82, w * 0.9, 0.02), MATERIALS.housing, 0.002, 0, 0)\n const nb2 = Math.max(3, Math.round(h / 0.06))\n for (i = 0; i < nb2; i++)\n gm(g, roundedBoxGeometry(0.02, 0.02, w * (0.84 + (0.1 * i) / nb2), 0.006), MATERIALS.chrome, 0.036, -h * 0.38 + (i * h * 0.76) / (nb2 - 1), 0)\n } else if (st === 'seven') {\n gm(g, roundedBoxGeometry(0.04, h, w, Math.min(0.03, h * 0.3)), paint)\n for (i = 0; i < 7; i++) gm(g, roundedBoxGeometry(0.03, h * 0.72, w * 0.07, 0.01), MATERIALS.housing, 0.008, 0, -w * 0.42 + i * w * 0.14)\n } else if (st === 'closed') {\n gm(g, roundedBoxGeometry(0.03, h, w, Math.min(0.03, h * 0.4)), paint)\n gm(g, roundedBoxGeometry(0.012, 0.012, w * 0.9, 0.005), MATERIALS.chrome, 0.018, -h * 0.25, 0)\n } else if (st === 'truck') {\n gm(g, roundedBoxGeometry(0.06, h + 0.04, w + 0.04, 0.03), MATERIALS.chrome)\n gm(g, roundedBoxGeometry(0.064, h, w, 0.02), MATERIALS.housing, 0.004, 0, 0)\n const nb3 = Math.max(4, Math.round(h / 0.1))\n for (i = 0; i < nb3; i++) gm(g, roundedBoxGeometry(0.024, 0.03, w * 0.94, 0.008), MATERIALS.chrome, 0.04, -h / 2 + ((i + 0.5) * h) / nb3, 0)\n }\n g.children.forEach(function (m: any) {\n m.castShadow = true\n })\n if (o.emblem !== false) kit.emblem(c, 0.05, st === 'closed' ? h * 0.12 : 0, 0, Math.min(0.05, h * 0.3), g)\n return g\n }\n\n Object.assign(I, { lampGroup, gm, wedgeY, haloTex, glowTexture, haloMats, halo, lampKit })\n}\n","/** Cabin interior: seats, steering wheel, dashboard and bus rows. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installInterior(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, MATERIALS } = I\n\n /* ================= interior ================= */\n /* Seat. x = seat centre, fl = floor height, z = lateral centre. o: { w, h (seat height), len, back, lean, n (places on a bench seat), dir (+1 faces forward), mat, headrest } */\n kit.seat = function (c: any, x: any, fl: any, z: any, o: any) {\n o = o || {}\n if (o.face === '+z' || o.face === '-z') {\n /* seat facing sideways (troop, ambulance): built facing +x in a group and rotated */\n const gp = new THREE.Group()\n gp.position.set(x, 0, z)\n gp.rotation.y = o.face === '+z' ? -PI / 2 : PI / 2\n gp.userData.rigid = true\n c.vehicle.add(gp)\n const n0 = c.seatTops.length\n kit.seat(c, 0, fl, 0, Object.assign({}, o, { face: null, parent: gp, dir: 1 }))\n const st = c.seatTops[n0]\n if (st) {\n st.x = x\n st.z = z\n const t = st.w\n st.w = st.l\n st.l = t\n }\n return gp\n }\n const PR = o.parent\n const w = o.w || 0.5\n const h = o.h || 0.28\n const mat = o.mat || MATERIALS.seat\n const dir = o.dir || 1\n const n = o.n || 1\n const back = o.back || 0.6\n const lean = o.lean == null ? 0.22 : o.lean\n const cl = o.len || 0.48\n c.roundBox(cl * 0.7, Math.max(0.04, h - 0.1), w * 0.85, 0.03, MATERIALS.plastic, x, fl + Math.max(0.04, h - 0.1) / 2, z, { parent: PR })\n c.roundBox(cl, 0.12, w, 0.05, mat, x, fl + h - 0.05, z, { rot: [0, 0, dir * 0.06], parent: PR })\n const bx = x - dir * (cl / 2 - 0.03)\n const pw = w / n\n const sl = Math.sin(lean)\n const cs = Math.cos(lean)\n for (let j = 0; j < n; j++) {\n const zz = z + (j - (n - 1) / 2) * pw\n c.roundBox(0.12, back, pw - (n > 1 ? 0.02 : 0), 0.05, mat, bx - (dir * sl * back) / 2, fl + h + (cs * back) / 2 - 0.03, zz, {\n rot: [0, 0, dir * lean],\n parent: PR,\n })\n if (o.headrest !== false) {\n const hx = bx - dir * sl * (back + 0.1)\n const hy = fl + h + cs * (back + 0.1) - 0.03\n const hw = Math.min(0.26, pw * 0.62)\n c.roundBox(0.09, 0.15, hw, 0.04, mat, hx, hy, zz, { rot: [0, 0, dir * lean], parent: PR })\n ;[-1, 1].forEach(function (q) {\n c.rod(\n new V3(hx, hy - 0.06, zz + q * hw * 0.25),\n new V3(bx - dir * sl * back, fl + h + cs * back - 0.06, zz + q * hw * 0.25),\n 0.006,\n MATERIALS.chrome,\n { seg: 5, parent: PR },\n )\n })\n }\n }\n c.seatTops.push({ x: x, y: fl + h + 0.01, z: z, w: w, l: cl })\n }\n /* 3-spoke steering wheel with column. o: { r, tilt (rad), col (column length), mat } */\n kit.steeringWheel = function (c: any, x: any, y: any, z: any, o: any) {\n o = o || {}\n const r = o.r || 0.18\n const mat = o.mat || MATERIALS.plastic\n const g = new THREE.Group()\n g.position.set(x, y, z)\n g.rotation.z = -(o.tilt == null ? 0.42 : o.tilt)\n g.userData.rigid = true\n c.vehicle.add(g)\n const rim = c.add(new THREE.TorusGeometry(r, 0.018, 8, 30), mat, 0, 0, 0, g)\n rim.rotation.y = PI / 2\n c.cylinder(r * 0.3, r * 0.3, 0.06, mat, 0.015, 0, 0, 'x', { parent: g })\n c.cylinder(r * 0.12, r * 0.12, 0.01, MATERIALS.chrome, -0.018, 0, 0, 'x', { parent: g })\n ;[\n [0, 0, r],\n [0, 0, -r],\n [0, -r, 0],\n ].forEach(function (p) {\n c.rod(new V3(0.005, 0, 0), new V3(p[0], p[1] * 0.95, p[2] * 0.95), 0.016, mat, { parent: g, seg: 6 })\n })\n c.rod(new V3(0.03, 0, 0), new V3(o.col || 0.34, 0, 0), 0.032, mat, { parent: g, seg: 10 })\n return g\n }\n /* Aircraft control yoke. */\n kit.yoke = function (c: any, x: any, y: any, z: any, o: any) {\n o = o || {}\n const mat = o.mat || MATERIALS.plastic\n c.rod(new V3(x + 0.25, y, z), new V3(x, y, z), 0.018, MATERIALS.chrome)\n c.roundBox(0.04, 0.05, 0.3, 0.02, mat, x, y, z)\n ;[-1, 1].forEach(function (s) {\n c.roundBox(0.04, 0.14, 0.04, 0.018, mat, x - 0.01, y + 0.05, z + s * 0.14)\n })\n }\n /* Dashboard: body, faintly glowing instrument cluster, central infotainment, air vents, glove box.\n o: { x (front edge, next to the windshield), y (top), w, d, h, drv (driver z or null), mat, screen, gauges } */\n kit.dashboard = function (c: any, o: any) {\n const d = o.d || 0.5\n const h = o.h || 0.36\n const x = o.x\n const y = o.y\n const w = o.w\n const mat = o.mat || MATERIALS.plastic\n const xb = x - d\n c.roundBox(d, h, w, 0.06, mat, x - d / 2, y - h / 2, 0)\n c.roundBox(d * 0.85, 0.025, w - 0.04, 0.01, o.top || mat, x - d / 2 - 0.02, y + 0.005, 0)\n if (o.drv != null) {\n c.roundBox(0.14, 0.09, 0.4, 0.04, mat, xb + 0.06, y + 0.03, o.drv)\n ;[-0.09, 0.09].forEach(function (dz) {\n c.cylinder(0.055, 0.055, 0.012, MATERIALS.gauge, xb + 0.002, y - 0.005, o.drv + dz, 'x', { seg: 18 })\n c.cylinder(0.06, 0.06, 0.008, MATERIALS.chrome, xb + 0.006, y - 0.005, o.drv + dz, 'x', { seg: 18, open: true })\n c.roundBox(0.004, 0.045, 0.006, 0.002, MATERIALS.amber, xb - 0.006, y + 0.008, o.drv + dz, { rot: [0.9, 0, 0] })\n })\n }\n if (o.screen !== false) {\n const sc = c.roundBox(0.016, 0.13, Math.min(0.24, w * 0.18), 0.012, MATERIALS.screen, xb + 0.12, y + 0.07, 0, { rot: [0, 0, -0.2] })\n sc.castShadow = false\n }\n const vz = [-w * 0.4, -0.08, 0.08, w * 0.4]\n vz.forEach(function (z) {\n c.roundBox(0.016, 0.05, 0.11, 0.01, MATERIALS.chrome, xb - 0.002, y - 0.09, z)\n c.roundBox(0.016, 0.038, 0.095, 0.008, MATERIALS.dark, xb - 0.006, y - 0.09, z)\n })\n if (o.drv != null) c.roundBox(0.006, 0.12, w * 0.3, 0.004, MATERIALS.dark, xb - 0.003, y - 0.2, -Math.sign(o.drv || -1) * w * 0.25)\n }\n function consoleBox(c: any, x: any, fl: any, h: any, mat: any) {\n c.roundBox(0.62, h, 0.2, 0.04, mat, x, fl + h / 2, 0)\n c.rod(new V3(x + 0.18, fl + h, 0), new V3(x + 0.13, fl + h + 0.13, 0), 0.011, MATERIALS.chrome, { seg: 6 })\n c.sphere(0.03, MATERIALS.plastic, x + 0.13, fl + h + 0.14, 0)\n c.roundBox(0.1, 0.03, 0.1, 0.02, MATERIALS.dark, x + 0.18, fl + h + 0.01, 0)\n c.rod(new V3(x - 0.06, fl + h, 0.0), new V3(x - 0.26, fl + h + 0.08, 0), 0.016, MATERIALS.plastic, { seg: 8 })\n }\n /* Complete car interior. Measures in c.vehicle:\n o: { x0 (windshield base), ft (windshield top), rb/rt (rear glass base/top), roof, belt, floor, zIn (inner half width),\n zRoof, rows (1..3), col (fabric), trim (plastic), drive (-1 = driver on the left), front ('bench' for a 3-seat bench), xFront, xRear, noConsole } */\n kit.interior = function (c: any, o: any) {\n const fab = makeMaterial(o.col || '#2c2d30', { roughness: 0.88 })\n const trim = makeMaterial(o.trim || '#1b1c1f', { roughness: 0.7 })\n const x0 = o.x0\n const fl = o.floor\n const belt = o.belt\n const zi = o.zIn\n const rows = o.rows || 2\n const drv = o.drive || -1\n const zs = o.zSeat || Math.min(zi * 0.5, 0.42)\n const xf = o.xFront != null ? o.xFront : x0 - 1.0\n const seatH = o.seatH || Math.min(0.3, (belt - fl) * 0.5)\n const xr = o.xRear != null ? o.xRear : o.rb != null ? o.rb + 0.08 : xf - rows * 0.9\n c.roundBox(Math.max(0.2, x0 - 0.1 - xr), 0.04, zi * 2, 0.015, MATERIALS.carpet, (x0 - 0.1 + xr) / 2, fl, 0)\n c.meta.cabin = { x0: xr - 0.1, x1: x0 + 0.1, y0: fl - 0.05, y1: (o.roof != null ? o.roof : belt + 0.5) + 0.05, z: zi + 0.045 }\n kit.dashboard(c, {\n x: x0 - 0.07,\n y: belt + 0.04,\n w: zi * 2,\n d: 0.5,\n h: Math.min(0.42, belt + 0.04 - fl - 0.1),\n drv: drv * zs,\n mat: trim,\n top: fab,\n })\n kit.steeringWheel(c, x0 - 0.68, belt - 0.02, drv * zs, { mat: trim })\n const roof = o.roof != null ? o.roof : belt + 0.5\n function lim(y: any) {\n if (o.rb == null) return -1e9\n const t = clamp((y - belt) / (roof - belt), 0, 1)\n return o.rb + t * ((o.rt != null ? o.rt : o.rb) - o.rb) + 0.1\n }\n let x = xf\n for (let r = 0; r < rows; r++) {\n let back = r === 0 ? 0.6 : 0.56\n const lean = r === 0 ? 0.22 : 0.15\n let it\n if (r > 0)\n for (it = 0; it < 30; it++) {\n const ty = fl + seatH + back + 0.1\n const tx = x - 0.21 - Math.sin(lean) * (back + 0.1) - 0.05\n if (tx >= lim(ty)) break\n if (back > 0.44) back -= 0.02\n else x += 0.02\n }\n if (r === 0) {\n if (o.front === 'bench') {\n const wb = zi * 2 - 0.62\n kit.seat(c, x, fl, drv * zs, { w: 0.5, mat: fab, back: back, lean: lean, h: seatH })\n kit.seat(c, x, fl, -drv * (zi - wb / 2 - 0.03), { w: wb, n: 2, mat: fab, back: back, lean: lean, h: seatH })\n } else {\n ;[-1, 1].forEach(function (s) {\n kit.seat(c, x, fl, s * zs, { w: Math.min(0.52, zi - zs + 0.22), mat: fab, back: back, lean: lean, h: seatH })\n })\n if (!o.noConsole) consoleBox(c, x + 0.16, fl, Math.min(0.26, seatH), trim)\n }\n } else kit.seat(c, x, fl, 0, { w: zi * 2 - 0.1, n: r === 2 ? 2 : 3, mat: fab, back: back, lean: lean, h: seatH * 0.95 })\n ;[-1, 1].forEach(function (s) {\n c.roundBox(0.8, belt - fl - 0.08, 0.035, 0.015, trim, x + 0.12, (belt + fl) / 2 + 0.02, s * (zi + 0.02))\n c.roundBox(0.3, 0.05, 0.07, 0.02, fab, x + 0.16, fl + seatH + 0.16, s * (zi - 0.015))\n c.roundBox(0.08, 0.025, 0.02, 0.008, MATERIALS.chrome, x + 0.36, belt - 0.11, s * (zi - 0.005))\n })\n x -= r === 0 ? 0.88 : 0.8\n }\n if (o.ft != null) {\n const hx1 = o.ft - 0.04\n const hx0 = (o.rt != null ? o.rt : xr) + 0.04\n const zr = o.zRoof || zi * 0.9\n if (hx1 > hx0) c.roundBox(hx1 - hx0, 0.02, zr * 2, 0.01, MATERIALS.headliner, (hx0 + hx1) / 2, roof - 0.012, 0).castShadow = false\n c.rod(new V3(o.ft - 0.1, roof - 0.02, 0), new V3(o.ft - 0.12, roof - 0.08, 0), 0.008, MATERIALS.plastic, { seg: 5 })\n c.roundBox(0.03, 0.06, 0.22, 0.02, MATERIALS.plastic, o.ft - 0.12, roof - 0.11, 0)\n ;[-1, 1].forEach(function (s) {\n c.roundBox(0.02, 0.15, 0.34, 0.01, MATERIALS.headliner, o.ft - 0.14, roof - 0.07, s * zs, { rot: [0, 0, 0.35] })\n })\n }\n }\n /* Bus rows with a central aisle and grab poles.\n o: { x0 (front row), x1 (last), pitch, floor, zIn, aisle, col, seatH, ceil, poles, rails, mat (pole) } */\n kit.busRows = function (c: any, o: any) {\n const fab = makeMaterial(o.col || '#3b4a5a', { roughness: 0.85 })\n const pitch = o.pitch || 0.78\n const aisle = o.aisle || 0.48\n const zi = o.zIn\n const pw = zi - aisle / 2\n let n = 0\n const pm = o.mat || MATERIALS.chrome\n const ceil = o.ceil || o.floor + 2.0\n for (let x = o.x0; x >= o.x1 - 1e-6; x -= pitch) {\n ;[-1, 1].forEach(function (s) {\n kit.seat(c, x, o.floor, s * (aisle / 2 + pw / 2), {\n w: pw,\n n: 2,\n mat: fab,\n back: 0.52,\n lean: 0.12,\n h: o.seatH || 0.42,\n len: 0.42,\n headrest: false,\n })\n })\n if (o.poles !== false && n % 2 === 0)\n [-1, 1].forEach(function (s) {\n c.rod(new V3(x - 0.3, o.floor, (s * aisle) / 2), new V3(x - 0.3, ceil, (s * aisle) / 2), 0.016, pm, { seg: 8 })\n })\n n++\n }\n if (o.rails !== false)\n [-1, 1].forEach(function (s) {\n c.rod(new V3(o.x0 + 0.2, ceil - 0.12, s * (aisle / 2 + 0.05)), new V3(o.x1 - 0.4, ceil - 0.12, s * (aisle / 2 + 0.05)), 0.014, pm, {\n seg: 8,\n })\n })\n c.roundBox(o.x0 - o.x1 + 1.0, 0.03, zi * 2, 0.01, MATERIALS.carpet, (o.x0 + o.x1) / 2, o.floor, 0)\n return n\n }\n\n Object.assign(I, { consoleBox })\n}\n","/** Hoods, engine bays and hinge helpers. */\nimport type { Kit } from './types'\n\nexport function installHood(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, MATERIALS, crease, cutGeometry } = I\n\n /* ================= hood and engine bay ================= */\n /* Hood made from the skin cut out of the hull (shell holes with a tag). o: { x0 (hinge), col, open (rad), hole (extra hole, e.g. blower) } */\n kit.makeHood = function (c: any, geo: any, o: any) {\n o = o || {}\n if (!geo || !geo.attributes.position.count) return null\n if (o.hole) geo = cutGeometry(geo, [o.hole]).geo\n geo.computeBoundingBox()\n const bb = geo.boundingBox.clone()\n const p = geo.attributes.position\n const hx = o.x0 != null ? o.x0 : bb.min.x\n let hy = -1e9\n for (let i = 0; i < p.count; i++) if (p.getX(i) < bb.min.x + 0.08) hy = Math.max(hy, p.getY(i))\n const cx = (bb.min.x + bb.max.x) / 2\n const sx = 1 - 0.022 / Math.max(0.3, bb.max.x - bb.min.x)\n const sz = 1 - 0.022 / Math.max(0.3, bb.max.z - bb.min.z)\n for (let i = 0; i < p.count; i++) {\n p.setX(i, cx + (p.getX(i) - cx) * sx)\n p.setZ(i, p.getZ(i) * sz)\n p.setY(i, p.getY(i) + 0.008)\n }\n geo.translate(-hx, -hy, 0)\n const under = geo.clone()\n under.translate(0, -0.022, 0)\n crease(under, 42)\n crease(geo, 42)\n const piv = new THREE.Group()\n piv.position.set(hx, hy, 0)\n c.vehicle.add(piv)\n const top = new THREE.Mesh(geo, c.paint(o.col || c.meta.color || '#6a6a6a'))\n top.castShadow = true\n top.receiveShadow = true\n piv.add(top)\n const bot = new THREE.Mesh(under, MATERIALS.hoodLiner)\n piv.add(bot)\n c.deform.push(top, bot)\n c.hood = {\n piv: piv,\n ang: 0,\n target: 0,\n open: o.open || 1.05,\n latch: 0,\n x0: hx,\n x1: bb.max.x,\n y: hy,\n yMin: bb.min.y,\n zw: bb.max.z,\n label: o.label,\n noLatch: !!o.noLatch,\n }\n c.part('hood', { key: 'hood' }, piv, new V3((hx + bb.max.x) / 2, hy, 0), 0.9)\n return c.hood\n }\n /* Turns any set of meshes into a hinged hood (tractor, truck). pivot in c.vehicle; axis \"z\" (front rises). */\n kit.hinge = function (c: any, objs: any, pivot: any, o: any) {\n o = o || {}\n const piv = new THREE.Group()\n piv.position.copy(pivot)\n c.vehicle.add(piv)\n objs.forEach(function (m: any) {\n if (m.parent) m.parent.remove(m)\n m.position.sub(pivot)\n piv.add(m)\n })\n c.hood = {\n piv: piv,\n ang: 0,\n target: 0,\n open: o.open || 1.0,\n latch: 0,\n x0: pivot.x,\n x1: pivot.x + (o.len || 1),\n y: pivot.y,\n yMin: pivot.y,\n zw: o.zw || 0.5,\n sign: o.sign || 1,\n label: o.bayLabel,\n noLatch: !!o.noLatch,\n }\n c.part('hood', o.label || { key: 'hood' }, piv, pivot.clone().add(new V3((o.len || 1) / 2, 0, 0)), 0.9)\n return c.hood\n }\n /* Engine bay. o: { x0 (firewall), x1 (front), zw (half width), floor, top (free height under the hood), motor: gasoline|diesel|electric|v8 (with blower)|v8_na (naturally aspirated V8), axle (axle x, strut towers), col, frunk } */\n kit.engineBay = function (c: any, o: any) {\n const x0 = o.x0\n const x1 = o.x1\n const zw = o.zw\n const fl = o.floor\n const top = Math.max(o.top, fl + 0.22)\n const mot = o.motor || 'gasoline'\n const L = x1 - x0\n const H = top - fl\n const cx = (x0 + x1) / 2\n const paint = c.paint(o.col || c.meta.color || '#666')\n const out: any = {}\n c.roundBox(L, 0.03, 2 * zw, 0.01, MATERIALS.bay, cx, fl, 0)\n c.roundBox(0.03, H + 0.04, 2 * zw, 0.01, MATERIALS.bay, x0 + 0.015, fl + H / 2, 0)\n ;[1, -1].forEach(function (s) {\n c.roundBox(L, H * 0.75, 0.03, 0.01, MATERIALS.bay, cx, fl + H * 0.37, s * zw)\n })\n const rx = x1 - 0.06\n const rh = H * 0.82\n const rad = c.roundBox(0.05, rh, zw * 1.5, 0.012, MATERIALS.radiator, rx, fl + rh / 2 + 0.02, 0)\n for (let f = 0; f < 6; f++) c.roundBox(0.054, 0.006, zw * 1.46, 0.002, MATERIALS.steel, rx, fl + 0.06 + (f * (rh - 0.06)) / 6, 0)\n c.roundBox(0.07, 0.04, zw * 1.5, 0.015, MATERIALS.plastic, rx, fl + rh + 0.03, 0)\n out.rad = new V3(rx, fl + rh / 2, 0)\n const fanR = Math.min(rh * 0.42, zw * 0.45)\n const fg = new THREE.Group()\n fg.position.set(rx - 0.06, fl + rh / 2 + 0.02, 0)\n c.vehicle.add(fg)\n c.add(new THREE.TorusGeometry(fanR, 0.012, 6, 24), MATERIALS.plastic, 0, 0, 0, fg).rotation.y = PI / 2\n for (let b = 0; b < 7; b++) {\n const bl = c.roundBox(\n 0.012,\n fanR * 0.85,\n 0.06,\n 0.006,\n MATERIALS.plastic,\n 0,\n Math.cos((b / 7) * PI * 2) * fanR * 0.45,\n Math.sin((b / 7) * PI * 2) * fanR * 0.45,\n { parent: fg },\n )\n bl.rotation.x = (-b / 7) * PI * 2\n bl.rotation.y = 0.35\n }\n c.cylinder(fanR * 0.2, fanR * 0.2, 0.05, MATERIALS.steel, 0, 0, 0, 'x', { parent: fg })\n if (o.axle != null && o.axle > x0 && o.axle < x1)\n [1, -1].forEach(function (s) {\n c.cylinder(0.09, 0.12, H * 0.7, paint, o.axle, fl + H * 0.35, s * (zw - 0.12), null, { seg: 16 })\n for (let k = 0; k < 3; k++) {\n const a = (k / 3) * PI * 2\n c.cylinder(0.012, 0.012, 0.02, MATERIALS.steel, o.axle + Math.cos(a) * 0.055, fl + H * 0.7 + 0.01, s * (zw - 0.12) + Math.sin(a) * 0.055)\n }\n })\n function reservoir(x: any, y: any, z: any, w: any, h: any, d: any, shell: any, liq: any, cap: any) {\n c.roundBox(w, h, d, 0.02, shell, x, y, z).castShadow = false\n if (liq) c.roundBox(w * 0.85, h * 0.55, d * 0.85, 0.015, liq, x, y - h * 0.18, z)\n c.cylinder(0.026, 0.026, 0.025, cap, x, y + h / 2 + 0.012, z)\n }\n function battery(x: any, y: any, z: any, sc?: any) {\n sc = sc || 1\n c.roundBox(0.2 * sc, 0.15 * sc, 0.15 * sc, 0.015, makeMaterial('#1a1b1c', { roughness: 0.5 }), x, y, z)\n c.roundBox(0.2 * sc, 0.012, 0.15 * sc, 0.005, makeMaterial('#2e3a6a', { roughness: 0.5 }), x, y + 0.04 * sc, z)\n c.cylinder(0.016, 0.018, 0.03, MATERIALS.postRed, x + 0.06 * sc, y + 0.09 * sc, z + 0.045 * sc)\n c.cylinder(0.016, 0.018, 0.03, MATERIALS.postBlack, x + 0.06 * sc, y + 0.09 * sc, z - 0.045 * sc)\n c.tube(\n [\n [x + 0.06 * sc, y + 0.1 * sc, z + 0.045 * sc],\n [x + 0.1, y + 0.13, z + 0.1],\n [x + 0.2, y + 0.05, z + 0.12],\n ],\n 0.01,\n MATERIALS.postRed,\n { seg: 12, rs: 5 },\n )\n return new V3(x, y, z)\n }\n const uy = Math.min(top - 0.03, fl + H * 0.75)\n reservoir(x0 + 0.12, uy - 0.04, -zw * 0.55, 0.07, 0.06, 0.07, MATERIALS.coolant, makeMaterial('#c9b26a', { roughness: 0.3 }), MATERIALS.yellow)\n reservoir(x1 - 0.2, fl + H * 0.45, zw * 0.72, 0.12, 0.13, 0.1, MATERIALS.washer, makeMaterial('#3f8fc0', { roughness: 0.3 }), MATERIALS.capBlue)\n c.roundBox(0.12, 0.07, 0.13, 0.015, MATERIALS.plastic, x0 + 0.18, uy - 0.02, -zw * 0.78)\n c.roundBox(0.12, 0.006, 0.13, 0.003, MATERIALS.dark, x0 + 0.18, uy + 0.017, -zw * 0.78)\n if (mot === 'electric') {\n const fx0 = x0 + L * 0.4\n const fx1 = x1 - 0.14\n const fw = zw * 1.5\n const fh = H * 0.65\n const fy = fl + 0.02\n c.roundBox(fx1 - fx0, 0.02, fw, 0.01, MATERIALS.carpet, (fx0 + fx1) / 2, fy + 0.02, 0)\n ;[\n [fx0, 0],\n [fx1, 0],\n ].forEach(function (p) {\n c.roundBox(0.025, fh, fw, 0.01, MATERIALS.plastic, p[0], fy + fh / 2, 0)\n })\n ;[1, -1].forEach(function (s) {\n c.roundBox(fx1 - fx0, fh, 0.025, 0.01, MATERIALS.plastic, (fx0 + fx1) / 2, fy + fh / 2, (s * fw) / 2)\n })\n const ix = x0 + L * 0.2\n const iy = fl + H * 0.35\n c.roundBox(L * 0.24, H * 0.42, zw * 0.9, 0.03, makeMaterial('#9aa1a6', { metalness: 0.7, roughness: 0.35 }), ix, iy, zw * 0.1)\n for (let fin = 0; fin < 5; fin++)\n c.roundBox(\n L * 0.22,\n 0.03,\n 0.012,\n 0.004,\n makeMaterial('#b8bec2', { metalness: 0.7, roughness: 0.3 }),\n ix,\n iy + H * 0.21 + 0.012,\n zw * 0.1 - zw * 0.36 + fin * zw * 0.18,\n )\n c.text(kit.t('texts.high_voltage'), L * 0.2, 0.05, ix, iy + H * 0.215 + 0.008, zw * 0.1, '+y', {\n fg: '#121212',\n bg: '#f0a01e',\n w: 512,\n h: 128,\n size: 0.55,\n })\n ;[-0.12, 0.12].forEach(function (dz) {\n c.tube(\n [\n [ix - L * 0.1, iy - H * 0.1, zw * 0.1 + dz],\n [ix - L * 0.14, fl + 0.06, zw * 0.1 + dz * 1.5],\n [x0 + 0.04, fl + 0.03, dz * 2],\n ],\n 0.022,\n MATERIALS.hv,\n { seg: 16, rs: 6 },\n )\n })\n c.tube(\n [\n [ix + L * 0.12, iy, zw * 0.5],\n [fx0 - 0.03, iy + 0.02, zw * 0.7],\n [rx - 0.1, fl + rh * 0.8, zw * 0.6],\n ],\n 0.016,\n MATERIALS.hose,\n { seg: 16, rs: 6 },\n )\n battery(x0 + 0.14, fl + H * 0.25, -zw * 0.55, 0.65)\n reservoir(x0 + 0.13, fl + H * 0.62, zw * 0.72, 0.1, 0.1, 0.08, MATERIALS.coolant, MATERIALS.coolantLiq, MATERIALS.postBlack)\n out.motor = new V3(ix, iy, 0)\n out.inverter = new V3(ix, iy, 0)\n out.frunk = new V3((fx0 + fx1) / 2, fy, 0)\n } else if (mot === 'v8' || mot === 'v8_na') {\n const bx = cx - L * 0.05\n const by = fl + H * 0.3\n const bl = L * 0.55\n c.roundBox(bl, H * 0.45, zw * 0.7, 0.04, makeMaterial('#2f5a8a', { metalness: 0.5, roughness: 0.4 }), bx, by, 0)\n ;[1, -1].forEach(function (s) {\n c.roundBox(bl * 0.9, 0.07, zw * 0.32, 0.03, MATERIALS.chrome, bx, by + H * 0.25, s * zw * 0.3, { rot: [s * 0.5, 0, 0] })\n for (let h2 = 0; h2 < 4; h2++)\n c.tube(\n [\n [bx - bl * 0.35 + h2 * bl * 0.23, by, s * zw * 0.38],\n [bx - bl * 0.35 + h2 * bl * 0.23, by - 0.08, s * zw * 0.7],\n [bx - bl * 0.3, fl + 0.05, s * zw * 0.85],\n ],\n 0.02,\n MATERIALS.chrome,\n { seg: 12, rs: 6 },\n )\n })\n let bly = top - 0.02\n if (mot === 'v8') {\n c.roundBox(bl * 0.75, 0.22, zw * 0.42, 0.04, MATERIALS.chrome, bx, bly, 0)\n for (let rb2 = 0; rb2 < 6; rb2++) c.roundBox(bl * 0.75, 0.012, 0.012, 0.004, MATERIALS.steel, bx, bly + 0.03, -zw * 0.18 + rb2 * zw * 0.072)\n c.roundBox(0.2, 0.16, 0.24, 0.03, MATERIALS.chrome, bx + 0.02, bly + 0.19, 0)\n ;[-0.06, 0.06].forEach(function (dz) {\n c.roundBox(0.07, 0.1, 0.09, 0.02, MATERIALS.dark, bx + 0.09, bly + 0.2, dz)\n })\n } else {\n /* modern naturally aspirated V8: low intake manifold with plastic cover, throttle body and duct to the air filter box */\n bly = Math.min(top - 0.06, by + H * 0.42)\n c.roundBox(bl * 0.62, 0.09, zw * 0.4, 0.035, MATERIALS.cover, bx, bly, 0)\n c.roundBox(bl * 0.5, 0.012, zw * 0.3, 0.005, MATERIALS.plastic, bx, bly + 0.05, 0)\n c.cylinder(0.055, 0.055, 0.06, MATERIALS.steel, bx + bl * 0.36, bly, 0, 'x')\n c.tube(\n [\n [bx + bl * 0.39, bly, 0],\n [bx + bl * 0.5, bly + 0.02, zw * 0.25],\n [x0 + L * 0.82, fl + H * 0.55, zw * 0.55],\n ],\n 0.045,\n MATERIALS.hose,\n { seg: 14, rs: 8 },\n )\n c.roundBox(0.26, 0.14, 0.22, 0.03, MATERIALS.plastic, x0 + L * 0.82, fl + H * 0.5, zw * 0.62)\n }\n c.cylinder(0.07, 0.07, 0.04, MATERIALS.steel, bx + bl * 0.4, by + H * 0.2, 0, 'x')\n c.tube(\n [\n [bx + bl * 0.42, by + H * 0.2 + 0.07, 0],\n [bx + bl * 0.42, bly + 0.06, 0],\n ],\n 0.012,\n MATERIALS.hose,\n { seg: 4, rs: 5 },\n )\n battery(x0 + 0.16, fl + 0.1, zw * 0.62)\n out.motor = new V3(bx, by, 0)\n if (mot === 'v8') out.blower = new V3(bx, bly, 0)\n } else {\n const ex = x0 + L * 0.48\n const bh = H * 0.5\n const bz = zw * 0.95\n const ey = fl + 0.04 + bh / 2\n const eb = Math.min(0.42, L * 0.36)\n c.roundBox(eb, bh, bz, 0.03, MATERIALS.block, ex, ey, -zw * 0.1)\n const cover = mot === 'diesel' ? makeMaterial('#2b2d30', { metalness: 0.3, roughness: 0.4 }) : MATERIALS.cover\n c.roundBox(eb * 0.82, 0.07, bz * 0.92, 0.03, cover, ex, ey + bh / 2 + 0.03, -zw * 0.1)\n for (let rib = 0; rib < 4; rib++)\n c.roundBox(eb * 0.7, 0.012, 0.014, 0.004, MATERIALS.steel, ex, ey + bh / 2 + 0.07, -zw * 0.1 - bz * 0.36 + rib * bz * 0.24)\n c.cylinder(0.03, 0.03, 0.028, MATERIALS.yellow, ex - eb * 0.2, ey + bh / 2 + 0.08, -zw * 0.1 + bz * 0.28)\n const plx = ex + eb / 2 + 0.07\n const ply = ey + bh * 0.1\n c.roundBox(0.07, bh * 0.4, bz * 0.7, 0.02, MATERIALS.block, plx, ply, -zw * 0.1)\n for (let rn = 0; rn < 4; rn++) {\n const rz = -zw * 0.1 - bz * 0.3 + rn * bz * 0.2\n c.tube(\n [\n [ex + eb * 0.3, ey + bh / 2 + 0.02, rz],\n [plx - 0.02, ey + bh / 2 + 0.03, rz],\n [plx, ply + bh * 0.15, rz],\n ],\n 0.018,\n MATERIALS.block,\n { seg: 10, rs: 6 },\n )\n }\n const afx = x1 - L * 0.32\n const afy = Math.min(top - 0.07, fl + H * 0.7)\n c.roundBox(0.22, 0.1, 0.26, 0.03, MATERIALS.plastic, afx, afy, zw * 0.5)\n c.roundBox(0.22, 0.012, 0.26, 0.004, MATERIALS.dark, afx, afy + 0.01, zw * 0.5)\n c.tube(\n [\n [afx - 0.11, afy, zw * 0.4],\n [plx + 0.02, afy, zw * 0.15],\n [plx, ply + bh * 0.2, -zw * 0.1 + bz * 0.35],\n ],\n 0.04,\n MATERIALS.hose,\n { seg: 16, rs: 8 },\n )\n out.batt = battery(x0 + L * 0.2, fl + 0.1, zw * 0.62)\n reservoir(x0 + L * 0.22, fl + H * 0.6, -zw * 0.65, 0.12, 0.12, 0.1, MATERIALS.coolant, MATERIALS.coolantLiq, MATERIALS.postBlack)\n c.tube(\n [\n [rx - 0.03, fl + rh * 0.85, -zw * 0.3],\n [ex + eb * 0.6, ey + bh * 0.3, -zw * 0.4],\n [ex + eb / 2, ey + bh * 0.2, -zw * 0.3],\n ],\n 0.025,\n MATERIALS.hose,\n { seg: 14, rs: 6 },\n )\n c.tube(\n [\n [rx - 0.03, fl + 0.06, zw * 0.2],\n [ex + eb * 0.7, fl + 0.05, 0],\n [ex + eb / 2, ey - bh * 0.3, -zw * 0.2],\n ],\n 0.025,\n MATERIALS.hose,\n { seg: 14, rs: 6 },\n )\n if (mot === 'diesel' && o.turbo !== false) {\n const tx = ex - eb * 0.1\n const ty = ey + bh * 0.1\n const tz = zw * 0.35\n const snail = c.add(new THREE.TorusGeometry(0.06, 0.035, 10, 20), makeMaterial('#8a8478', { metalness: 0.7, roughness: 0.5 }), tx, ty, tz)\n snail.rotation.x = PI / 2\n c.cylinder(0.045, 0.05, 0.08, makeMaterial('#7b756b', { metalness: 0.7, roughness: 0.5 }), tx, ty + 0.05, tz)\n const icx = ex + eb * 0.1\n const icy = ey + bh / 2 + 0.13\n c.roundBox(0.22, 0.05, bz * 0.6, 0.015, makeMaterial('#a7adb1', { metalness: 0.7, roughness: 0.35 }), icx, Math.min(icy, top - 0.04), -zw * 0.05)\n c.tube(\n [\n [tx, ty + 0.09, tz],\n [tx + 0.05, Math.min(icy, top - 0.04), tz],\n [icx - 0.08, Math.min(icy, top - 0.04), zw * 0.15],\n ],\n 0.025,\n MATERIALS.steel,\n { seg: 10, rs: 6 },\n )\n out.turbo = new V3(tx, ty, tz)\n }\n out.motor = new V3(ex, ey, -zw * 0.1)\n }\n c.part('engine', { key: mot === 'electric' ? 'engine_electric' : 'engine' }, null, out.motor, 1.0)\n c.part('radiator', { key: 'radiator' }, rad, out.rad, 0.9)\n c.meta.bay = {\n x0: x0,\n x1: x1,\n zw: zw,\n floor: fl,\n top: top,\n motor: mot,\n center: new V3(cx, fl + H * 0.5, 0),\n label: o.label,\n turbo: o.turbo,\n view: o.view,\n }\n return out\n }\n\n Object.assign(I, {})\n}\n","/** The generic car builder: shell, glasshouse, lights, wheels, interior and engine bay in one call. */\nimport type { Kit } from './types'\n\nexport function installCar(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, MATERIALS } = I\n\n /* ================= generic car ================= */\n /* spec of kit.car(c, spec). Lengths in metres; +x is the front of the vehicle.\n W body width\n col, roofCol paint colour (and optional roof colour)\n bottomY height of the lower edge of the body; noseY / tailY: height at which the front / rear ends are measured\n lower side profile of the lower body: [[x, y, cornerRadius], ...] from rear to front\n arches wheel arches: [[x, wheelCentreY, radius], ...]\n gh glasshouse (the greenhouse): { rb, rt: x of the rear base / top, ft, fb: x of the front top / base, belt: beltline height,\n roof: roof height, Wg: glasshouse width, k: corner softness, pillars: [x, ...], r1, r2 }\n seams, handles optional panel seams and door handles\n hl, tl headlights / taillights: { style, w, h, y, in, yaw }\n grille { style, w, h, y } or false\n interior { rows, col, trim } or false\n hood { motor, front } | true | false (engine bay under an opening hood)\n wheels [[x, radius, width, options], ...]\n bodyBumper, mirrorCol, noAntenna, plateRearY misc. options */\n kit.car = function (c: any, s: any) {\n const W = s.W\n const gh = s.gh\n const bev = 0.05\n const T = { belt: gh.belt, top: gh.roof + bev, k: gh.k }\n const m = c.meta\n m.color = s.col\n m.kind = m.kind || 'car'\n const front = I.profX(s.lower, s.noseY, true)\n const rear = I.profX(s.lower, s.tailY, false)\n const intr = s.interior === false ? null : Object.assign({ rows: 2 }, s.interior || {})\n const hoodO = s.hood ? Object.assign({ motor: 'gasoline' }, s.hood === true ? {} : s.hood) : null\n let tireW = 0.2\n ;(s.wheels || []).forEach(function (w: any) {\n tireW = Math.max(tireW, w[2])\n })\n const low = []\n if (intr) low.push(kit.holeTop(gh.rb + 0.05, gh.fb - 0.03, gh.Wg / 2 - 0.05, gh.belt - 0.3))\n const hx0 = gh.fb + 0.08\n const hx1 = front - (hoodO && hoodO.front != null ? hoodO.front : 0.2)\n const zH = W / 2 - 0.13\n if (hoodO) low.push(kit.holeTop(hx0, hx1, zH, s.bottomY + 0.2, 'hood'))\n ;(s.holes || []).forEach(function (h: any) {\n low.push(h)\n })\n const lowMesh = I.shell(c, {\n items: s.lower,\n bottomY: s.bottomY,\n arches: s.arches,\n W: W,\n col: s.col,\n holes: low,\n archInner: intr || hoodO ? W / 2 - tireW - 0.16 : null,\n })\n const ghItems = [\n [gh.rb, gh.belt - 0.1, 0],\n [gh.rt, gh.roof, gh.r1 || 0.12],\n [gh.ft, gh.roof, gh.r2 || 0.2],\n [gh.fb, gh.belt - 0.1, 0],\n ]\n const polys = I.autoWindows(gh)\n const qf = kit.quadDef([gh.fb, gh.belt], [gh.ft, gh.roof], gh.Wg, T, 'front', bev)\n const qr = kit.quadDef([gh.rb, gh.belt], [gh.rt, gh.roof], gh.Wg, T, 'rear', bev)\n const gHoles = []\n if (intr) {\n polys.forEach(function (p: any) {\n gHoles.push(kit.holeSide(p))\n })\n gHoles.push(\n kit.holeQuad(qf),\n kit.holeQuad(qr),\n kit.holeWhere(function (n: any, ce: any) {\n return n.y < -0.7 && ce.y < gh.belt + 0.02\n }),\n )\n }\n I.shell(c, { items: ghItems, W: gh.Wg, col: s.roofCol || s.col, T: T, holes: gHoles, sub: intr ? 0.12 : 0.2 })\n kit.sideWindows(\n c,\n polys,\n gh.Wg,\n T,\n function (i: any, n: any) {\n return { key: i === 0 && n > 2 ? 'quarter_glass' : i === n - 1 ? 'window_front' : 'window_rear' }\n },\n { see: !!intr },\n )\n kit.glassQuad(c, qf, { key: 'windshield' }, { see: !!intr })\n kit.glassQuad(c, qr, { key: 'rear_window' }, { see: !!intr, mat: intr ? MATERIALS.rearTint : MATERIALS.glassDark })\n m.length = front - rear\n m.width = W\n m.front = front\n m.rear = rear\n m.clearance = s.bottomY\n m.belt = gh.belt\n m.top = gh.roof + bev\n m.bodyHeight = gh.belt - s.bottomY\n m.roof = { x0: gh.rt + 0.1, x1: gh.ft - 0.1, w: I.halfAt(gh.Wg, T, gh.roof) * 1.7, y: gh.roof + bev }\n m.glasshouse = gh\n m.tumble = T\n m.frontQuad = qf\n if (intr)\n kit.interior(\n c,\n Object.assign(\n {\n x0: gh.fb,\n ft: gh.ft,\n rb: gh.rb,\n rt: gh.rt,\n roof: gh.roof,\n belt: gh.belt,\n floor: s.bottomY + 0.1,\n zIn: gh.Wg / 2 - 0.09,\n zRoof: I.halfAt(gh.Wg, T, gh.roof) - 0.12,\n xRear: gh.rb + 0.06,\n },\n intr,\n ),\n )\n if (hoodO) {\n let fa = -1e9\n ;(s.arches || []).forEach(function (a: any) {\n fa = Math.max(fa, a[0])\n })\n const bxv8 = hx0 + (hx1 - hx0) * 0.45\n const hood = kit.makeHood(c, lowMesh.userData.cut.hood, {\n x0: hx0,\n col: s.col,\n hole: hoodO.motor === 'v8' ? kit.holeBox([bxv8 - 0.2, -9, -0.16], [bxv8 + 0.24, 9, 0.16]) : null,\n })\n if (hood)\n kit.engineBay(c, {\n x0: hx0 + 0.02,\n x1: hx1,\n zw: zH - 0.02,\n floor: s.bottomY + 0.12,\n top: hood.yMin - 0.035,\n motor: hoodO.motor,\n axle: fa,\n col: s.col,\n })\n }\n kit.carDetails(c, s)\n m.arches = s.arches || null\n if (s.bed) m.bed = s.bed\n if (s.under !== false)\n kit.underbody(c, {\n W: W,\n bottomY: s.bottomY,\n wheels: s.wheels || [],\n motor: hoodO ? hoodO.motor : s.motor || 'gasoline',\n spare: s.spareUnder,\n })\n if (s.warp) I.applyWarp(c, typeof s.warp === 'function' ? s.warp : I.makeWarp(s.warp))\n }\n /* Underbody visible when rolled over: axles, arms, oil pan, differential (rear-wheel drive), exhaust with muffler, tank, spare wheel.\n o: { W, bottomY, wheels: [[x, r, w]..], motor, spare (true = spare wheel under the rear) } */\n kit.underbody = function (c: any, o: any) {\n const m = c.meta\n const W = o.W\n const by = o.bottomY\n const ws = o.wheels\n .map(function (w: any) {\n return w\n })\n .sort(function (a: any, b: any) {\n return b[0] - a[0]\n })\n if (ws.length < 2) return\n const fx = ws[0][0]\n const rx = ws[ws.length - 1][0]\n const rr = ws[ws.length - 1][1]\n const tw = ws[0][2]\n const zW = W / 2 - tw - 0.04\n const yU = Math.max(0.12, by - 0.035)\n const ug = new THREE.Group()\n ug.userData.rigid = true\n c.vehicle.add(ug)\n m.underbodyGroup = ug\n const DK = makeMaterial('#1a1b1c', { roughness: 0.75, metalness: 0.3 })\n const ST = MATERIALS.steel\n function box(w: any, h: any, d: any, mat: any, x: any, y: any, z: any) {\n return c.roundBox(w, h, d, Math.min(0.02, h * 0.4), mat, x, y, z, { parent: ug })\n }\n function rod(a: any, b: any, r: any, mat: any) {\n return c.rod(a, b, r, mat, { parent: ug, seg: 8 })\n }\n const diesel = o.motor === 'diesel' || o.motor === 'v8' || o.motor === 'v8_na'\n const ev = o.motor === 'electric'\n /* front axle: half shafts and wishbones */\n ;[1, -1].forEach(function (sd) {\n rod(new V3(fx, ws[0][1], sd * 0.12), new V3(fx, ws[0][1], sd * zW), 0.028, ST)\n rod(new V3(fx - 0.25, yU + 0.02, sd * 0.3), new V3(fx, ws[0][1] - 0.1, sd * zW), 0.022, DK)\n rod(new V3(rx + 0.35, yU + 0.02, sd * 0.25), new V3(rx, rr - 0.08, sd * zW), 0.026, DK)\n })\n if (diesel) {\n rod(new V3(rx, rr, -zW), new V3(rx, rr, zW), 0.045, ST)\n c.sphere(0.13, ST, rx, rr, 0, 1, 0.85, 1, { parent: ug })\n rod(new V3(rx + 0.1, rr, 0), new V3(fx - 0.6, yU + 0.04, 0), 0.035, ST)\n } else box(0.09, 0.08, zW * 2, DK, rx + 0.08, Math.max(yU, rr - 0.12), 0)\n if (!ev) {\n box(Math.min(0.5, (fx - rx) * 0.2), 0.1, 0.38, DK, fx - 0.25, yU + 0.01, -0.05)\n const tz = W * 0.3\n const mx = rx - 0.15\n const ty = Math.max(0.14, by - 0.06)\n c.tube(\n [\n [fx - 0.35, yU, 0.12],\n [fx - 0.9, ty, 0.14],\n [(fx + rx) / 2, ty, 0.16],\n [rx + 0.5, ty, tz * 0.5],\n [mx + 0.3, ty, tz * 0.8],\n ],\n 0.03,\n ST,\n { parent: ug, seg: 30, rs: 6 },\n )\n c.cylinder(0.1, 0.1, 0.42, ST, mx, ty + 0.02, tz, 'x', { parent: ug })\n box(0.24, 0.06, 0.2, DK, (fx + rx) / 2 + 0.1, ty, 0.16)\n box(0.55, 0.18, W * 0.5, makeMaterial('#232527', { roughness: 0.7 }), rx + 0.62, Math.max(0.16, by - 0.02), -W * 0.1)\n } else {\n box(\n (fx - rx) * 0.72,\n 0.1,\n W - 0.4,\n makeMaterial('#2a2e31', { roughness: 0.6, metalness: 0.4 }),\n (fx + rx) / 2,\n Math.max(0.14, by - 0.03),\n 0,\n )\n for (let k = 0; k < 6; k++) box(0.03, 0.02, W - 0.45, ST, rx + 0.4 + (k * (fx - rx - 0.8)) / 5, Math.max(0.14, by - 0.03) - 0.06, 0)\n }\n if (o.spare && m.rear < rx - 0.7) {\n c.cylinder(0.32, 0.32, 0.2, MATERIALS.rubber, rx - 0.55, Math.max(0.2, by - 0.05), 0, null, { parent: ug })\n c.cylinder(0.2, 0.2, 0.21, ST, rx - 0.55, Math.max(0.2, by - 0.05), 0, null, { parent: ug })\n }\n ug.traverse(function (x: any) {\n x.castShadow = false\n })\n return ug\n }\n kit.carDetails = function (c: any, s: any) {\n const m = c.meta\n const W = m.width\n const by = s.bottomY\n const it = s.lower\n const bumperY = by + 0.14\n const bf = I.profX(it, bumperY, true)\n const br = I.profX(it, bumperY, false)\n const bumper = s.bodyBumper ? c.paint(s.col) : MATERIALS.trim\n m.frontBumper = c.roundBox(0.24, 0.22, W + 0.03, 0.09, bumper, bf - 0.04, bumperY, 0, { def: true })\n c.part('bumper', { key: 'bumper_front' }, m.frontBumper, new V3(bf, bumperY, 0), 1.1)\n m.rearBumper = c.roundBox(0.24, 0.22, W + 0.03, 0.09, bumper, br + 0.04, bumperY, 0, { def: true })\n c.part('bumper', { key: 'bumper_rear' }, m.rearBumper, new V3(br, bumperY, 0), 1.1)\n const hl = Object.assign(\n { style: s.headMat === MATERIALS.led ? 'slim' : 'rect', w: s.headW || 0.34, h: s.headH || 0.12, in: 0.06, yaw: 0.16 },\n s.hl || {},\n )\n const hy = hl.y || s.headY || s.noseY - 0.06\n const hx = I.profX(it, hy, true)\n const hz = W / 2 - hl.in - hl.w / 2\n ;[1, -1].forEach(function (sd) {\n kit.headlight(c, {\n style: hl.style,\n x: hx + 0.02 + (hl.dx || 0),\n y: hy,\n z: sd * hz,\n w: hl.w,\n h: hl.h,\n side: sd,\n yaw: hl.yaw,\n mat: hl.mat,\n })\n })\n if (hl.style === 'ledbar') kit.lightBar(c, hx + 0.03, hy + hl.h * 0.3, -hz + hl.w / 2, hz - hl.w / 2, 0.018, 1)\n if (s.grille !== false && !s.noGrille) {\n const gr = Object.assign({ style: 'bars', w: W * 0.44, h: Math.max(0.08, hy - bumperY - 0.12) }, s.grille || {})\n const gy = gr.y || (bumperY + hy) / 2 + 0.02\n const gx = I.profX(it, gy, true)\n kit.grille(c, { style: gr.style, x: gx + 0.025, y: gy, w: gr.w, h: gr.h, col: s.col, emblem: gr.emblem })\n } else kit.emblem(c, I.profX(it, hy + 0.02, true) + 0.055, hy + 0.02, 0, 0.04)\n const tl = Object.assign({ style: 'wrap', w: s.tailW || 0.3, h: s.tailH || 0.14, in: 0.05 }, s.tl || {})\n const ty = tl.y || s.tailLightY || s.tailY - 0.05\n const tx = I.profX(it, ty, false)\n const tz = W / 2 - tl.in - tl.w / 2\n ;[1, -1].forEach(function (sd) {\n kit.taillight(c, { style: tl.style, x: tx - 0.02, y: ty, z: sd * tz, w: tl.w, h: tl.h, side: sd, wrap: tl.wrap })\n })\n if (tl.style === 'bar') kit.lightBar(c, tx - 0.03, ty + tl.h * 0.15, -tz + tl.w / 2, tz - tl.w / 2, Math.min(0.04, tl.h * 0.4), -1)\n ;[1, -1].forEach(function (sd) {\n if (m.glasshouse && m.glasshouse.Wg) {\n const mx = m.glasshouse.fb - 0.12\n const my = m.glasshouse.belt + 0.1\n const mz = sd * (I.halfAt(m.glasshouse.Wg, m.tumble, my) + 0.13)\n c.roundBox(0.13, 0.11, 0.07, 0.035, c.paint(s.mirrorCol || s.col), mx, my, mz)\n c.roundBox(0.02, 0.08, 0.05, 0.01, MATERIALS.chrome, mx - 0.07, my, mz)\n c.rod(new V3(mx + 0.02, my - 0.02, mz - sd * 0.04), new V3(mx + 0.04, my - 0.05, sd * (W / 2 - 0.02)), 0.015, MATERIALS.trim)\n }\n ;(s.seams || []).forEach(function (x: any) {\n c.roundBox(0.012, m.belt - by - 0.14, 0.006, 0.003, MATERIALS.dark, x, (m.belt + by) / 2 + 0.04, sd * (W / 2 + 0.002))\n })\n ;(s.handles || []).forEach(function (x: any) {\n c.roundBox(0.13, 0.035, 0.025, 0.012, MATERIALS.chrome, x, m.belt - 0.12, sd * (W / 2 + 0.01))\n })\n if (s.arches && s.arches.length > 1) {\n const x0 = Math.min(s.arches[0][0], s.arches[1][0]) + s.arches[0][2]\n const x1 = Math.max(s.arches[0][0], s.arches[1][0]) - s.arches[0][2]\n c.roundBox(x1 - x0, 0.07, 0.03, 0.012, MATERIALS.trim, (x0 + x1) / 2, by + 0.06, sd * (W / 2 + 0.008))\n }\n })\n c.plate(bf + 0.085, bumperY + 0.01, 0, '+x')\n const pry = s.plateRearY || by + 0.42\n c.plate(I.profX(it, pry, false) - 0.025, pry, 0, '-x')\n if (m.glasshouse && m.glasshouse.Wg) {\n const wy = m.glasshouse.belt + 0.07\n const wx = m.glasshouse.fb - 0.05\n ;[-0.25, 0.25].forEach(function (z) {\n c.rod(new V3(wx + 0.03, wy, z - 0.02), new V3(wx - 0.18, wy + 0.17, z - 0.3), 0.01, MATERIALS.trim)\n })\n }\n c.cylinder(0.035, 0.035, 0.22, MATERIALS.steel, br - 0.05, by + 0.04, W * 0.3, 'x')\n m.exhaust = new V3(br - 0.17, by + 0.04, W * 0.3)\n if (!s.noAntenna && m.roof) c.rod(new V3(m.roof.x0 + 0.1, m.top, 0), new V3(m.roof.x0 - 0.05, m.top + 0.22, 0), 0.008, MATERIALS.trim)\n /* s.track (or w[3].track): track width from tyre centre to tyre centre; without it the tyre touches the body edge */\n ;(s.wheels || []).forEach(function (w: any) {\n const tk = (w[3] && w[3].track) || s.track\n ;[1, -1].forEach(function (sd) {\n c.wheel(w[0], sd * (tk ? tk / 2 : W / 2 - w[2] / 2 + 0.03), w[1], w[2], w[3] || {})\n })\n })\n if (\n !c.parts.some(function (p: any) {\n return p.kind === 'engine'\n })\n )\n c.part('engine', { key: 'engine' }, null, new V3(m.front - 0.6, by + 0.45, 0), 1.0)\n if (\n !c.parts.some(function (p: any) {\n return p.kind === 'radiator'\n }) &&\n !s.noRadiator\n )\n c.part('radiator', { key: 'radiator' }, null, new V3(m.front - 0.15, by + 0.35, 0), 0.9)\n c.part('fuel_tank', s.tankLabel || { key: 'fuel_tank' }, null, new V3(m.rear + 0.75, by + 0.15, -W * 0.22), 1.0)\n }\n /* Fender flare: an arched strip over the wheel arch, on both sides.\n x, y: wheel centre; r: arch radius; z: half width where it attaches; o: { w (strip width), t (thickness), mat, a0 (start angle), sides } */\n kit.archFlare = function (c: any, x: any, y: any, r: any, z: any, o: any) {\n o = o || {}\n const w = o.w || 0.07\n const t = o.t || 0.03\n const mat = o.mat || MATERIALS.trim\n const a0 = o.a0 == null ? 0.12 : o.a0\n const out: any = []\n ;(o.sides || [1, -1]).forEach(function (sd: any) {\n const shp = new THREE.Shape()\n const N = 24\n for (let i = 0; i <= N; i++) {\n const a = a0 + ((PI - 2 * a0) * i) / N\n shp[i ? 'lineTo' : 'moveTo'](Math.cos(a) * (r + w), Math.sin(a) * (r + w))\n }\n for (let j = N; j >= 0; j--) {\n const b = a0 + ((PI - 2 * a0) * j) / N\n shp.lineTo(Math.cos(b) * r, Math.sin(b) * r)\n }\n const g = new THREE.ExtrudeGeometry(shp, {\n depth: t,\n bevelEnabled: true,\n bevelThickness: 0.008,\n bevelSize: 0.008,\n bevelSegments: 2,\n curveSegments: 4,\n })\n g.translate(0, 0, sd > 0 ? 0 : -t)\n const m = c.add(g, mat, x, y, sd * z)\n out.push(m)\n })\n return out\n }\n\n Object.assign(I, {})\n}\n","/** Truck cab and chassis builders. */\nimport type { Kit } from './types'\n\nexport function installTrucks(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n const { makeMaterial, MATERIALS } = I\n\n /* ================= trucks ================= */\n /* Forward cab. o: { f (front x), W, col, len (2.05), roofY (2.92), belt (1.75), floor (1.25), wheelR (0.52), wheelW (0.32), int:{col,trim}, hl, grille, sleeper } */\n kit.truckCab = function (c: any, o: any) {\n const f = o.f\n const W = o.W\n const col = o.col\n const len = o.len || 2.05\n const ry = o.roofY || 2.92\n const belt = o.belt || 1.75\n const fl = o.floor || 1.25\n const wr = o.wheelR || 0.52\n const ww = o.wheelW || 0.32\n const T = { belt: belt, top: ry + 0.03, k: 0.04 }\n const items = [\n [f - len, 0.95, 0.05],\n [f - len - 0.01, ry - 0.07, 0.15],\n [f - 0.25, ry, 0.2],\n [f - 0.04, ry - 0.32, 0.12],\n [f + 0.03, 1.05, 0.1],\n [f, 0.88, 0.05],\n ]\n const m = c.meta\n m.color = col\n m.kind = m.kind || 'truck'\n const ax = f - 0.85\n const q = kit.quadDef([f + 0.01, belt + 0.03], [f - 0.06, ry - 0.26], W, T, 'front', 0.05, { inset: 0.04, side: 0.12 })\n const poly = [\n [f - len * 0.66, belt + 0.05],\n [f - 0.18, belt + 0.05],\n [f - 0.22, ry - 0.3],\n [f - len * 0.66, ry - 0.3],\n ]\n const holes = [kit.holeSide(poly), kit.holeQuad(q)]\n I.shell(c, {\n items: items,\n bottomY: 0.88,\n arches: [[ax, wr, wr + 0.08]],\n W: W,\n col: col,\n T: T,\n holes: holes,\n archInner: W / 2 - ww - 0.2,\n })\n kit.glassQuad(c, q, { key: 'windshield' })\n kit.sideWindows(c, [poly], W, T, function () {\n return { key: 'cab_window' }\n })\n Object.assign(m, {\n width: W,\n front: f + 0.03,\n clearance: 0.88,\n belt: belt,\n top: ry + 0.03,\n bodyHeight: 1.0,\n tumble: T,\n glasshouse: { fb: f, belt: belt + 0.03, Wg: W },\n cabRear: f - len,\n })\n const ic = o.int || {}\n const fab = makeMaterial(ic.col || '#3a3b3d', { roughness: 0.88 })\n const trim = makeMaterial(ic.trim || '#202124', { roughness: 0.7 })\n const zi = W / 2 - 0.1\n c.roundBox(len - 0.2, 0.04, zi * 2, 0.015, MATERIALS.carpet, f - len / 2 - 0.05, fl, 0)\n kit.dashboard(c, { x: f - 0.12, y: belt + 0.02, w: zi * 2, d: 0.45, h: belt - fl - 0.05, drv: -0.55, mat: trim, top: fab })\n kit.steeringWheel(c, f - 0.7, belt + 0.08, -0.55, { r: 0.24, tilt: 1.05, col: 0.5, mat: trim })\n const sx = f - 1.2\n kit.seat(c, sx, fl, -0.55, { w: 0.52, mat: fab, h: 0.45, back: 0.62 })\n kit.seat(c, sx, fl, 0.45, { w: 0.86, n: 2, mat: fab, h: 0.45, back: 0.6 })\n c.roundBox(0.03, ry - fl - 0.1, zi * 2, 0.01, trim, f - len + 0.08, (ry + fl) / 2, 0)\n c.roundBox(len - 0.4, 0.02, zi * 2 * 0.95, 0.01, MATERIALS.headliner, f - len / 2, ry - 0.06, 0).castShadow = false\n const rim = makeMaterial('#c8c4b8', { metalness: 0.4 })\n ;[1, -1].forEach(function (s) {\n c.roundBox(0.012, 1.5, 0.006, 0.003, MATERIALS.dark, f - len * 0.68, belt, s * (W / 2 + 0.002))\n c.roundBox(0.012, 1.5, 0.006, 0.003, MATERIALS.dark, f - 0.15, belt, s * (W / 2 + 0.002))\n c.roundBox(0.14, 0.04, 0.03, 0.012, MATERIALS.chrome, f - len * 0.6, belt - 0.1, s * (W / 2 + 0.012))\n c.roundBox(0.5, 0.05, 0.25, 0.02, MATERIALS.steel, f - 1.62, 0.62, s * (W / 2 - 0.1))\n c.roundBox(0.5, 0.05, 0.25, 0.02, MATERIALS.steel, f - 1.62, 0.32, s * (W / 2 - 0.1))\n c.tube(\n [\n [f - 0.2, 2.4, s * (W / 2)],\n [f + 0.1, 2.5, s * (W / 2 + 0.25)],\n [f + 0.1, 2.0, s * (W / 2 + 0.32)],\n ],\n 0.02,\n MATERIALS.trim,\n )\n c.roundBox(0.06, 0.45, 0.22, 0.03, MATERIALS.trim, f + 0.1, 2.1, s * (W / 2 + 0.33))\n c.roundBox(0.01, 0.4, 0.18, 0.01, MATERIALS.chrome, f + 0.065, 2.1, s * (W / 2 + 0.33))\n kit.headlight(c, Object.assign({ style: 'truck', x: f + 0.1, y: 0.74, z: s * (W / 2 - 0.32), w: 0.38, h: 0.18, side: s }, o.hl || {}))\n c.wheel(ax, s * (W / 2 - 0.2), wr, ww, { rim: rim, spokes: 8 })\n })\n kit.grille(c, Object.assign({ style: 'truck', x: f + 0.05, y: 1.35, w: W * 0.66, h: 0.56, col: col }, o.grille || {}))\n m.frontBumper = c.roundBox(0.22, 0.32, W + 0.04, 0.06, MATERIALS.trim, f + 0.06, 0.72, 0, { def: true })\n c.part('bumper', { key: 'bumper_front' }, m.frontBumper, new V3(f + 0.1, 0.72, 0), 1.1)\n c.plate(f + 0.175, 0.56, 0, '+x')\n c.part('engine', { key: 'engine' }, null, new V3(f - 1.0, 0.95, 0), 1.0)\n c.part('radiator', { key: 'radiator' }, null, new V3(f - 0.1, 1.2, 0), 0.9)\n if (o.visor !== false) c.roundBox(0.9, 0.3, W * 0.92, 0.12, c.paint(col), f - 1.2, ry + 0.16, 0, { taper: { sx: 0.6, shift: -0.25 } })\n return m\n }\n /* Chassis, rear axles, tank and fenders. o: { f, L, W, axles:[x..], dual, tank ('left'|'right'|false), wheelR, wheelW } */\n kit.truckChassis = function (c: any, o: any) {\n const f = o.f\n const L = o.L\n const W = o.W\n const rear = f - L\n const m = c.meta\n const rim = makeMaterial('#c8c4b8', { metalness: 0.4 })\n const wr = o.wheelR || 0.52\n const ww = o.wheelW || 0.32\n ;[0.42, -0.42].forEach(function (z) {\n c.roundBox(L - 0.3, 0.25, 0.12, 0.03, MATERIALS.trim, (f + rear) / 2 - 0.1, 0.68, z)\n })\n const axles = o.axles || [rear + 1.9, rear + 0.85]\n axles.forEach(function (x: any) {\n ;[1, -1].forEach(function (s) {\n c.wheel(x, s * (W / 2 - 0.2), wr, ww, { rim: rim, spokes: 8 })\n if (o.dual !== false) c.wheel(x, s * (W / 2 - 0.55), wr, ww - 0.02, { rim: rim, spokes: 8, noPart: true })\n })\n })\n const ts = o.tank === 'right' ? 1 : -1\n if (o.tank !== false) {\n c.cylinder(0.3, 0.3, 1.1, MATERIALS.chrome, f - 2.8, 0.55, ts * (W / 2 - 0.35), 'x', { seg: 24 })\n c.cylinder(0.08, 0.08, 0.04, MATERIALS.trim, f - 2.6, 0.86, ts * (W / 2 - 0.35))\n c.part('fuel_tank', { key: 'diesel_tank' }, null, new V3(f - 2.8, 0.55, ts * (W / 2 - 0.35)), 0.8)\n }\n c.roundBox(0.6, 0.45, 0.5, 0.04, MATERIALS.trim, f - 2.8, 0.55, -ts * (W / 2 - 0.35))\n ;[1, -1].forEach(function (s) {\n c.roundBox(0.02, 0.5, 0.55, 0.01, MATERIALS.rubber, rear + 0.35, 0.45, s * (W / 2 - 0.35))\n })\n c.roundBox(0.1, 0.12, W * 0.9, 0.03, MATERIALS.steel, rear + 0.05, 0.5, 0)\n c.plate(rear - 0.01, 0.7, 0, '-x')\n ;[1, -1].forEach(function (s) {\n kit.taillight(c, { style: 'vertical', x: rear + 0.06, y: 0.66, z: s * (W / 2 - 0.25), w: 0.12, h: 0.24, side: s })\n })\n m.rear = rear\n m.length = L\n }\n\n Object.assign(I, {})\n}\n","/** Spoked wheels and track assemblies. */\nimport type { Kit } from './types'\n\nexport function installWheels(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, MATERIALS, mergeGeometries, roundedBoxGeometry } = I\n\n /* ================= special wheels ================= */\n /* Spoked wheel for motorcycle/bicycle. o: { spokes, knobby, disc, cast (5-spoke alloy), z, label } */\n kit.spokedWheel = function (c: any, x: any, r: any, tireR: any, o: any) {\n o = o || {}\n const g = new THREE.Group()\n g.position.set(x, r, o.z || 0)\n c.vehicle.add(g)\n const t = new THREE.Mesh(new THREE.TorusGeometry(r - tireR, tireR, 12, 40), MATERIALS.rubber)\n t.castShadow = true\n g.add(t)\n if (o.knobby) {\n const kn = []\n for (let i = 0; i < 30; i++) {\n const a = (i / 30) * PI * 2\n const k = roundedBoxGeometry(0.04, 0.03, tireR * 1.6, 0.01)\n k.applyMatrix4(new THREE.Matrix4().makeRotationZ(a).setPosition(Math.cos(a) * r, Math.sin(a) * r, 0))\n kn.push(k)\n }\n g.add(new THREE.Mesh(mergeGeometries(kn), MATERIALS.rubber))\n }\n const rim = new THREE.Mesh(new THREE.TorusGeometry(r - tireR * 2 - 0.005, 0.012, 6, 40), o.cast ? MATERIALS.trim : MATERIALS.chrome)\n g.add(rim)\n const sl = r - tireR * 2\n if (o.cast) {\n for (let j = 0; j < 5; j++) {\n const sp = new THREE.Mesh(roundedBoxGeometry(sl, 0.03, 0.025, 0.01), MATERIALS.trim)\n const a3 = (j / 5) * PI * 2\n sp.position.set((Math.cos(a3) * sl) / 2, (Math.sin(a3) * sl) / 2, 0)\n sp.rotation.z = a3\n g.add(sp)\n }\n } else {\n const ns = o.spokes || 28\n const list = []\n for (let jj = 0; jj < ns; jj++) {\n const a2 = (jj / ns) * PI * 2\n const cg = new THREE.CylinderGeometry(0.0025, 0.0025, sl, 4)\n cg.applyMatrix4(\n new THREE.Matrix4()\n .makeRotationZ(a2 - PI / 2)\n .setPosition((Math.cos(a2) * sl) / 2, (Math.sin(a2) * sl) / 2, (jj % 2 ? 1 : -1) * 0.012),\n )\n list.push(cg)\n }\n g.add(new THREE.Mesh(mergeGeometries(list), MATERIALS.chrome))\n }\n const hub = new THREE.Mesh(new THREE.CylinderGeometry(0.035, 0.035, 0.1, 12), MATERIALS.steel)\n hub.rotation.x = PI / 2\n g.add(hub)\n if (o.disc) {\n const dsk = new THREE.Mesh(new THREE.CylinderGeometry(0.12, 0.12, 0.008, 24), MATERIALS.steel)\n dsk.rotation.x = PI / 2\n dsk.position.z = 0.06\n g.add(dsk)\n }\n g.userData.r = r\n c.wheels.push(g)\n c.part('wheel', o.label || { key: x > 0 ? 'bike_tire_front' : 'bike_tire_rear' }, g, new V3(x, r, o.z || 0), 0.8)\n return g\n }\n /* Simple track (tank). o: { x0 (drive wheel, rear), x1 (idler wheel, front), z, w, r (road wheels), n, top, mat } */\n kit.tracks = function (c: any, o: any) {\n const x0 = o.x0\n const x1 = o.x1\n const z = o.z\n const w = o.w || 0.55\n const r = o.r || 0.33\n const n = o.n || 6\n const top = o.top || 1.0\n const th = 0.06\n const mat = o.mat || makeMaterial('#2b2c2a', { metalness: 0.5, roughness: 0.6 })\n const wheelMat = o.wheelMat || makeMaterial('#3f4a36', { roughness: 0.7 })\n const rs = (top - th) / 2 - 0.02\n const rsY = top - rs - th\n const sp = ((x1 - x0 - 2 * rs) / Math.max(1, n - 1)) * 0.92\n const firstX = x0 + rs + 0.1\n const gs: any = []\n function road(x: any, y: any, rr: any) {\n const g = new THREE.Group()\n g.position.set(x, y, z)\n c.vehicle.add(g)\n const wm = new THREE.Mesh(new THREE.CylinderGeometry(rr, rr, w * 0.8, 22), wheelMat)\n wm.rotation.x = PI / 2\n wm.castShadow = true\n g.add(wm)\n const rb2 = new THREE.Mesh(new THREE.TorusGeometry(rr - 0.03, 0.03, 6, 22), MATERIALS.rubber)\n g.add(rb2)\n const hb = new THREE.Mesh(new THREE.CylinderGeometry(rr * 0.3, rr * 0.3, w * 0.84, 10), MATERIALS.steel)\n hb.rotation.x = PI / 2\n g.add(hb)\n gs.push(g)\n c.spin.push({ o: g, axis: 'z', v: 0, track: true })\n return g\n }\n for (let i = 0; i < n; i++) road(firstX + i * sp, r + th, r)\n const spr = road(x0, rsY, rs)\n const idl = road(x1, rsY, rs)\n for (let k = 0; k < 3; k++) road(x0 + (x1 - x0) * (0.25 + k * 0.25), top - th - 0.07, 0.07)\n const path = []\n const segs = 40\n function arc(cx: any, cy: any, rr: any, a0: any, a1: any) {\n for (let s = 0; s <= segs / 4; s++) {\n const a = a0 + ((a1 - a0) * s) / (segs / 4)\n path.push([cx + Math.cos(a) * rr, cy + Math.sin(a) * rr])\n }\n }\n path.push([firstX - 0.05, th / 2])\n path.push([firstX + (n - 1) * sp + 0.05, th / 2])\n arc(x1, rsY, rs + th / 2, -PI / 2 + 0.6, PI / 2)\n arc(x0, rsY, rs + th / 2, PI / 2, PI * 1.5 - 0.6)\n const pts = path.map(function (p) {\n return new THREE.Vector2(p[0], p[1])\n })\n const curve = new THREE.SplineCurve(pts.concat([pts[0]]))\n const lenT = curve.getLength()\n const nl = Math.round(lenT / 0.15)\n const links = []\n for (let l = 0; l < nl; l++) {\n const t = l / nl\n const p = curve.getPointAt(t)\n const tg = curve.getTangentAt(t)\n const ang = Math.atan2(tg.y, tg.x)\n const lg = roundedBoxGeometry(0.13, th, w, 0.015)\n lg.applyMatrix4(new THREE.Matrix4().makeRotationZ(ang).setPosition(p.x, p.y, 0))\n links.push(lg)\n const gh2 = roundedBoxGeometry(0.05, 0.05, 0.05, 0.01)\n gh2.applyMatrix4(new THREE.Matrix4().makeRotationZ(ang).setPosition(p.x - Math.sin(ang) * 0.04, p.y + Math.cos(ang) * 0.04, 0))\n links.push(gh2)\n }\n const tm = c.add(mergeGeometries(links), mat, 0, 0, z)\n tm.userData.noFollow = true\n c.part('track', kit.t('parts.track', { s: z > 0 ? 1 : -1 }), tm, new V3((x0 + x1) / 2, 0.3, z), 1.4)\n return { mesh: tm, wheels: gs, sprocket: spr, idler: idl }\n }\n\n Object.assign(I, {})\n}\n","/** Particle system: smoke, fire, sparks, shards, dust and water. */\nimport type { Kit } from './types'\nimport { clamp, hash, smooth } from './util'\n\nexport function installParticles(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const document = kit.document\n const { makeMaterial } = I\n\n /* ================= particles ================= */\n const PARTICLE_LIMIT = 400\n const PARTICLE_GEOMETRIES: any = {\n spark: new THREE.BoxGeometry(0.012, 0.012, 0.1),\n shard: new THREE.TetrahedronGeometry(0.028, 0),\n cube: new THREE.BoxGeometry(0.014, 0.014, 0.014),\n lens: new THREE.TetrahedronGeometry(0.022, 0),\n scrap: new THREE.BoxGeometry(0.07, 0.008, 0.05),\n plastic: new THREE.BoxGeometry(0.06, 0.014, 0.04),\n water: new THREE.SphereGeometry(0.03, 6, 4),\n droplet: new THREE.SphereGeometry(0.012, 6, 4),\n }\n const PARTICLE_MATERIALS: any = {\n spark: new THREE.MeshBasicMaterial({ color: 0xffc46a, blending: THREE.AdditiveBlending, transparent: true, depthWrite: false }),\n shard: makeMaterial('#cfe3e8', { roughness: 0.05, metalness: 0.4, transparent: true, opacity: 0.8 }),\n cube: makeMaterial('#d6e8ec', { roughness: 0.08, metalness: 0.4, transparent: true, opacity: 0.85 }),\n lensclear: makeMaterial('#f2f6f7', { roughness: 0.05, transparent: true, opacity: 0.7 }),\n lensred: makeMaterial('#c0281c', { roughness: 0.05, transparent: true, opacity: 0.8 }),\n plastic: makeMaterial('#18191b', { roughness: 0.7 }),\n water: new THREE.MeshBasicMaterial({ color: 0xbfd8e0, transparent: true, opacity: 0.7, depthWrite: false }),\n droplet: makeMaterial('#0b0908', { roughness: 0.05, metalness: 0.7 }),\n }\n /* ---- smoke, fire and dust: sprite puffs with a noise texture; they grow, drift with the wind and dissolve by noise ---- */\n function valueNoise(seed: any) {\n const N = 16\n const g: any = []\n for (let i = 0; i < N * N; i++) g.push(hash(i % N, (i / N) | 0, seed))\n return function (x: any, y: any) {\n const xi = Math.floor(x)\n const yi = Math.floor(y)\n const fx = x - xi\n const fy = y - yi\n const sx = fx * fx * (3 - 2 * fx)\n const sy = fy * fy * (3 - 2 * fy)\n function G(a: any, b: any) {\n return g[(((a % N) + N) % N) + (((b % N) + N) % N) * N]\n }\n const a = G(xi, yi) + (G(xi + 1, yi) - G(xi, yi)) * sx\n const b = G(xi, yi + 1) + (G(xi + 1, yi + 1) - G(xi, yi + 1)) * sx\n return a + (b - a) * sy\n }\n }\n function puffTexture(seed: any, fire: any) {\n const S = 96\n const cv = document.createElement('canvas')\n cv.width = cv.height = S\n const x: any = cv.getContext('2d')\n const img = x.createImageData(S, S)\n const nz = valueNoise(seed)\n for (let j = 0; j < S; j++)\n for (let i = 0; i < S; i++) {\n const u = (i / S) * 2 - 1\n const v = (j / S) * 2 - 1\n const r = Math.hypot(u, v)\n const f = nz(i / 12, j / 12) * 0.5 + nz(i / 6 + 7, j / 6 + 3) * 0.3 + nz(i / 3 + 11, j / 3 + 5) * 0.2\n const edge = 1 - smooth((r - 0.25 - f * 0.35) / 0.45)\n const a = clamp(edge * (0.55 + f * 0.6), 0, 1)\n const k = (j * S + i) * 4\n if (fire) {\n const hot = clamp(1 - r * 1.3 + f * 0.3, 0, 1)\n img.data[k] = 255\n img.data[k + 1] = Math.round(90 + 165 * hot)\n img.data[k + 2] = Math.round(30 + 170 * hot * hot * hot)\n } else {\n const sh = Math.round(150 + 105 * clamp(f * 1.1 - v * 0.25, 0, 1))\n img.data[k] = img.data[k + 1] = img.data[k + 2] = sh\n }\n img.data[k + 3] = Math.round(a * 255)\n }\n x.putImageData(img, 0, 0)\n const t = new THREE.CanvasTexture(cv)\n return t\n }\n let SMOKE_TEXTURES: any = null\n let FIRE_TEXTURES: any = null\n function puffMaterial(fire: any, col: any, op: any) {\n if (!SMOKE_TEXTURES) {\n SMOKE_TEXTURES = [1, 2, 3, 4].map(function (k) {\n return puffTexture(k * 13, false)\n })\n FIRE_TEXTURES = [5, 6, 7].map(function (k) {\n return puffTexture(k * 17, true)\n })\n }\n const list = fire ? FIRE_TEXTURES : SMOKE_TEXTURES\n const mat = new THREE.SpriteMaterial({\n map: list[Math.floor(Math.random() * list.length)],\n color: new THREE.Color(col),\n transparent: true,\n depthWrite: false,\n opacity: op,\n blending: fire ? THREE.AdditiveBlending : THREE.NormalBlending,\n })\n const dis = { value: 0 }\n mat.userData.dis = dis\n mat.onBeforeCompile = function (sh: any) {\n sh.uniforms.uDis = dis\n /* the sampled texel is called texelColor up to r152 and sampledDiffuseColor from r153 */\n const texel = parseInt(THREE.REVISION, 10) >= 153 ? 'sampledDiffuseColor' : 'texelColor'\n sh.fragmentShader =\n 'uniform float uDis;\\n' +\n sh.fragmentShader.replace(\n '#include <alphatest_fragment>',\n 'diffuseColor.a *= smoothstep(uDis, uDis + 0.2, ' + texel + '.a); if (diffuseColor.a < 0.003) discard;',\n )\n }\n return mat\n }\n const SPRITE_TYPES: any = { smoke: 1, fire: 1, dust: 1 }\n const PUFF_COLORS: any = {\n smokewhite: ['#9aa1a7', 0.42],\n smokeblack: ['#1b1b1c', 0.62],\n smokegray: ['#55595c', 0.5],\n smokesteam: ['#b6bcc1', 0.3],\n dust: ['#6e6658', 0.34],\n fire: ['#ffffff', 0.9],\n }\n const WIND = new V3(-0.45, 0, 0.16)\n const PARTICLE_LIFE: any = { spark: 0.6, dust: 1.6, smoke: 2.8, fire: 0.7, water: 1.2, droplet: 1.0 }\n const TRANSIENT_TYPES: any = { spark: 1, dust: 1, smoke: 1, fire: 1, water: 1, droplet: 1 }\n function killParticle(c: any, i: any) {\n const P = c.particles[i]\n c.effects.remove(P.m)\n if (P.own) P.m.material.dispose()\n c.particles.splice(i, 1)\n }\n /* Particle in the sibling group c.effects (vehicle world coordinates). type: spark|shard|cube|lens|scrap|plastic|dust|smoke|fire|water|droplet */\n kit.spawn = function (c: any, type: any, pos: any, vel: any, o: any) {\n o = o || {}\n if (c.particles.length >= PARTICLE_LIMIT) {\n const idx = c.particles.findIndex(function (q: any) {\n return TRANSIENT_TYPES[q.type]\n })\n killParticle(c, idx >= 0 ? idx : 0)\n }\n let m\n let own = false\n let op = 1\n if (SPRITE_TYPES[type]) {\n const pc = PUFF_COLORS[type + (o.variant || '')] || PUFF_COLORS[type] || PUFF_COLORS.smokewhite\n const opv = o.op != null ? o.op : pc[1]\n m = new THREE.Sprite(puffMaterial(type === 'fire', o.col || pc[0], opv))\n m.raycast = function () {}\n own = true\n op = opv\n if (o.nofog) m.material.fog = false\n m.material.rotation = c.rand() * PI * 2\n m.scale.setScalar(0.01)\n } else {\n const mat = o.mat || PARTICLE_MATERIALS[type + (o.variant || '')] || PARTICLE_MATERIALS[type]\n m = new THREE.Mesh(PARTICLE_GEOMETRIES[type], mat)\n m.castShadow = false\n m.receiveShadow = false\n op = mat.opacity\n if (o.s) m.scale.setScalar(o.s)\n m.rotation.set(c.rand() * 6, c.rand() * 6, c.rand() * 6)\n }\n m.position.copy(pos)\n c.effects.add(m)\n const P = {\n m: m,\n v: vel.clone(),\n type: type,\n age: 0,\n life: o.life || PARTICLE_LIFE[type] || 99,\n rest: false,\n w: new V3(c.rand() - 0.5, c.rand() - 0.5, c.rand() - 0.5).multiplyScalar(14),\n s0: o.s || 1,\n op: op,\n own: own,\n r: o.r || 0.01,\n spin: (c.rand() - 0.5) * 1.2,\n ph: c.rand() * 6.28,\n grow: o.grow || 1,\n }\n c.particles.push(P)\n return P\n }\n const _q = new THREE.Quaternion()\n const _z = new V3(0, 0, 1)\n const _t = new V3()\n function tickParticles(c: any, dt: any) {\n for (let i = c.particles.length - 1; i >= 0; i--) {\n const P = c.particles[i]\n if (P.rest) continue\n P.age += dt\n const m = P.m\n const t = P.age / P.life\n if (t >= 1 && TRANSIENT_TYPES[P.type]) {\n killParticle(c, i)\n continue\n }\n if (P.type === 'spark') {\n P.v.y -= 9.8 * dt\n m.position.addScaledVector(P.v, dt)\n if (m.position.y < 0.005) {\n m.position.y = 0.005\n P.v.y *= -0.35\n P.v.x *= 0.6\n P.v.z *= 0.6\n }\n const sp = P.v.length()\n if (sp > 0.01) {\n m.quaternion.setFromUnitVectors(_z, _t.copy(P.v).divideScalar(sp))\n m.scale.set(1, 1, clamp(sp * 0.25, 0.3, 1.6) * (1 - t))\n }\n } else if (P.type === 'smoke' || P.type === 'dust') {\n /* thrust that fades, drag towards the wind speed, soft turbulence */\n const k = Math.min(1, dt * (P.type === 'dust' ? 2.5 : 0.9))\n P.v.x += (WIND.x - P.v.x) * k\n P.v.z += (WIND.z - P.v.z) * k\n P.v.y = P.type === 'dust' ? P.v.y * Math.max(0, 1 - 2.5 * dt) : P.v.y * Math.max(0, 1 - 0.7 * dt) + 0.08 * dt\n m.position.addScaledVector(P.v, dt)\n m.position.x += Math.sin(P.age * 1.7 + P.ph) * 0.08 * dt\n m.position.z += Math.cos(P.age * 1.3 + P.ph) * 0.08 * dt\n const gs = P.s0 * P.grow * (0.18 + 1.5 * (1 - Math.exp(-P.age * 1.1)) + P.age * 0.12)\n m.scale.set(gs, gs, 1)\n m.material.rotation += P.spin * dt\n m.material.opacity = P.op * Math.min(1, P.age / 0.3)\n m.material.userData.dis.value = Math.pow(t, 1.3) * 0.95\n } else if (P.type === 'fire') {\n P.v.x += (WIND.x * 0.6 - P.v.x) * Math.min(1, dt * 1.5)\n P.v.z += (WIND.z * 0.6 - P.v.z) * Math.min(1, dt * 1.5)\n m.position.addScaledVector(P.v, dt)\n const fs =\n P.s0 * (0.35 + 0.5 * Math.sin(Math.min(1, t * 1.4) * PI * 0.5)) * (1 - t * 0.55) * (0.9 + 0.2 * Math.sin(P.age * 25 + P.ph))\n m.scale.set(fs * 0.85, fs * 1.25, 1)\n m.material.rotation += P.spin * dt * 2\n m.material.color.setHSL(0.11 - t * 0.09, 1, 0.62 - t * 0.3)\n m.material.userData.dis.value = Math.pow(t, 1.1) * 0.9\n } else if (P.type === 'water') {\n P.v.y -= 9.8 * dt\n m.position.addScaledVector(P.v, dt)\n if (m.position.y < -0.05) killParticle(c, i)\n } else if (P.type === 'droplet') {\n P.v.y -= 9.8 * dt\n m.position.addScaledVector(P.v, dt)\n if (m.position.y < 0.012) killParticle(c, i)\n } else {\n P.v.y -= 9.8 * dt\n m.position.addScaledVector(P.v, dt)\n m.rotation.x += P.w.x * dt\n m.rotation.y += P.w.y * dt\n m.rotation.z += P.w.z * dt\n const floor = P.floor != null ? P.floor : 0.006\n if (m.position.y < floor) {\n m.position.y = floor\n if (Math.abs(P.v.y) < 1.1) {\n P.rest = true\n m.rotation.x = (c.rand() - 0.5) * 0.3\n m.rotation.z = (c.rand() - 0.5) * 0.3\n } else {\n P.v.y *= -0.32\n P.v.x *= 0.5\n P.v.z *= 0.5\n P.w.multiplyScalar(0.5)\n }\n }\n }\n }\n }\n function burst(c: any, type: any, pFx: any, n: any, o: any) {\n o = o || {}\n const d = o.dir || new V3(0, 1, 0)\n const spd = o.speed || 2\n const spread = o.spread == null ? 1 : o.spread\n for (let i = 0; i < n; i++) {\n const v = new V3(c.rand() - 0.5, c.rand() * 0.8, c.rand() - 0.5).multiplyScalar(spread * spd).addScaledVector(d, spd * (0.5 + c.rand()))\n kit.spawn(\n c,\n type,\n pFx\n .clone()\n .add(new V3((c.rand() - 0.5) * (o.jitter || 0.08), (c.rand() - 0.5) * (o.jitter || 0.08), (c.rand() - 0.5) * (o.jitter || 0.08))),\n v,\n o,\n )\n }\n }\n kit.burst = burst\n /* Continuous emitter. p in c.vehicle (or in the vehicle world with o.world). kind: white|black|fire|exhaust (exhaust follows c.engineHealth) */\n kit.addEmitter = function (c: any, p: any, kind: any, o: any) {\n o = o || {}\n if (\n c.emitters.some(function (e: any) {\n return e.kind === kind && e.p.distanceTo(p) < 0.3\n })\n )\n return null\n const e = {\n p: p.clone(),\n kind: kind,\n world: !!o.world,\n rate: o.rate || (kind === 'fire' ? 14 : kind === 'exhaust' ? 7 : 6),\n acc: 0,\n s: o.s || 1,\n dir: o.dir || null,\n gap: 0,\n }\n c.emitters.push(e)\n return e\n }\n /* colour and opacity of the exhaust smoke by engine condition: 100% almost invisible, 60% grey, 30% dark grey, 10% black with misfires */\n function exhaustLook(h: any) {\n if (h >= 0.85) return ['#a7adb2', 0.05]\n if (h >= 0.45) return ['#7b8084', 0.2 + (0.85 - h) * 0.3]\n if (h >= 0.2) return ['#3f4245', 0.42]\n return ['#141414', 0.66]\n }\n kit.exhaustLook = exhaustLook\n function tickEmit(c: any, dt: any) {\n c.emitters.forEach(function (e: any) {\n if (e.kind === 'exhaust') {\n const h = c.engineHealth == null ? 1 : c.engineHealth\n if (h <= 0 || c.flipped || c.rollState) return\n if (h < 0.2) {\n e.gap -= dt\n if (e.gap < -0.5 && c.rand() < dt * 1.5) e.gap = 0.25 + c.rand() * 0.35\n if (e.gap > 0) return\n }\n }\n e.acc += e.rate * dt\n while (e.acc >= 1) {\n e.acc -= 1\n const p = e.world ? e.p.clone() : c.toEffects(e.p)\n if (e.kind !== 'exhaust') {\n p.x += (c.rand() - 0.5) * 0.15\n p.z += (c.rand() - 0.5) * 0.15\n }\n if (e.kind === 'fire') {\n kit.spawn(c, 'fire', p, new V3((c.rand() - 0.5) * 0.3, 1.1 + c.rand() * 0.8, (c.rand() - 0.5) * 0.3), {\n s: (0.45 + c.rand() * 0.45) * e.s,\n life: 0.55 + c.rand() * 0.35,\n })\n if (c.rand() < 0.45)\n kit.spawn(c, 'smoke', p.clone().add(new V3(0, 0.7 * e.s, 0)), new V3(0, 1.0, 0), { variant: 'black', s: 0.9 * e.s, life: 3.2 })\n if (c.rand() < 0.15)\n kit.spawn(\n c,\n 'spark',\n p.clone().add(new V3(0, 0.2, 0)),\n new V3((c.rand() - 0.5) * 0.6, 1.6 + c.rand(), (c.rand() - 0.5) * 0.6),\n { life: 0.9 },\n )\n } else if (e.kind === 'exhaust') {\n const lk = exhaustLook(c.engineHealth == null ? 1 : c.engineHealth)\n const d = e.dir ? c.dirToEffects(e.dir) : c.dirToEffects(new V3(-1, 0, 0))\n kit.spawn(c, 'smoke', p, d.multiplyScalar(1.1 + c.rand() * 0.4).add(new V3(0, 0.15, 0)), {\n col: lk[0],\n op: lk[1],\n s: 0.35 + c.rand() * 0.15,\n life: 1.4 + c.rand() * 0.5,\n })\n } else {\n const preta = e.kind === 'black'\n kit.spawn(\n c,\n 'smoke',\n p,\n new V3((c.rand() - 0.5) * 0.2, preta ? 0.9 + c.rand() * 0.3 : 1.1 + c.rand() * 0.3, (c.rand() - 0.5) * 0.2),\n { variant: preta ? 'black' : 'steam', s: (preta ? 0.75 : 0.6) * e.s * (0.8 + c.rand() * 0.4), life: preta ? 3.2 : 2.0 },\n )\n }\n }\n })\n }\n\n Object.assign(I, {\n PARTICLE_LIMIT,\n PARTICLE_GEOMETRIES,\n PARTICLE_MATERIALS,\n valueNoise,\n puffTexture,\n puffMaterial,\n SPRITE_TYPES,\n PUFF_COLORS,\n WIND,\n PARTICLE_LIFE,\n TRANSIENT_TYPES,\n killParticle,\n _q,\n _z,\n _t,\n tickParticles,\n burst,\n exhaustLook,\n tickEmit,\n })\n}\n","/** Fluid types (oil, stains, rain...) and the splat/puddle system. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installFluids(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { DOUBLE_SIDE } = I\n\n /* ================= fluids ================= */\n /* Splat fluid types. A game registers its own with kit.defineFluid(key, def) or configure({ fluids }).\n def: { fresh, dry (hex colours), dryTime (s until dry), roughFresh, roughDry, metalFresh, metalDry, wipeable (wiper/rain remove the fresh one) }\n Types without \"fresh\" (def.update(c, f, dt, i) returning true removes it) become fully custom fluids of the plugin. */\n kit.fluidTypes = {}\n kit.defineFluid = function (key: any, def: any) {\n const d = Object.assign({ dryTime: 600, roughFresh: 0.12, roughDry: 0.92, metalFresh: 0.15, metalDry: 0, wipeable: false }, def || {})\n d.key = key\n d.freshC = new THREE.Color(d.fresh || '#444444')\n d.dryC = new THREE.Color(d.dry || d.fresh || '#222222')\n kit.fluidTypes[key] = d\n return d\n }\n kit.defineFluid('stain', { fresh: '#4a4a44', dry: '#26241f', wipeable: false })\n const _fr = new THREE.Raycaster()\n /* Liquid splat: a flat stain glued to the surface, irregular outline, satellite drops and a trickle that runs down,\n thins and ends in a bulb. The trickle stops when the volume runs out. Glossy when fresh, dries matte in the fluid type's time.\n o: { fluid (key of kit.fluidTypes; default config.defaultSplat), glass, obj (mesh to attach to; the trickle follows its curve) } */\n kit.splat = function (c: any, p: any, n: any, r: any, o: any) {\n o = o || {}\n n = n.clone().normalize()\n const fdef = kit.fluidTypes[o.fluid || kit.config.defaultSplat] || kit.fluidTypes.stain\n const mat = new THREE.MeshStandardMaterial({\n color: fdef.freshC.clone(),\n roughness: fdef.roughFresh,\n metalness: fdef.metalFresh,\n side: DOUBLE_SIDE,\n polygonOffset: true,\n polygonOffsetFactor: -2,\n polygonOffsetUnits: -4,\n })\n const grp = new THREE.Group()\n grp.position.copy(p)\n c.vehicle.add(grp)\n const g = new V3(0, -1, 0).addScaledVector(n, n.y)\n if (g.lengthSq() < 1e-4) g.set(1, 0, 0)\n g.normalize()\n const side = new V3().crossVectors(g, n).normalize()\n const M = new THREE.Matrix4().makeBasis(g, n, side)\n grp.quaternion.setFromRotationMatrix(M)\n const rnd = c.rand\n const nz = I.valueNoise(Math.floor(rnd() * 1000))\n function blobShape(cx: any, cz: any, rr: any, k: any, ph: any) {\n const sh = new THREE.Shape()\n const N = 28\n for (let i = 0; i <= N; i++) {\n const a = (i / N) * PI * 2\n const q = rr * (0.72 + 0.42 * nz(Math.cos(a) * k + ph, Math.sin(a) * k + ph) + 0.12 * Math.max(0, Math.cos(a)))\n const x = cx + Math.cos(a) * q\n const y = cz + Math.sin(a) * q\n if (i === 0) sh.moveTo(x, y)\n else sh.lineTo(x, y)\n }\n return sh\n }\n const shapes = [blobShape(0, 0, r, 2.2, rnd() * 9)]\n const nsat = 4 + Math.floor(rnd() * 4)\n for (let i = 0; i < nsat; i++) {\n const a = rnd() * PI * 2\n const d = r * (1.15 + rnd() * 1.1)\n shapes.push(blobShape(Math.cos(a) * d, Math.sin(a) * d, r * (0.07 + rnd() * 0.12), 3, rnd() * 9))\n }\n const bg = new THREE.ShapeGeometry(shapes, 2)\n bg.rotateX(PI / 2)\n const blob = new THREE.Mesh(bg, mat)\n blob.castShadow = false\n blob.receiveShadow = true\n blob.position.y = 0.004\n grp.add(blob)\n /* trickle path: samples along the descent, glued to the surface by ray against the source mesh */\n const Lmax = r * (2.2 + rnd() * 2.2)\n const NS = 10\n const off = []\n c.root.updateMatrixWorld(true)\n for (let k = 0; k <= NS; k++) {\n const xl = r * 0.55 + (Lmax * k) / NS\n let h = 0.004\n if (o.obj && o.obj.isMesh && k > 0) {\n const lp = p.clone().addScaledVector(g, xl)\n const wo = lp.clone().addScaledVector(n, 0.2).applyMatrix4(c.vehicle.matrixWorld)\n const wd = n.clone().negate().transformDirection(c.vehicle.matrixWorld)\n _fr.set(wo, wd)\n _fr.far = 0.45\n const hit = _fr.intersectObject(o.obj, false)[0]\n if (hit) {\n const hl = hit.point.clone().applyMatrix4(new THREE.Matrix4().copy(c.vehicle.matrixWorld).invert())\n h = hl.sub(p).dot(n) + 0.004\n if (h < -0.15) h = off[k - 1]\n } else h = off[k - 1]\n }\n off.push(h)\n }\n const drip = new THREE.Mesh(new THREE.BufferGeometry(), mat)\n drip.castShadow = false\n grp.add(drip)\n const f = {\n kind: fdef.key,\n def: fdef,\n grp: grp,\n mat: mat,\n drip: drip,\n r: r,\n t: 0,\n onGlass: !!o.glass,\n Lmax: Lmax,\n off: off,\n len: -1,\n w0: r * (0.26 + rnd() * 0.1),\n }\n buildDrip(f, 0.02)\n c.fluids.push(f)\n return f\n }\n function buildDrip(f: any, L: any) {\n const pos = []\n const NS = 12\n const r = f.r\n const x0 = r * 0.55\n function hAt(x: any) {\n const u = clamp((x - x0) / f.Lmax, 0, 1) * (f.off.length - 1)\n const i = Math.min(f.off.length - 2, Math.floor(u))\n const t = u - i\n return f.off[i] + (f.off[i + 1] - f.off[i]) * t\n }\n let prev = null\n for (let k = 0; k <= NS; k++) {\n const t = k / NS\n const x = x0 - r * 0.25 + (L + r * 0.25) * t\n const hw = f.w0 * (1 - 0.72 * Math.pow(t, 0.7)) * (1 + 0.08 * Math.sin(t * 9 + r * 50))\n const y = hAt(x) + 0.0005\n const cur = [\n [x, y, -hw],\n [x, y, hw],\n ]\n if (prev)\n pos.push(\n prev[0][0],\n prev[0][1],\n prev[0][2],\n prev[1][0],\n prev[1][1],\n prev[1][2],\n cur[0][0],\n cur[0][1],\n cur[0][2],\n prev[1][0],\n prev[1][1],\n prev[1][2],\n cur[1][0],\n cur[1][1],\n cur[1][2],\n cur[0][0],\n cur[0][1],\n cur[0][2],\n )\n prev = cur\n }\n const bx = x0 + L + r * 0.02\n const by = hAt(bx) + 0.0008\n const rb = f.w0 * 0.62 * Math.min(1, 0.4 + L / (f.Lmax * 0.5))\n for (let q = 0; q < 14; q++) {\n const a0 = (q / 14) * PI * 2\n const a1 = ((q + 1) / 14) * PI * 2\n pos.push(bx, by, 0, bx + Math.cos(a1) * rb * 1.2, by, Math.sin(a1) * rb, bx + Math.cos(a0) * rb * 1.2, by, Math.sin(a0) * rb)\n }\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n g.computeVertexNormals()\n f.drip.geometry.dispose()\n f.drip.geometry = g\n f.len = L\n }\n /* Ground puddles: outline irregular by noise, lobes that advance towards the lower side and stop.\n oil: mirror-black centre, rainbow only on a thin edge with hue varying along it, never dries, drop that swells and makes a crown.\n diesel: like oil, lighter and slower, does not catch fire. gasoline: nearly transparent, darkens the asphalt ~45%, shimmering air, evaporates from the edge in 60 s. */\n const DOWNHILL = new V3(-0.55, 0, 0.83).normalize()\n const PN = 72\n function puddleGeometry() {\n const g = new THREE.BufferGeometry()\n const pos = new Float32Array((PN + 1) * 3)\n const nor = new Float32Array((PN + 1) * 3)\n const idx = []\n for (let i = 0; i <= PN; i++) nor[3 * i + 1] = 1\n for (let k = 0; k < PN; k++) idx.push(0, 1 + ((k + 1) % PN), 1 + k)\n g.setAttribute('position', new THREE.BufferAttribute(pos, 3))\n g.setAttribute('normal', new THREE.BufferAttribute(nor, 3))\n g.setIndex(idx)\n return g\n }\n function rimGeometry() {\n const g = new THREE.BufferGeometry()\n const pos = new Float32Array(PN * 2 * 3)\n const col = new Float32Array(PN * 2 * 3)\n const idx = []\n for (let k = 0; k < PN; k++) {\n const a = 2 * k\n const b = 2 * k + 1\n const c2 = 2 * ((k + 1) % PN)\n const d = c2 + 1\n idx.push(a, c2, b, b, c2, d)\n }\n g.setAttribute('position', new THREE.BufferAttribute(pos, 3))\n g.setAttribute('color', new THREE.BufferAttribute(col, 3))\n g.setIndex(idx)\n return g\n }\n function puddle(c: any, kind: any, pLocal: any, maxR: any) {\n const q = c.toEffects(pLocal)\n const oily = kind === 'oil' || kind === 'diesel'\n const mat =\n kind === 'oil'\n ? new THREE.MeshStandardMaterial({\n color: 0x050404,\n roughness: 0.04,\n metalness: 0.85,\n polygonOffset: true,\n polygonOffsetFactor: -1,\n polygonOffsetUnits: -2,\n })\n : kind === 'diesel'\n ? new THREE.MeshStandardMaterial({\n color: 0x15110a,\n roughness: 0.06,\n metalness: 0.6,\n transparent: true,\n opacity: 0.9,\n depthWrite: false,\n })\n : new THREE.MeshStandardMaterial({\n color: 0x000000,\n roughness: 0.03,\n metalness: 0.5,\n transparent: true,\n opacity: 0.45,\n depthWrite: false,\n })\n const m = new THREE.Mesh(puddleGeometry(), mat)\n m.position.set(q.x, kind === 'oil' ? 0.013 : 0.016, q.z)\n m.receiveShadow = true\n m.castShadow = false\n m.raycast = function () {}\n c.effects.add(m)\n const rnd = c.rand\n const lobes = []\n const nl = 5 + Math.floor(rnd() * 3)\n const down = Math.atan2(DOWNHILL.z, DOWNHILL.x)\n for (let i = 0; i < nl; i++) {\n const a = i < 2 ? down + (rnd() - 0.5) * 0.9 : rnd() * PI * 2\n const dh = Math.max(0, Math.cos(a - down))\n lobes.push({ a: a, w: 0.22 + rnd() * 0.3, amp: (0.1 + rnd() * 0.16) * (1 + 1.1 * dh), stop: 0.35 + rnd() * 0.65 })\n }\n const f: any = { kind: kind, m: m, t: 0, max: maxR, x0: q.x, z0: q.z, lobes: lobes, nz: I.valueNoise(Math.floor(rnd() * 999)), ph: rnd() * 10 }\n if (oily) {\n const rim = new THREE.Mesh(\n rimGeometry(),\n new THREE.MeshBasicMaterial({\n vertexColors: true,\n transparent: true,\n opacity: kind === 'oil' ? 0.55 : 0.4,\n blending: THREE.AdditiveBlending,\n depthWrite: false,\n }),\n )\n rim.position.set(q.x, m.position.y + 0.002, q.z)\n rim.raycast = function () {}\n c.effects.add(rim)\n f.rim = rim\n }\n if (kind === 'oil') {\n const drop = new THREE.Mesh(new THREE.SphereGeometry(0.02, 10, 8), I.PARTICLE_MATERIALS.droplet)\n drop.raycast = function () {}\n c.effects.add(drop)\n f.drop = drop\n f.dy0 = Math.max(0.15, q.y - 0.1)\n drop.position.set(q.x, f.dy0, q.z)\n const crown = new THREE.Mesh(\n new THREE.CylinderGeometry(1, 0.7, 1, 18, 1, true),\n new THREE.MeshStandardMaterial({\n color: 0x0b0908,\n roughness: 0.05,\n metalness: 0.7,\n transparent: true,\n opacity: 0,\n side: DOUBLE_SIDE,\n depthWrite: false,\n }),\n )\n crown.position.set(q.x, 0.02, q.z)\n crown.visible = false\n crown.raycast = function () {}\n c.effects.add(crown)\n f.crown = crown\n f.phase = 0\n } else if (kind === 'gasoline') {\n const haze = new THREE.Mesh(\n puddleGeometry(),\n new THREE.MeshBasicMaterial({ color: 0x9fb2be, transparent: true, opacity: 0.035, depthWrite: false, side: DOUBLE_SIDE }),\n )\n haze.position.set(q.x, 0.22, q.z)\n haze.raycast = function () {}\n c.effects.add(haze)\n f.haze = haze\n }\n f.R = new Float32Array(PN)\n shapePuddle(f)\n c.fluids.push(f)\n return f\n }\n kit.puddle = puddle\n function shapePuddle(f: any) {\n const t = f.t\n let g\n let evap = 1\n if (f.kind === 'gasoline') {\n g = f.max * (1 - Math.exp(-f.t * 1.4))\n } else if (f.kind === 'diesel') g = f.max * Math.min(1, Math.sqrt(f.t / 70))\n else g = f.max * Math.min(1, Math.sqrt(f.t / 40))\n const grow = f.kind === 'gasoline' ? clamp(t / 6, 0, 1) : clamp(t / (f.kind === 'diesel' ? 90 : 60), 0, 1)\n const pos = f.m.geometry.attributes.position\n for (let k = 0; k < PN; k++) {\n const a = (k / PN) * PI * 2\n let rr =\n 0.68 + 0.22 * f.nz(Math.cos(a) * 2.3 + f.ph, Math.sin(a) * 2.3 + f.ph) + 0.08 * f.nz(Math.cos(a) * 6 + 3, Math.sin(a) * 6 + 3)\n f.lobes.forEach(function (L: any) {\n const d = Math.atan2(Math.sin(a - L.a), Math.cos(a - L.a)) / L.w\n rr += L.amp * Math.exp(-d * d) * Math.min(1, grow / L.stop)\n })\n if (f.kind === 'gasoline' && t > 6) {\n /* evaporates from the edge: each stretch recedes at its own pace, the puddle vanishes in 60 s */\n const e = clamp((t - 6) / 54, 0, 1)\n evap = clamp(1 - e * (0.75 + 0.5 * f.nz(Math.cos(a) * 3 + 9, Math.sin(a) * 3 + 9)) - e * e * 0.4, 0, 1)\n rr *= evap\n }\n f.R[k] = g * rr\n pos.setXYZ(k + 1, Math.cos(a) * f.R[k], 0, Math.sin(a) * f.R[k])\n }\n pos.needsUpdate = true\n f.m.geometry.computeBoundingSphere()\n if (f.haze) {\n const hp = f.haze.geometry.attributes.position\n for (let j = 0; j < PN; j++) {\n const aa = (j / PN) * PI * 2\n const w = f.R[j] * (1 + 0.08 * Math.sin(t * 11 + j))\n hp.setXYZ(j + 1, Math.cos(aa) * w, 0.03 * Math.sin(t * 9 + j * 0.7), Math.sin(aa) * w)\n }\n hp.needsUpdate = true\n f.haze.geometry.computeBoundingSphere()\n }\n if (f.rim) {\n const rp = f.rim.geometry.attributes.position\n const rc = f.rim.geometry.attributes.color\n const col = new THREE.Color()\n for (let q = 0; q < PN; q++) {\n const an = (q / PN) * PI * 2\n const R = f.R[q]\n const band = Math.min(0.085, R * 0.16)\n rp.setXYZ(2 * q, Math.cos(an) * (R - band), 0, Math.sin(an) * (R - band))\n rp.setXYZ(2 * q + 1, Math.cos(an) * (R + 0.004), 0, Math.sin(an) * (R + 0.004))\n col.setHSL((an / PI + f.nz(Math.cos(an) * 4, Math.sin(an) * 4) * 0.8 + t * 0.01) % 1, 0.8, f.kind === 'oil' ? 0.5 : 0.36)\n rc.setXYZ(2 * q, 0, 0, 0)\n rc.setXYZ(2 * q + 1, col.r, col.g, col.b)\n }\n rp.needsUpdate = true\n rc.needsUpdate = true\n f.rim.geometry.computeBoundingSphere()\n }\n return evap\n }\n function updateFluids(c: any, dt: any) {\n for (let i = c.fluids.length - 1; i >= 0; i--) {\n const f = c.fluids[i]\n f.t += dt\n if (f.kind === 'gasoline') {\n shapePuddle(f)\n f.m.material.opacity = 0.45 * (f.t > 50 ? Math.max(0, (60 - f.t) / 10) : 1)\n if (f.t > 60) {\n c.effects.remove(f.m)\n c.effects.remove(f.haze)\n f.m.geometry.dispose()\n f.haze.geometry.dispose()\n c.fluids.splice(i, 1)\n }\n } else if (f.kind === 'oil' || f.kind === 'diesel') {\n if (f.t < 95 || (f.rimT = (f.rimT || 0) + dt) > 0.25) {\n f.rimT = 0\n shapePuddle(f)\n }\n if (f.drop) {\n /* the drop swells (0.9 s), detaches, falls and makes a crown when it hits the puddle */\n f.phase += dt\n const fall = Math.sqrt((2 * Math.max(0.05, f.dy0 - 0.015)) / 9.8)\n const cyc = 0.9 + fall + 0.5\n const ph = f.phase % cyc\n if (ph < 0.9) {\n const sw = 0.35 + (0.75 * ph) / 0.9\n f.drop.visible = true\n f.drop.position.y = f.dy0 - 0.01 * sw\n f.drop.scale.set(sw, sw * (1 + (0.5 * ph) / 0.9), sw)\n f.splashed = false\n } else if (ph < 0.9 + fall) {\n const tf = ph - 0.9\n f.drop.position.y = f.dy0 - 0.5 * 9.8 * tf * tf\n f.drop.scale.set(0.85, 1.5, 0.85)\n } else {\n f.drop.visible = false\n if (!f.splashed) {\n f.splashed = true\n f.crownT = 0\n for (let s = 0; s < 6; s++) {\n const a = (s / 6) * PI * 2 + c.rand()\n kit.spawn(\n c,\n 'droplet',\n new V3(f.x0 + Math.cos(a) * 0.02, 0.02, f.z0 + Math.sin(a) * 0.02),\n new V3(Math.cos(a) * 0.5, 0.9 + c.rand() * 0.4, Math.sin(a) * 0.5),\n { s: 0.5 + c.rand() * 0.4 },\n )\n }\n }\n }\n if (f.crownT != null) {\n f.crownT += dt\n const ct = f.crownT / 0.3\n if (ct < 1) {\n f.crown.visible = true\n f.crown.scale.set(0.015 + 0.05 * ct, 0.03 * Math.sin(ct * PI), 0.015 + 0.05 * ct)\n f.crown.position.y = 0.015 + f.crown.scale.y / 2\n f.crown.material.opacity = 0.9 * (1 - ct)\n } else {\n f.crown.visible = false\n f.crownT = null\n }\n }\n }\n } else if (f.def && f.def.update) {\n if (f.def.update(c, f, dt, i) === true) {\n c.fluids.splice(i, 1)\n }\n } else if (f.def) {\n const dry = Math.min(1, f.t / f.def.dryTime)\n f.mat.color.copy(f.def.freshC).lerp(f.def.dryC, dry)\n f.mat.roughness = f.def.roughFresh + dry * (f.def.roughDry - f.def.roughFresh)\n f.mat.metalness = f.def.metalFresh + (f.def.metalDry - f.def.metalFresh) * dry\n const L = f.Lmax * (1 - Math.exp(-f.t / 5))\n if (L - f.len > 0.004) buildDrip(f, L)\n }\n }\n }\n kit.updateFluids = updateFluids\n /* The wiper (glass only) and rain clean only fresh stains (less than half dry) of the types with wipeable. */\n kit.wipe = function (c: any, mode: any) {\n let n = 0\n for (let i = c.fluids.length - 1; i >= 0; i--) {\n const f = c.fluids[i]\n if (!f.def || !f.def.wipeable) continue\n if (f.t / f.def.dryTime < 0.5 && (mode === 'rain' || f.onGlass)) {\n if (f.grp.parent) f.grp.parent.remove(f.grp)\n c.fluids.splice(i, 1)\n n++\n }\n }\n return n\n }\n\n Object.assign(I, { _fr, buildDrip, DOWNHILL, PN, puddleGeometry, rimGeometry, puddle, shapePuddle, updateFluids })\n}\n","/** Glass cracks, shattering and tempered or laminated breakage textures. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installGlassDamage(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const document = kit.document\n const { DOUBLE_SIDE, MATERIALS, crease, cutGeometry, mergeGeometries, subdivide, tumble } = I\n\n /* ================= glass: cracks and shattering ================= */\n function glassUV(msh: any, pLocal: any) {\n const pos = msh.geometry.attributes.position\n const uv = msh.geometry.attributes.uv\n if (!uv) return [0.5, 0.5]\n const inv = new THREE.Matrix4().copy(msh.matrix).invert()\n const q = pLocal.clone().applyMatrix4(inv)\n let best = 1e9\n let bi = 0\n const v = new V3()\n for (let i = 0; i < pos.count; i++) {\n v.fromBufferAttribute(pos, i)\n const d = v.distanceToSquared(q)\n if (d < best) {\n best = d\n bi = i\n }\n }\n return [uv.getX(bi), uv.getY(bi)]\n }\n /* Crack web: thick opaque lines at the centre, thinning outward, with a dark outline so it reads from afar. */\n function drawWeb(x: any, cx: any, cy: any, s: any, ax: any, rnd: any) {\n const n = 16 + Math.floor(rnd() * 8)\n const spokes: any = []\n for (let i = 0; i < n; i++) {\n const a = (i / n) * PI * 2 + (rnd() - 0.5) * 0.35\n const L = (70 + rnd() * 95) * s\n const pts = [[cx, cy]]\n for (let k = 1; k <= 6; k++) {\n const aa = a + (rnd() - 0.5) * 0.28\n const rr = (L * k) / 6\n pts.push([cx + (Math.cos(aa) * rr) / ax, cy + Math.sin(aa) * rr])\n }\n spokes.push(pts)\n }\n x.lineCap = 'round'\n x.lineJoin = 'round'\n function seg(p: any, q: any, wd: any, col: any) {\n x.strokeStyle = col\n x.lineWidth = wd\n x.beginPath()\n x.moveTo(p[0], p[1])\n x.lineTo(q[0], q[1])\n x.stroke()\n }\n ;[\n ['rgba(8,12,14,0.55)', 2.2],\n ['rgba(244,248,250,0.97)', 0],\n ].forEach(function (pass: any) {\n spokes.forEach(function (pts: any) {\n for (let k = 1; k < pts.length; k++) {\n const t = k / pts.length\n seg(pts[k - 1], pts[k], Math.max(0.8, 4.2 * (1 - t) + 0.6) + pass[1], pass[0])\n }\n })\n for (let r = 1; r <= 4; r++) {\n x.lineWidth = Math.max(0.8, 2.6 - r * 0.45) + pass[1] * 0.6\n x.strokeStyle = pass[0]\n x.beginPath()\n spokes.forEach(function (sp: any, j: any) {\n const p = sp[Math.min(r, sp.length - 1)]\n const q = spokes[(j + 1) % spokes.length][Math.min(r, sp.length - 1)]\n if (rnd() < 0.8) {\n x.moveTo(p[0], p[1])\n x.quadraticCurveTo((p[0] + q[0]) / 2 + (rnd() - 0.5) * 6, (p[1] + q[1]) / 2 + (rnd() - 0.5) * 6, q[0], q[1])\n }\n })\n x.stroke()\n }\n })\n const gr = x.createRadialGradient(cx, cy, 0, cx, cy, 26 * s)\n gr.addColorStop(0, 'rgba(248,250,252,1)')\n gr.addColorStop(0.45, 'rgba(236,242,244,0.75)')\n gr.addColorStop(1, 'rgba(236,242,244,0)')\n x.fillStyle = gr\n x.beginPath()\n x.arc(cx, cy, 26 * s, 0, PI * 2)\n x.fill()\n }\n function crackGlass(c: any, msh: any, p: any, force: any, sc?: any) {\n const G = msh.userData.glass\n if (!G.cv) {\n G.cv = document.createElement('canvas')\n G.cv.width = G.cv.height = 256\n const x0 = G.cv.getContext('2d')\n x0.fillStyle = 'rgba(48,66,72,0.5)'\n x0.fillRect(0, 0, 256, 256)\n G.tex = new THREE.CanvasTexture(G.cv)\n msh.material = new THREE.MeshStandardMaterial({\n color: 0xffffff,\n map: G.tex,\n emissive: 0x6a7276,\n emissiveMap: G.tex,\n transparent: true,\n roughness: 0.25,\n metalness: 0.1,\n side: DOUBLE_SIDE,\n depthWrite: false,\n })\n }\n const uv = glassUV(msh, p)\n const x = G.cv.getContext('2d')\n drawWeb(x, uv[0] * 256, (1 - uv[1]) * 256, sc != null ? sc : 0.6 + force * 0.5, Math.max(0.4, G.aspect || 1), c.rand)\n G.tex.needsUpdate = true\n G.hits++\n }\n /* irregular edge attached to the frame for glass without an outline (cut from the shell): only the strip near the open edges remains */\n function glassRim(geo: any, rnd: any) {\n const src = geo.index ? geo.toNonIndexed() : geo\n const p = src.attributes.position\n const cnt: any = {}\n const toColor: any = []\n function key(i: any) {\n return Math.round(p.getX(i) * 1000) + ',' + Math.round(p.getY(i) * 1000) + ',' + Math.round(p.getZ(i) * 1000)\n }\n for (let f = 0; f < p.count; f += 3)\n for (let k = 0; k < 3; k++) {\n const a = f + k\n const b = f + ((k + 1) % 3)\n const ka = key(a)\n const kb = key(b)\n const e = ka < kb ? ka + '|' + kb : kb + '|' + ka\n if (!cnt[e]) cnt[e] = { n: 0, a: a, b: b }\n cnt[e].n++\n }\n Object.keys(cnt).forEach(function (e) {\n const q = cnt[e]\n if (q.n === 1) toColor.push([new V3().fromBufferAttribute(p, q.a), new V3().fromBufferAttribute(p, q.b)])\n })\n if (toColor.length < 3 || toColor.length > 900) return null\n const nz = I.valueNoise(Math.floor(rnd() * 999))\n const ab = new V3()\n const ap = new V3()\n const q2 = new V3()\n function dist(x: any, y: any, z: any) {\n let best = 1e9\n q2.set(x, y, z)\n for (let i = 0; i < toColor.length; i++) {\n const A = toColor[i][0]\n const B = toColor[i][1]\n ab.subVectors(B, A)\n ap.subVectors(q2, A)\n const t = clamp(ap.dot(ab) / (ab.lengthSq() || 1), 0, 1)\n ap.addScaledVector(ab, -t)\n const d = ap.lengthSq()\n if (d < best) best = d\n }\n return Math.sqrt(best)\n }\n const sub = subdivide(src, 0.03)\n const r = cutGeometry(sub, [\n {\n sdf: function (x: any, y: any, z: any) {\n return 0.02 + 0.07 * nz(x * 9 + z * 5, y * 9 + z * 3) * nz(x * 23, y * 23 + z * 17) - dist(x, y, z)\n },\n },\n ])\n if (!r.geo.attributes.position.count) return null\n return crease(r.geo, 60)\n }\n function shatterGlass(c: any, msh: any, force: any, dir: any) {\n const G = msh.userData.glass\n if (G.broken) return\n G.broken = true\n const cubesAt = []\n if (G.outline && G.T !== undefined) {\n const out = G.outline\n let cx = 0\n let cy = 0\n out.forEach(function (p: any) {\n cx += p.x\n cy += p.y\n })\n cx /= out.length\n cy /= out.length\n const shp = new THREE.Shape(\n out.map(function (p: any) {\n return new THREE.Vector2(p.x, p.y)\n }),\n )\n const hole = new THREE.Path()\n out.forEach(function (p: any, i: any) {\n const dx = cx - p.x\n const dy = cy - p.y\n const d = Math.hypot(dx, dy) || 1\n const k = Math.min(d * 0.45, 0.025 + c.rand() * (i % 3 === 0 ? 0.11 : 0.05))\n const q = [p.x + (dx / d) * k, p.y + (dy / d) * k]\n if (i === 0) hole.moveTo(q[0], q[1])\n else hole.lineTo(q[0], q[1])\n })\n shp.holes.push(hole)\n const geo = new THREE.ShapeGeometry(shp)\n geo.translate(0, 0, G.zpos + 0.004)\n tumble(geo, G.T)\n geo.computeVertexNormals()\n msh.geometry.dispose()\n msh.geometry = geo\n msh.material = MATERIALS.glassEdge\n let minx = 1e9\n let maxx = -1e9\n let miny = 1e9\n let maxy = -1e9\n out.forEach(function (p: any) {\n minx = Math.min(minx, p.x)\n maxx = Math.max(maxx, p.x)\n miny = Math.min(miny, p.y)\n maxy = Math.max(maxy, p.y)\n })\n for (let i = 0; i < 46; i++) {\n const x = minx + (maxx - minx) * (0.1 + c.rand() * 0.8)\n const y = miny + (maxy - miny) * (0.1 + c.rand() * 0.8)\n cubesAt.push(new V3(x, y, G.side * I.halfAt(G.Wg, G.T, y)))\n }\n } else {\n msh.geometry.computeBoundingBox()\n const bb = msh.geometry.boundingBox.clone().applyMatrix4(msh.matrix)\n const rim = glassRim(msh.geometry, c.rand)\n if (rim) {\n msh.geometry.dispose()\n msh.geometry = rim\n msh.material = MATERIALS.glassEdge\n } else msh.visible = false\n for (let j = 0; j < 36; j++)\n cubesAt.push(\n new V3(\n bb.min.x + (bb.max.x - bb.min.x) * c.rand(),\n bb.min.y + (bb.max.y - bb.min.y) * c.rand(),\n bb.min.z + (bb.max.z - bb.min.z) * c.rand(),\n ),\n )\n }\n const seatGeo: any = []\n const d = dir.clone().normalize()\n cubesAt.forEach(function (p, i) {\n if (i % 3 === 0 && c.seatTops.length && !c.rollState && !c.flipped) {\n let best: any = null\n let bd = 1e9\n c.seatTops.forEach(function (s: any) {\n const dd = Math.hypot(s.x - p.x, s.z - p.z)\n if (dd < bd) {\n bd = dd\n best = s\n }\n })\n if (best && bd < 1.6) {\n const g = new THREE.BoxGeometry(0.014, 0.014, 0.014)\n g.rotateY(c.rand() * 3)\n g.translate(best.x + (c.rand() - 0.5) * best.l * 0.8, best.y + 0.007, best.z + (c.rand() - 0.5) * best.w * 0.8)\n seatGeo.push(g)\n return\n }\n }\n const v = d\n .clone()\n .multiplyScalar(0.4 + force * c.rand() * 1.4)\n .add(new V3((c.rand() - 0.5) * 0.8, c.rand() * 0.6, (c.rand() - 0.5) * 0.8))\n kit.spawn(c, 'cube', c.toEffects(p), c.dirToEffects(v))\n })\n if (seatGeo.length) {\n const sm = new THREE.Mesh(mergeGeometries(seatGeo), I.PARTICLE_MATERIALS.cube)\n sm.castShadow = false\n c.vehicle.add(sm)\n }\n }\n function hitGlass(c: any, msh: any, p: any, dir: any, force: any) {\n const G = msh && msh.userData.glass\n if (!G || G.broken) return\n if (G.type === 'laminated') {\n crackGlass(c, msh, p, force)\n I.burst(c, 'shard', c.toEffects(p), 4 + Math.round(force * 4), { dir: c.dirToEffects(dir.clone().negate()), speed: 1.2 })\n } else shatterGlass(c, msh, force, dir)\n }\n kit.hitGlass = hitGlass\n function breakLight(c: any, L: any, dir: any) {\n if (!L || L.broken) return\n L.broken = true\n L.lens.forEach(function (m: any) {\n m.visible = false\n })\n L.inner.forEach(function (m: any) {\n m.material = MATERIALS.bulbBroken\n })\n ;(L.halo || []).forEach(function (h: any) {\n h.visible = false\n })\n const p = L.group ? L.group.position.clone() : L.inner[0] ? L.inner[0].position.clone() : new V3()\n I.burst(c, 'lens', c.toEffects(p), 10, { dir: c.dirToEffects(dir.clone().negate()), speed: 1.4, variant: L.tint === 'red' ? 'red' : 'clear' })\n I.burst(c, 'plastic', c.toEffects(p), 2, { dir: c.dirToEffects(dir.clone().negate()), speed: 1.0 })\n }\n kit.breakLight = breakLight\n\n Object.assign(I, { glassUV, drawWeb, crackGlass, glassRim, shatterGlass, hitGlass, breakLight })\n}\n","/** Impact resolution: direction, surface lookup, deformation, shards and sparks. */\nimport type { Kit } from './types'\nimport { clamp, hash, markDecal } from './util'\n\nexport function installImpact(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, DOUBLE_SIDE, crease, paintColor } = I\n\n /* ================= impact ================= */\n /* Dent field: smooth falloff (smoothstep), low-frequency ripple (<= 0.015), never crosses the centre plane. */\n function dentField(v: any, H: any) {\n const d = v.distanceTo(H.p)\n if (d >= H.R) return 0\n const t = 1 - d / H.R\n const f = t * t * (3 - 2 * t)\n const a = H.depth * f + 0.015 * f * Math.sin(v.x * 2.1 + v.z * 1.7 + H.ph) * Math.cos(v.y * 1.9)\n const lim = -((v.x - H.C.x) * H.dir.x + (v.y - H.C.y) * H.dir.y + (v.z - H.C.z) * H.dir.z) - 0.03\n return Math.max(0, Math.min(a, lim))\n }\n /* The bumper comes loose on the side of the hit and hangs from the other side (does not fly): the real part rotates around the attached end,\n without swapping the geometry, and the angle is limited so the loose end touches the ground without going through it (and does not become a pole on a tall vehicle). */\n function hangBumper(c: any, o: any, p: any) {\n if (!o || o.userData.hung || !o.parent || c.meta.noBumper) return\n o.userData.hung = true\n const di = c.deform.indexOf(o)\n if (di >= 0) c.deform.splice(di, 1)\n o.updateMatrix()\n o.geometry.computeBoundingBox()\n const bb = o.geometry.boundingBox.clone().applyMatrix4(o.matrix)\n const wz = (bb.max.z - bb.min.z) * 0.97\n const hh = (bb.max.y - bb.min.y) / 2\n if (wz < 0.2) return\n const att = p.z >= (bb.min.z + bb.max.z) / 2 ? -1 : 1\n const par = o.parent\n const sx = o.position.x >= 0 ? 1 : -1\n const zc = (bb.min.z + bb.max.z) / 2\n const piv = new THREE.Group()\n piv.position.set(o.position.x, o.position.y, zc + (att * wz) / 2)\n par.add(piv)\n par.remove(o)\n piv.add(o)\n o.position.set(0, 0, o.position.z - piv.position.z)\n piv.userData.rigid = true\n piv.userData.noFollow = true\n const drop = Math.max(0.0, piv.position.y - hh - 0.01)\n const th = Math.min(Math.asin(Math.min(0.98, drop / wz)), 0.42)\n piv.rotation.x = -att * th\n piv.rotation.y = -0.1 * sx * att\n }\n /* fuel of the tank that was hit: the part label wins (\"diesel\"), otherwise the vehicle sheet */\n function tankFuel(c: any, pt: any) {\n const lb = (pt.label || '').toLowerCase()\n const fu = c.spec && c.spec.fuel\n if (pt.fuel === 'diesel' || kit.matchers.diesel.test(lb)) return 'diesel'\n if ((pt.fuel === 'gasoline' || kit.matchers.fuel.test(lb)) && fu !== 'diesel') return 'gasoline'\n return fu === 'diesel' ? 'diesel' : fu === 'electric' || fu === 'none' ? null : 'gasoline'\n }\n function hurtEngine(c: any, h: any) {\n c.engineHealth = Math.min(c.engineHealth == null ? 1 : c.engineHealth, h)\n }\n kit.hurtEngine = hurtEngine\n function igniteFuel(c: any, pd: any) {\n if (!pd || pd.kind !== 'gasoline' || pd.fire) return\n pd.fire = true\n for (let k = 0; k < 3; k++) {\n const a = (k / 3) * PI * 2 + c.rand()\n const r = pd.max * 0.35 * c.rand()\n kit.addEmitter(c, new V3(pd.x0 + Math.cos(a) * r, 0.05, pd.z0 + Math.sin(a) * r), 'fire', { world: true, rate: 9, s: 1.2 })\n }\n I.burst(c, 'spark', new V3(pd.x0, 0.1, pd.z0), 14, { speed: 2.5 })\n }\n kit.igniteFuel = igniteFuel\n function applyPart(c: any, pt: any, force: any, dir: any, p: any) {\n const k = pt.kind\n const o = pt.obj\n const m = c.meta\n if (pt.onHit) return pt.onHit(c, pt, force, dir, p)\n if (k === 'headlight' || k === 'taillight') I.breakLight(c, pt.light, dir)\n else if (k === 'glass') I.hitGlass(c, o, p, dir, force)\n else if (k === 'wheel') {\n if (o && !o.userData.flat) {\n o.userData.flat = true\n o.scale.y = 0.74\n o.position.y -= o.userData.r * 0.24\n o.rotation.y += (hash(o.position.x, 1, 1) - 0.5) * 0.25\n }\n } else if (k === 'bumper') {\n if (o && force > 0.6) hangBumper(c, o, p)\n } else if (k === 'radiator') {\n kit.addEmitter(c, pt.pos.clone().add(new V3(-0.1, 0.25, 0)), 'white')\n hurtEngine(c, 0.6)\n } else if (k === 'engine') {\n kit.addEmitter(c, pt.pos.clone().add(new V3(0, 0.3, 0)), 'black')\n hurtEngine(c, force > 1.1 ? 0.1 : 0.3)\n if (c.hood && force > 0.5 && !c.hood.noLatch) {\n c.hood.latch = Math.max(c.hood.latch, 0.15)\n }\n if (m.kind !== 'boat' && m.kind !== 'plane' && m.kind !== 'heli')\n I.puddle(c, 'oil', pt.pos.clone().setY(Math.max(0.2, m.clearance || 0.3)), 0.55 + force * 0.25)\n } else if (k === 'hood') {\n if (c.hood && force > 0.4 && !c.hood.noLatch) c.hood.latch = Math.max(c.hood.latch, 0.15)\n } else if (k === 'fuel_tank') {\n const fu = tankFuel(c, pt)\n if (m.kind !== 'boat' && fu) {\n const pd = I.puddle(c, fu, pt.pos, (fu === 'diesel' ? 1.0 : 0.9) + force * 0.7)\n if (fu === 'gasoline' && force >= 1.0) igniteFuel(c, pd)\n }\n if (fu === 'gasoline' && force >= 1.0) kit.blastDamage(c, force * 180)\n } else if (k === 'battery') {\n kit.addEmitter(c, pt.pos.clone().add(new V3(0, 0.15, 0)), 'fire')\n kit.addEmitter(c, pt.pos.clone().add(new V3(0, 0.7, 0)), 'black', { rate: 3 })\n } else if (k === 'hull') {\n c.sunk = Math.max((c.sunk || 0) - 0.3 * force, -(m.belt || 0.5) * 0.45)\n c.vehicle.rotation.x += 0.06 * force\n I.burst(c, 'water', c.toEffects(p).setY(0.05), 20, { speed: 2.5 })\n } else if (k === 'armor') {\n I.burst(c, 'spark', c.toEffects(p), 18, { dir: c.dirToEffects(dir.clone().negate()), speed: 3.5, spread: 1.5 })\n } else if (k === 'stern') {\n if (o) {\n o.rotation.z = 0.5\n o.position.y -= 0.1\n }\n } else if (k === 'propeller' || k === 'rotor' || k === 'tail_rotor') {\n if (o) {\n o.children.forEach(function (ch: any, i: any) {\n if (ch.type === 'Group') {\n ch.rotation.z += -0.15 - hash(i, 1, 1) * 0.25\n ch.rotation.x += i % 2 ? 0.2 : -0.2\n }\n })\n c.spin = c.spin.filter(function (s: any) {\n return s.o !== o\n })\n }\n } else if (k === 'landing_gear') {\n c.vehicle.rotation.x += (m.kind === 'plane' ? 0.2 : 0.13) * (pt.pos.z < 0 ? -1 : 1)\n c.vehicle.position.y -= 0.12\n }\n }\n kit.applyPart = applyPart\n const SCRATCH_MATERIAL = makeMaterial('#9da3a6', { metalness: 0.85, roughness: 0.35 })\n const SOOT_MATERIAL = makeMaterial('#141312', {\n roughness: 1,\n transparent: true,\n opacity: 0.38,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -1,\n polygonOffsetUnits: -2,\n })\n const _ray = new THREE.Raycaster()\n function findSurface(c: any, p: any, dir: any) {\n c.root.updateMatrixWorld(true)\n const Mw = c.vehicle.matrixWorld\n const o = p.clone().addScaledVector(dir, -1.2).applyMatrix4(Mw)\n const d = dir.clone().transformDirection(Mw)\n _ray.set(o, d)\n _ray.far = 1.2 + 0.45\n const hits = _ray.intersectObject(c.vehicle, true)\n for (let i = 0; i < hits.length; i++) {\n const h = hits[i]\n const ob = h.object\n let vis = true\n for (let q = ob; q && q !== c.vehicle; q = q.parent)\n if (!q.visible) {\n vis = false\n break\n }\n if (!vis || ob.userData.decal || ob.userData.ghost || !h.face) continue\n const inv = new THREE.Matrix4().copy(Mw).invert()\n const lp = h.point.clone().applyMatrix4(inv)\n const n = h.face.normal.clone().transformDirection(ob.matrixWorld).transformDirection(inv)\n if (n.dot(dir) > 0) n.negate()\n return { p: lp, n: n, obj: ob }\n }\n return null\n }\n function scratches(c: any, p: any, dir: any, force: any) {\n const d = dir.clone().normalize()\n const t1 = new V3().crossVectors(d, Math.abs(d.y) > 0.9 ? new V3(1, 0, 0) : new V3(0, 1, 0)).normalize()\n const t2 = new V3().crossVectors(d, t1)\n const q = new THREE.Quaternion().setFromUnitVectors(new V3(1, 0, 0), t1)\n const n = 3 + Math.round(force * 3)\n for (let i = 0; i < n; i++) {\n const a = hash(p.x * 7 + i, p.y * 5, p.z * 3) - 0.5\n const b = hash(i, p.x * 3, p.z * 7) - 0.5\n const len = 0.22 + force * 0.3 * hash(i, 9, p.y)\n const m = c.add(new THREE.BoxGeometry(len, 0.01, 0.005), SCRATCH_MATERIAL, 0, 0, 0)\n m.castShadow = false\n m.userData.decal = true\n m.position\n .copy(p)\n .addScaledVector(t1, a * 0.5)\n .addScaledVector(t2, b * 0.35)\n .addScaledVector(d, -0.008)\n m.quaternion.copy(q)\n m.rotation.z += (a - b) * 0.25\n }\n const sr = 0.12 + force * 0.1\n const ss = new THREE.Shape()\n const nzs = I.valueNoise(Math.floor(hash(p.x, p.y, p.z) * 997))\n for (let k = 0; k <= 20; k++) {\n const an = (k / 20) * PI * 2\n const rr = sr * (0.6 + 0.6 * nzs(Math.cos(an) * 2 + 5, Math.sin(an) * 2 + 5))\n ss[k ? 'lineTo' : 'moveTo'](Math.cos(an) * rr * 1.3, Math.sin(an) * rr)\n }\n const soot = c.add(new THREE.ShapeGeometry(ss), SOOT_MATERIAL, 0, 0, 0)\n soot.castShadow = false\n soot.userData.decal = true\n soot.position.copy(p).addScaledVector(d, -0.005)\n soot.lookAt(soot.position.clone().sub(d))\n }\n /* Impact at point p (c.vehicle coordinates), direction dir (into the vehicle), force 0.3..1.4. Returns the parts hit. */\n function impact(c: any, p: any, dir: any, force: any, opts?: any) {\n opts = opts || {}\n dir = dir.clone().normalize()\n const m = c.meta\n const air = m.kind === 'plane' || m.kind === 'heli'\n const Wref = air ? m.fuselageWidth || 1.3 : m.width || 1.7\n const R0 = (0.55 + 0.45 * force) * (air ? 1.25 : 1)\n /* depth: up to 18% of the width, never more than 0.3 m nor 35% of the dent radius; meta.stiff (0..1) hardens armour */\n const maxD = Math.min(0.18 * Wref, 0.26, R0 * 0.32, opts.maxDepth || 9) * (1 - 0.85 * clamp(m.stiff || 0, 0, 1))\n const H = {\n p: p,\n dir: dir,\n R: R0,\n depth: Math.min(maxD, (0.04 + 0.15 * force) * (1 - 0.85 * clamp(m.stiff || 0, 0, 1))),\n ph: hash(p.x, p.y, p.z) * 6,\n C: new V3(((m.front || 1) + (m.rear || -1)) / 2, (m.clearance || 0.3) + (m.bodyHeight || 0.6) * 0.5, 0),\n }\n c.root.updateMatrixWorld(true)\n const gInv = new THREE.Matrix4().copy(c.vehicle.matrixWorld).invert()\n const rel = new THREE.Matrix4()\n const irel = new THREE.Matrix4()\n const v = new V3()\n const v0 = new V3()\n const w = new V3()\n const sc = new V3()\n const cab = m.cabin && !c.flipped && !c.rollState ? m.cabin : null\n c.deform.forEach(function (msh: any) {\n if (!msh.parent || !msh.visible) return\n rel.multiplyMatrices(gInv, msh.matrixWorld)\n const g = msh.geometry\n const pos = g.attributes.position\n let changed = false\n if (!g.boundingSphere) g.computeBoundingSphere()\n sc.setFromMatrixScale(rel)\n v.copy(g.boundingSphere.center).applyMatrix4(rel)\n if (v.distanceTo(p) > H.R + g.boundingSphere.radius * Math.max(sc.x, sc.y, sc.z)) return\n irel.copy(rel).invert()\n if (!g.userData.p0) g.userData.p0 = new Float32Array(pos.array)\n const p0 = g.userData.p0\n for (let i = 0; i < pos.count; i++) {\n v.fromBufferAttribute(pos, i).applyMatrix4(rel)\n const a = dentField(v, H)\n if (a <= 0) continue\n v.addScaledVector(dir, a)\n v0.set(p0[3 * i], p0[3 * i + 1], p0[3 * i + 2]).applyMatrix4(rel)\n w.subVectors(v, v0)\n if (w.length() > maxD) v.copy(v0).add(w.setLength(maxD))\n /* the bodywork does not enter the cabin: it stops at the outer face of the liner (meta.cabin) */\n if (cab && v0.x > cab.x0 && v0.x < cab.x1 && v0.y > cab.y0 && v0.y < cab.y1 && Math.abs(v0.z) >= cab.z && Math.abs(v.z) < cab.z)\n v.z = (v0.z > 0 ? 1 : -1) * cab.z\n v.applyMatrix4(irel)\n pos.setXYZ(i, v.x, v.y, v.z)\n changed = true\n }\n if (changed) {\n pos.needsUpdate = true\n if (g.userData.crease) crease(g, 42)\n else g.computeVertexNormals()\n g.computeBoundingSphere()\n g.computeBoundingBox()\n }\n })\n const dset = new Set(c.deform)\n const box = new THREE.Box3()\n c.vehicle.children.forEach(function (o: any) {\n if (dset.has(o) || o.userData.noFollow) return\n if (!(o.isMesh || (o.isGroup && o.userData.rigid))) return\n if (!o.userData.c0) {\n if (o.isMesh) {\n if (!o.geometry.boundingSphere) o.geometry.computeBoundingSphere()\n o.userData.c0 = o.geometry.boundingSphere.center.clone().applyMatrix4(o.matrix)\n if (!o.geometry.boundingBox) o.geometry.computeBoundingBox()\n o.userData.bb0 = o.geometry.boundingBox.clone().applyMatrix4(o.matrix)\n } else {\n box.setFromObject(o)\n box.applyMatrix4(gInv)\n o.userData.c0 = box.getCenter(new V3())\n o.userData.bb0 = box.clone()\n }\n o.userData.pos0 = o.position.clone()\n }\n const sh = new V3().subVectors(o.position, o.userData.pos0)\n let cen = o.userData.c0.clone().add(sh)\n const bb0 = o.userData.bb0\n /* thin panel along the impact direction (door liner, trim, plate): follows the dent from the point nearest the impact, so it does not stick out of the bodywork */\n if (bb0) {\n const ext = new V3().subVectors(bb0.max, bb0.min)\n if (Math.abs(ext.x * dir.x) + Math.abs(ext.y * dir.y) + Math.abs(ext.z * dir.z) < 0.1) {\n const bq = bb0.clone().translate(sh)\n cen = bq.clampPoint(p, new V3())\n }\n }\n const a = dentField(cen, H)\n if (a <= 0) return\n o.position.addScaledVector(dir, a)\n w.subVectors(o.position, o.userData.pos0)\n if (w.length() > maxD) o.position.copy(o.userData.pos0).add(w.setLength(maxD))\n })\n const hit: any = []\n c.parts.forEach(function (pt: any) {\n if (pt.done) return\n if (pt.pos.distanceTo(p) < H.R * pt.reach + 0.1) {\n pt.done = true\n applyPart(c, pt, force, dir, p)\n hit.push(pt)\n }\n })\n const pf = c.toEffects(p)\n const df = c.dirToEffects(dir.clone().negate())\n if (!opts.noFx) {\n if (m.kind === 'boat' && p.y < (m.belt || 0.5))\n I.burst(c, 'water', pf.clone().setY(Math.max(0.05, pf.y)), 18, { dir: df, speed: 2.2 })\n else I.burst(c, 'spark', pf, Math.round(8 + force * 16), { dir: df, speed: 2.5 + force * 2, spread: 1.4, jitter: 0.05 })\n if (force > 0.6) {\n I.burst(c, 'scrap', pf, Math.round(force * 5), {\n dir: df,\n speed: 1.4,\n mat: makeMaterial(paintColor(m.color || '#777', c.state), { roughness: 0.5, metalness: 0.3, side: DOUBLE_SIDE }),\n })\n I.burst(c, 'plastic', pf, 2, { dir: df, speed: 1.2 })\n }\n }\n /* stain (config.impactStain) and scratches only where there is bodywork (bikes and motorcycles are hollow) */\n const surf = findSurface(c, p, dir)\n if (surf) {\n if (kit.config.impactStain && !opts.noStain && force > 0.45 && !air && m.kind !== 'boat') {\n const sp = surf.p.clone().addScaledVector(surf.n, 0.002)\n markDecal(\n kit.splat(c, sp, surf.n, 0.08 + force * 0.04, {\n fluid: kit.config.impactStain,\n obj: surf.obj,\n glass: !!(surf.obj && surf.obj.userData.glass),\n }).grp,\n )\n }\n scratches(c, surf.p, surf.n.clone().negate(), force)\n }\n hit.forEach(function (pt: any) {\n c.log.push(pt)\n })\n return hit\n }\n kit.impact = impact\n /* Effect text per part kind (crash report). Empty in the SDK; the game plugin fills it (configure({ partEffects })). */\n kit.partEffects = {}\n /* ray in c.vehicle coordinates against the visible meshes of the vehicle (no decals); returns the first point */\n const _pr = new THREE.Raycaster()\n function probe(c: any, o: any, d: any, far: any) {\n c.root.updateMatrixWorld(true)\n const Mw = c.vehicle.matrixWorld\n const inv = new THREE.Matrix4().copy(Mw).invert()\n _pr.set(o.clone().applyMatrix4(Mw), d.clone().transformDirection(Mw))\n _pr.far = far || 10\n const hits = _pr.intersectObject(c.vehicle, true)\n for (let i = 0; i < hits.length; i++) {\n const h = hits[i]\n const ob = h.object\n let ok = !!h.face\n for (let q = ob; ok && q && q !== c.vehicle; q = q.parent) if (!q.visible || q.userData.decal || q.userData.ghost) ok = false\n if (ok) return { p: h.point.clone().applyMatrix4(inv), obj: ob }\n }\n return null\n }\n kit.probe = probe\n function zoneImpact(c: any, zone: any, force: any) {\n const m = c.meta\n const mid = m.clearance + (m.bodyHeight || 0.6) * 0.5\n let p\n let dir\n const land = m.kind !== 'plane' && m.kind !== 'heli' && m.kind !== 'boat'\n if (zone === 'rolled') {\n kit.roll(c, 1)\n return []\n }\n if (zone === 'front') {\n p = new V3(m.front, mid, m.width * 0.15)\n dir = new V3(-1, 0, 0)\n } else if (zone === 'rear') {\n p = new V3(m.rear, mid, -m.width * 0.15)\n dir = new V3(1, 0, 0)\n } else if (zone === 'left') {\n p = new V3((m.front + m.rear) * 0.5 + m.length * 0.12, mid + 0.1, -m.width / 2)\n dir = new V3(0, 0, 1)\n } else {\n p = new V3((m.front + m.rear) * 0.5 - m.length * 0.1, mid + 0.1, m.width / 2)\n dir = new V3(0, 0, -1)\n }\n if (m.kind === 'plane' && (zone === 'left' || zone === 'right')) {\n p.set(0.2, m.top - 0.1, (zone === 'left' ? -1 : 1) * 4.2)\n dir.set(0, -0.6, 0)\n }\n if ((m.kind === 'plane' || m.kind === 'heli') && (zone === 'left' || zone === 'right') && m.fuselageWidth) {\n if (m.kind === 'heli') p.z = ((zone === 'left' ? -1 : 1) * m.fuselageWidth) / 2\n }\n if (m.kind === 'boat' && (zone === 'left' || zone === 'right')) p.y = m.belt - 0.2\n if (land && (zone === 'left' || zone === 'right') && !m.zoneFixed) {\n /* height from the real bodywork: buses and trucks aim between the belt line and the roof (windows); the others, at mid side.\n Tries several heights and keeps the first that finds bodywork on the outside. */\n const sd = zone === 'left' ? -1 : 1\n const tall = m.kind === 'bus' || m.kind === 'truck' || (m.belt > 1.5 && m.top - m.belt > 0.9)\n const yPref = tall ? m.belt + (m.top - m.belt) * 0.3 : mid + 0.1\n const ys = []\n for (let y = Math.max(0.12, m.clearance * 0.6); y < m.top - 0.04; y += 0.07) ys.push(y)\n ys.sort(function (a, b) {\n return Math.abs(a - yPref) - Math.abs(b - yPref)\n })\n for (let k = 0; k < ys.length; k++) {\n const h = probe(c, new V3(p.x, ys[k], sd * (m.width / 2 + 3)), new V3(0, 0, -sd), 3 + m.width * 0.45)\n if (h && Math.abs(h.p.z) > m.width * 0.22 && !(h.obj.parent && h.obj.parent.userData.r && c.wheels.indexOf(h.obj.parent) >= 0)) {\n p = h.p\n break\n }\n }\n }\n const hit = impact(c, p, dir, force)\n if (zone === 'front' && force > 0.7 && land) {\n /* a hard frontal impact cracks the windshield from its base (the body hits the glass) */\n const ws = c.parts.find(function (pt: any) {\n return (\n pt.kind === 'glass' &&\n !pt.done &&\n (pt.key ? pt.key === 'windshield' : kit.matchers.windshield.test(pt.label)) &&\n pt.obj &&\n pt.obj.userData.glass &&\n pt.obj.userData.glass.type === 'laminated'\n )\n })\n if (ws) {\n const g = ws.obj\n g.geometry.computeBoundingBox()\n const bb = g.geometry.boundingBox.clone().applyMatrix4(g.matrix)\n const pb = new V3(\n bb.max.x - (bb.max.x - bb.min.x) * 0.25,\n bb.min.y + (bb.max.y - bb.min.y) * 0.28,\n (bb.min.z + bb.max.z) / 2 + (bb.max.z - bb.min.z) * 0.18,\n )\n ws.done = true\n I.hitGlass(c, g, pb, new V3(-1, -0.2, 0), force * 0.9)\n hit.push(ws)\n c.log.push(ws)\n }\n }\n return hit\n }\n kit.zoneImpact = zoneImpact\n\n Object.assign(I, {\n dentField,\n hangBumper,\n tankFuel,\n hurtEngine,\n igniteFuel,\n applyPart,\n SCRATCH_MATERIAL,\n SOOT_MATERIAL,\n _ray,\n findSurface,\n scratches,\n impact,\n _pr,\n probe,\n zoneImpact,\n })\n}\n","/** Fuel tank explosion, fireball, flying debris and burnt-out state. */\nimport type { Kit } from './types'\n\nexport function installExplosion(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, DOUBLE_SIDE, MATERIALS, paintColor, textTexture } = I\n\n /* ================= explosion ================= */\n /* Chain: the engine catches fire with black smoke (3 to 8 s), the vehicle jumps ~1.5 m, hood, doors, trunk and a wheel fly off with a fire trail,\n the glass bursts into shards and the burnt-out shell is left with a low fire. Fuel tank explosion damage: > 200 fire, > 400 explodes in 0.6 s.\n The tanker truck (meta.bigBlast) makes a gas station tank explosion: lethal radius 12 m, injury radius 30 m, 16 m mushroom cloud. */\n const BURNT = ['#1d1a17', '#26211c', '#171514', '#2e2620'].map(function (h, i) {\n return makeMaterial(h, { roughness: 1, metalness: i === 3 ? 0.35 : 0.15 })\n })\n const BURNT_RUB = makeMaterial('#0b0b0b', { roughness: 1 })\n function boomMat(hex: any, op: any, add?: any) {\n return new THREE.MeshBasicMaterial({\n color: new THREE.Color(hex),\n transparent: true,\n opacity: op,\n depthWrite: false,\n side: DOUBLE_SIDE,\n fog: false,\n blending: add ? THREE.AdditiveBlending : THREE.NormalBlending,\n })\n }\n function enginePos(c: any) {\n const mot = c.parts.find(function (p: any) {\n return p.kind === 'engine'\n })\n if (mot) return mot.pos.clone()\n const m = c.meta\n return new V3(m.front - 0.6, (m.clearance || 0.3) + 0.3, 0)\n }\n kit.explode = function (c: any, o: any) {\n o = o || {}\n if (c.blast || c.exploded) return false\n const fuse = o.now ? 0 : o.delay != null ? o.delay : 3 + c.rand() * 5\n c.blast = { phase: 'fire', t: 0, T: fuse }\n if (fuse > 0) {\n const ep = enginePos(c)\n kit.addEmitter(c, ep.clone().add(new V3(0, 0.25, 0)), 'fire', { rate: 10, s: 0.9 })\n kit.addEmitter(c, ep.clone().add(new V3(0, 0.6, 0)), 'black', { rate: 6, s: 1.2 })\n I.hurtEngine(c, 0.1)\n }\n if (c.hood) c.hood.target = 0\n return fuse\n }\n /* explosion damage on the tank (sum). Returns \"fire\", \"explosion\" or null */\n kit.blastDamage = function (c: any, amount: any) {\n c.tankDamage = (c.tankDamage || 0) + amount\n if (c.tankDamage > 400 && !c.exploded && (!c.blast || c.blast.phase === 'fire')) {\n c.blast = { phase: 'fire', t: 0, T: 0.6 }\n return 'explosion'\n }\n if (c.tankDamage > 200 && !c.tankFire) {\n c.tankFire = true\n const tk = c.parts.find(function (p: any) {\n return p.kind === 'fuel_tank'\n })\n const tp = tk ? tk.pos.clone() : enginePos(c)\n kit.addEmitter(c, tp.clone().setY(Math.max(0.15, tp.y)), 'fire', { rate: 12, s: 1.1 })\n kit.addEmitter(c, tp.clone().setY(tp.y + 0.8), 'black', { rate: 5, s: 1.4 })\n return 'fire'\n }\n return null\n }\n function fling(c: any, obj: any, v: any, w: any) {\n if (!obj || !obj.parent) return null\n c.root.updateMatrixWorld(true)\n const bb = new THREE.Box3().setFromObject(obj)\n if (bb.isEmpty()) return null\n const cen = bb.getCenter(new V3())\n const holder = new THREE.Group()\n c.root.worldToLocal(cen)\n holder.position.copy(cen)\n c.effects.add(holder)\n c.effects.updateMatrixWorld(true)\n holder.attach(obj)\n const sz = bb.getSize(new V3())\n const piece = { o: holder, v: v, w: w, r: Math.max(0.08, Math.min(sz.x, sz.y, sz.z) * 0.5 + 0.02), landed: false, trail: 2.2 }\n c.flying = c.flying || []\n c.flying.push(piece)\n obj.traverse(function (x: any) {\n x.userData.noFollow = true\n })\n const di = c.deform.indexOf(obj)\n if (di >= 0) c.deform.splice(di, 1)\n return piece\n }\n function burnAll(c: any) {\n let i = 0\n c.vehicle.traverse(function (o: any) {\n if (o.isSprite) {\n o.visible = false\n return\n }\n if (!o.isMesh || o.userData.decal) return\n const mt = o.material\n if (!mt || Array.isArray(mt)) return\n if (mt === MATERIALS.rubber) {\n o.material = BURNT_RUB\n return\n }\n if (mt.transparent && mt.opacity < 0.7) {\n if (!o.userData.glass) o.visible = false\n return\n }\n o.material = BURNT[i++ % BURNT.length]\n })\n c.lights.forEach(function (L: any) {\n L.broken = true\n L.lens.forEach(function (m: any) {\n m.visible = false\n })\n ;(L.halo || []).forEach(function (h: any) {\n h.visible = false\n })\n })\n }\n function bigBoomFx(c: any) {\n const g = new THREE.Group()\n c.effects.add(g)\n c.bigFx = { g: g, t: 0, rings: [], col: [] }\n ;[\n [12, '#d8322a', kit.t('blast.lethal', { m: 12 })],\n [30, '#e0a548', kit.t('blast.injury', { m: 30 })],\n ].forEach(function (r: any) {\n const ring = new THREE.Mesh(new THREE.RingGeometry(r[0] - 0.25, r[0], 96), boomMat(r[1], 0.85))\n ring.rotation.x = -PI / 2\n ring.position.y = 0.06\n ring.renderOrder = 5\n g.add(ring)\n const fill = new THREE.Mesh(new THREE.CircleGeometry(r[0], 96), boomMat(r[1], 0.07))\n fill.rotation.x = -PI / 2\n fill.position.y = 0.05\n g.add(fill)\n const lb = new THREE.Mesh(\n new THREE.PlaneGeometry(r[0] * 0.45, r[0] * 0.08),\n new THREE.MeshBasicMaterial({\n map: textTexture(r[2], { w: 1024, h: 160, fg: r[1], size: 0.62 }),\n transparent: true,\n depthWrite: false,\n fog: false,\n }),\n )\n lb.rotation.x = -PI / 2\n lb.position.set(0, 0.08, r[0] + r[0] * 0.06)\n g.add(lb)\n c.bigFx.rings.push(ring, fill, lb)\n })\n }\n function detonate(c: any) {\n const m = c.meta\n const B = c.blast\n const ep = enginePos(c)\n const cen = c.toEffects(new V3(((m.front || 1) + (m.rear || -1)) / 2, (m.clearance || 0.3) + (m.bodyHeight || 0.6) * 0.5, 0))\n const big = !!m.bigBlast\n B.phase = 'flight'\n B.t = 0\n B.vy = Math.sqrt(2 * 9.8 * (big ? 1.0 : 1.5))\n B.y0 = c.vehicle.position.y\n B.rx = (c.rand() - 0.5) * 0.5\n B.rz = (c.rand() - 0.5) * 0.35\n c.exploded = true\n c.engineHealth = 0\n c.emitters = c.emitters.filter(function (e: any) {\n return e.kind !== 'exhaust'\n })\n /* flash, fireball, smoke, shock wave on the ground */\n const fl = new THREE.Sprite(\n new THREE.SpriteMaterial({\n map: I.glowTexture(),\n color: 0xffd9a0,\n blending: THREE.AdditiveBlending,\n transparent: true,\n depthWrite: false,\n fog: false,\n }),\n )\n fl.raycast = function () {}\n fl.position.copy(cen)\n fl.scale.setScalar(0.1)\n c.effects.add(fl)\n B.flash = fl\n const sw = new THREE.Mesh(new THREE.RingGeometry(0.8, 1, 64), boomMat('#ffcf8a', 0.6, true))\n sw.rotation.x = -PI / 2\n sw.position.set(cen.x, 0.07, cen.z)\n c.effects.add(sw)\n B.shock = sw\n const k = big ? 1.8 : 1\n for (let i = 0; i < (big ? 70 : 46); i++) {\n const d = new V3(c.rand() - 0.5, c.rand() * 0.9, c.rand() - 0.5).normalize()\n kit.spawn(c, 'fire', cen.clone().addScaledVector(d, 0.3), d.multiplyScalar((2.5 + c.rand() * 4) * k), {\n s: (1.0 + c.rand() * 1.4) * k,\n life: 0.8 + c.rand() * 0.7,\n })\n }\n for (let j = 0; j < (big ? 30 : 18); j++) {\n const d2 = new V3(c.rand() - 0.5, 0.4 + c.rand(), c.rand() - 0.5).normalize()\n kit.spawn(c, 'smoke', cen.clone().addScaledVector(d2, 0.6), d2.multiplyScalar(1.5 + c.rand() * 2), {\n variant: 'black',\n s: (1.4 + c.rand()) * k,\n life: 4 + c.rand() * 2,\n })\n }\n I.burst(c, 'spark', cen, 40, { speed: 7, spread: 1.6 })\n I.burst(c, 'scrap', cen, 14, {\n speed: 5,\n spread: 1.5,\n mat: makeMaterial(paintColor(m.color || '#777', c.state), { roughness: 0.5, metalness: 0.3, side: DOUBLE_SIDE }),\n })\n I.burst(c, 'plastic', cen, 8, { speed: 4 })\n /* the glass bursts into shards */\n c.glass.slice().forEach(function (gm2: any) {\n const G = gm2.userData.glass\n if (!G || G.broken || !gm2.visible || !gm2.parent) return\n if (G.type === 'laminated') {\n G.type = 'tempered'\n }\n I.shatterGlass(c, gm2, 1.4, new V3(0, 1, 0))\n })\n /* parts that fly off with a fire trail */\n function rv(a: any, b: any) {\n return a + c.rand() * (b - a)\n }\n if (c.hood) {\n fling(c, c.hood.piv, new V3(rv(1, 3), rv(6, 8.5), rv(-1.5, 1.5)), new V3(rv(-4, 4), rv(-2, 2), rv(3, 7)))\n c.hood = null\n }\n const W = m.width || 1.6\n const gh = m.glasshouse\n if (m.kind === 'car' && gh) {\n ;[1, -1].forEach(function (sd) {\n const dh = Math.max(0.35, (m.belt || 1) - (m.clearance || 0.3) - 0.08)\n const dx = gh.fb - 0.55\n const door = c.roundBox(0.95, dh, 0.045, 0.03, c.paint(m.color || '#777'), dx, (m.clearance || 0.3) + dh / 2 + 0.04, sd * (W / 2 + 0.01))\n const hole = c.roundBox(0.9, dh * 0.95, 0.02, 0.02, MATERIALS.dark, dx, (m.clearance || 0.3) + dh / 2 + 0.04, sd * (W / 2 - 0.01))\n hole.userData.noFollow = true\n fling(c, door, c.dirToEffects(new V3(rv(-1, 1), rv(3.5, 6), sd * rv(4, 6.5))), new V3(rv(-5, 5), rv(-4, 4), rv(-5, 5)))\n })\n }\n if (m.rearBumper && m.rearBumper.parent)\n fling(\n c,\n m.rearBumper.parent.isGroup && m.rearBumper.parent !== c.vehicle ? m.rearBumper.parent : m.rearBumper,\n c.dirToEffects(new V3(rv(-5, -3), rv(4, 6), rv(-1, 1))),\n new V3(rv(-3, 3), rv(-6, 6), rv(-3, 3)),\n )\n if (c.wheels.length) {\n const wi = Math.floor(c.rand() * c.wheels.length)\n const wh = c.wheels[wi]\n c.wheels.splice(wi, 1)\n c.parts.forEach(function (p: any) {\n if (p.obj === wh) p.done = true\n })\n fling(\n c,\n wh,\n c.dirToEffects(new V3(rv(-2, 2), rv(5, 7.5), (wh.position.z >= 0 ? 1 : -1) * rv(3, 5))),\n new V3(rv(-8, 8), rv(-3, 3), rv(-8, 8)),\n )\n }\n burnAll(c)\n /* low fire that stays on the shell */\n c.emitters = c.emitters.filter(function (e: any) {\n return e.kind === 'exhaust' ? false : true\n })\n c.emitters.forEach(function (e: any) {\n if (e.kind === 'fire') e.rate = Math.min(e.rate, 7)\n })\n kit.addEmitter(c, ep.clone().add(new V3(0, 0.15, 0)), 'fire', { rate: 8, s: 0.8 })\n kit.addEmitter(c, new V3(((m.front || 1) + (m.rear || -1)) / 2, (m.clearance || 0.3) + 0.35, 0), 'fire', { rate: 6, s: 0.7 })\n kit.addEmitter(c, ep.clone().add(new V3(0, 0.9, 0)), 'black', { rate: 4, s: 1.4 })\n c.parts.forEach(function (p: any) {\n if (p.kind === 'glass' || p.kind === 'headlight' || p.kind === 'taillight' || p.kind === 'hood') p.done = true\n })\n c.log.push({ kind: 'explosion', label: kit.t(big ? 'blast.tank_explosion' : 'blast.explosion') })\n if (big) bigBoomFx(c)\n }\n function tickBoom(c: any, dt: any) {\n const B = c.blast\n B.t += dt\n if (B.phase === 'fire') {\n if (B.t >= B.T) detonate(c)\n return\n }\n if (B.phase === 'flight') {\n B.vy -= 9.8 * dt\n c.vehicle.position.y += B.vy * dt\n c.vehicle.rotation.x += B.rx * dt * (B.vy > 0 ? 1 : -1)\n c.vehicle.rotation.z += B.rz * dt * (B.vy > 0 ? 1 : -1)\n if (c.vehicle.position.y <= B.y0 && B.vy < 0) {\n c.vehicle.position.y = B.y0\n if (B.vy < -2.5) {\n B.vy *= -0.18\n I.burst(c, 'dust', c.toEffects(new V3(0, 0.1, 0)).setY(0.1), 10, { speed: 1.5, spread: 2.5, jitter: 1.0, s: 1.6 })\n } else {\n B.phase = 'burnt'\n c.vehicle.rotation.x *= 0.3\n c.vehicle.rotation.z *= 0.3\n }\n }\n }\n if (B.flash) {\n const ft = B.t / 0.6\n if (ft < 1) {\n const sc = (c.meta.bigBlast ? 22 : 9) * Math.sin(Math.min(1, ft * 4) * PI * 0.5)\n B.flash.scale.set(sc, sc, 1)\n B.flash.material.opacity = 1 - ft\n } else {\n c.effects.remove(B.flash)\n B.flash.material.dispose()\n B.flash = null\n }\n }\n if (B.shock) {\n const st = B.t / 0.7\n if (st < 1) {\n const r = (c.meta.bigBlast ? 18 : 7) * st + 0.5\n B.shock.scale.set(r, r, 1)\n B.shock.material.opacity = 0.6 * (1 - st)\n } else {\n c.effects.remove(B.shock)\n B.shock.geometry.dispose()\n B.shock = null\n }\n }\n }\n function tickFlying(c: any, dt: any) {\n ;(c.flying || []).forEach(function (P: any) {\n if (P.landed) {\n if (P.trail > 0) {\n P.trail -= dt\n if (c.rand() < dt * 8) kit.spawn(c, 'fire', P.o.position.clone(), new V3(0, 0.8, 0), { s: 0.35, life: 0.5 })\n }\n return\n }\n P.v.y -= 9.8 * dt\n P.o.position.addScaledVector(P.v, dt)\n P.o.rotation.x += P.w.x * dt\n P.o.rotation.y += P.w.y * dt\n P.o.rotation.z += P.w.z * dt\n if (P.trail > 0 && c.rand() < dt * 30) {\n kit.spawn(c, 'fire', P.o.position.clone(), P.v.clone().multiplyScalar(-0.1), { s: 0.45 + c.rand() * 0.3, life: 0.45 })\n if (c.rand() < 0.4) kit.spawn(c, 'smoke', P.o.position.clone(), new V3(0, 0.6, 0), { variant: 'black', s: 0.5, life: 2 })\n }\n if (P.o.position.y < P.r) {\n P.o.position.y = P.r\n if (P.v.y < -2) {\n P.v.y *= -0.3\n P.v.x *= 0.5\n P.v.z *= 0.5\n P.w.multiplyScalar(0.5)\n I.burst(c, 'spark', P.o.position.clone().setY(0.05), 8, { speed: 2 })\n } else {\n P.landed = true\n P.o.rotation.x = Math.round(P.o.rotation.x / (PI / 2)) * (PI / 2) * 0 + P.o.rotation.x * 0.2\n P.o.rotation.z *= 0.2\n }\n }\n })\n if (c.bigFx) {\n const F = c.bigFx\n F.t += dt\n /* mushroom: a column that rises and a cap that opens to ~16 m */\n if (F.t < 4.5) {\n const cen = c.toEffects(new V3(((c.meta.front || 1) + (c.meta.rear || -1)) / 2, 1.5, 0))\n if (c.rand() < dt * 40)\n kit.spawn(\n c,\n 'fire',\n cen.clone().add(new V3((c.rand() - 0.5) * 1.5, c.rand() * 2, (c.rand() - 0.5) * 1.5)),\n new V3(c.rand() - 0.5, 7 + c.rand() * 3, c.rand() - 0.5),\n { s: 2.6 + c.rand() * 1.5, life: 1.8, nofog: true },\n )\n if (c.rand() < dt * 18)\n kit.spawn(\n c,\n 'smoke',\n cen.clone().add(new V3(0, 2, 0)),\n new V3((c.rand() - 0.5) * 0.6, 8 + c.rand() * 2, (c.rand() - 0.5) * 0.6),\n { variant: 'gray', s: 2.6, life: 2.0, grow: 1.6, nofog: true },\n )\n if (F.t > 1.0 && c.rand() < dt * 30) {\n const a = c.rand() * PI * 2\n kit.spawn(\n c,\n 'smoke',\n cen.clone().add(new V3(Math.cos(a) * 2, 14.5 + c.rand() * 2, Math.sin(a) * 2)),\n new V3(Math.cos(a) * 3.2, 0.6, Math.sin(a) * 3.2),\n { variant: 'gray', s: 3.6, life: 5, grow: 2.2, nofog: true },\n )\n }\n if (F.t > 0.8 && c.rand() < dt * 10) {\n const a2 = c.rand() * PI * 2\n kit.spawn(\n c,\n 'fire',\n cen.clone().add(new V3(Math.cos(a2) * 1.5, 15 + c.rand(), Math.sin(a2) * 1.5)),\n new V3(Math.cos(a2) * 2.5, 0.4, Math.sin(a2) * 2.5),\n { s: 3.8, life: 1.3, nofog: true },\n )\n }\n }\n const fade = F.t < 6 ? 1 : Math.max(0, 1 - (F.t - 6) / 2)\n F.rings.forEach(function (r: any, i: any) {\n r.material.opacity = (i % 3 === 1 ? 0.07 : 0.85) * fade * Math.min(1, F.t * 3)\n })\n if (fade <= 0) {\n c.effects.remove(F.g)\n c.bigFx = null\n }\n }\n }\n\n Object.assign(I, { BURNT, BURNT_RUB, boomMat, enginePos, fling, burnAll, bigBoomFx, detonate, tickBoom, tickFlying })\n}\n","/** Rollover physics and the rolled-over state. */\nimport type { Kit } from './types'\nimport { hash } from './util'\n\nexport function installRollover(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { MATERIALS } = I\n\n /* ================= rollover ================= */\n /* Rolls the vehicle sideways around the longitudinal axis (x). s = +1 falls to the right, -1 to the left.\n The support comes from the real shape: the convex hull (y, z) of all visible meshes (except decals, particles and thin rods),\n plus meta.rollRest [[y, z]...] and meta.rollTop if declared. The contact point stays still on the ground while the vehicle turns. */\n function rollMeshes(c: any) {\n const list: any = []\n const thin: any = []\n c.root.updateMatrixWorld(true)\n const inv = new THREE.Matrix4().copy(c.vehicle.matrixWorld).invert()\n c.vehicle.traverse(function (ob: any) {\n if (!ob.isMesh || !ob.geometry || !ob.geometry.attributes.position) return\n for (let q = ob; q && q !== c.vehicle; q = q.parent) if (!q.visible || q.userData.decal || q.userData.ghost) return\n const M = new THREE.Matrix4().multiplyMatrices(inv, ob.matrixWorld)\n if (!ob.geometry.boundingBox) ob.geometry.computeBoundingBox()\n const sz = ob.geometry.boundingBox.getSize(new V3())\n const sc = new V3().setFromMatrixScale(M)\n const d = [sz.x * sc.x, sz.y * sc.y, sz.z * sc.z].sort(function (a, b) {\n return a - b\n })\n /* `antena` is the original spelling of the flag */\n if (ob.userData.antenna || ob.userData.antena || (d[1] < 0.045 && d[2] > 0.2)) {\n thin.push({ o: ob, M: M })\n return\n }\n list.push({ o: ob, M: M })\n })\n return { list: list, thin: thin }\n }\n function convexHull(pts: any) {\n pts.sort(function (a: any, b: any) {\n return a[1] - b[1] || a[0] - b[0]\n })\n function cr(o: any, a: any, b: any) {\n return (a[1] - o[1]) * (b[0] - o[0]) - (a[0] - o[0]) * (b[1] - o[1])\n }\n const lo: any = []\n const up = []\n pts.forEach(function (p: any) {\n while (lo.length >= 2 && cr(lo[lo.length - 2], lo[lo.length - 1], p) <= 0) lo.pop()\n lo.push(p)\n })\n for (let i = pts.length - 1; i >= 0; i--) {\n const p = pts[i]\n while (up.length >= 2 && cr(up[up.length - 2], up[up.length - 1], p) <= 0) up.pop()\n up.push(p)\n }\n up.pop()\n lo.pop()\n return lo.concat(up)\n }\n kit.roll = function (c: any, s: any) {\n if (c.rollState || c.flipped) return false\n s = s || 1\n const m = c.meta\n const bike = m.kind === 'bike'\n const R = rollMeshes(c)\n let pts: any = []\n const v = new V3()\n let yc = 0\n let zc = 0\n let n = 0\n R.list.forEach(function (e: any) {\n const pos = e.o.geometry.attributes.position\n const st = Math.max(1, Math.floor(pos.count / 600))\n for (let i = 0; i < pos.count; i += st) {\n v.fromBufferAttribute(pos, i).applyMatrix4(e.M)\n pts.push([v.y, v.z])\n yc += v.y\n zc += v.z\n n++\n }\n })\n ;(m.rollRest || []).forEach(function (q: any) {\n pts.push([q[0], q[1]])\n })\n if (m.rollTop)\n [-1, 1].forEach(function (k) {\n pts.push([m.rollTop, k * m.width * 0.3])\n })\n if (pts.length < 3)\n pts = [\n [0, -m.width / 2],\n [0, m.width / 2],\n [m.top, m.width / 2],\n [m.top, -m.width / 2],\n ]\n const S = convexHull(pts)\n c.rollState = {\n t: 0,\n dur: bike ? 0.9 : m.kind === 'bus' || m.kind === 'truck' ? 2.0 : 1.6,\n s: s,\n S: S,\n last: -1,\n cz: c.vehicle.position.z,\n target: bike ? PI / 2 : PI,\n x: ((m.front || 1) + (m.rear || -1)) / 2,\n L: m.length || 2,\n bounce: 0,\n cen: [n ? yc / n : m.top / 2, n ? zc / n : 0],\n hitAt: null,\n hits: 0,\n thin: R.thin,\n y0: c.vehicle.position.y,\n }\n if (c.hood) c.hood.target = 0\n return true\n }\n function rollContact(c: any, A: any, q: any) {\n const m = c.meta\n const list: any = []\n const dy = A.cen[0] - q[0]\n const dz = A.cen[1] - q[1]\n const dl = Math.hypot(dy, dz) || 1\n const dir = new V3(0, dy / dl, dz / dl)\n const f = 0.75\n const bike = m.kind === 'bike'\n ;(bike ? [0] : [-0.28, 0, 0.28]).forEach(function (k) {\n list.push([new V3(A.x + k * A.L, q[0], q[1]), dir])\n })\n /* lying on its side: the window strip touches the ground too */\n if (!bike && Math.abs(dir.z) > 0.75 && m.top - m.belt > 0.25 && A.hits < 3) {\n const sd = -Math.sign(dir.z)\n const yw = m.belt + (m.top - m.belt) * 0.45\n ;[-0.25, 0.2].forEach(function (k) {\n const h = I.probe(c, new V3(A.x + k * A.L, yw, sd * (m.width / 2 + 2)), new V3(0, 0, -sd), 2 + m.width)\n if (h) list.push([h.p, new V3(0, 0, -sd)])\n })\n }\n list.forEach(function (e: any) {\n I.impact(c, e[0], e[1], f, { noStain: true, maxDepth: 0.1 })\n const pf = c.toEffects(e[0])\n pf.y = Math.max(0.03, pf.y)\n I.burst(c, 'dust', pf.clone().setY(0.1), 4, { speed: 0.9, spread: 2.2, jitter: 0.4, s: 1.2 })\n I.burst(c, 'spark', pf, 14, { speed: 3, spread: 1.6 })\n I.burst(c, 'shard', pf, 4, { speed: 1.5 })\n })\n A.hits++\n A.bounce = A.hits === 1 ? 0.06 : 0.1\n if (m.kind === 'boat') I.burst(c, 'water', c.toEffects(list[0][0]).setY(0.05), 30, { speed: 3 })\n }\n /* lowest y (in the c.root frame) of all supporting meshes, vertex by vertex */\n function exactMinY(c: any, list: any) {\n c.root.updateMatrixWorld(true)\n const inv = new THREE.Matrix4().copy(c.root.matrixWorld).invert()\n const M = new THREE.Matrix4()\n const v = new V3()\n let mn = 1e9\n list.forEach(function (e: any) {\n const ob = e.o\n if (!ob.parent || !I.shown(c, ob)) return\n M.multiplyMatrices(inv, ob.matrixWorld)\n const pos = ob.geometry.attributes.position\n for (let i = 0; i < pos.count; i++) {\n v.fromBufferAttribute(pos, i).applyMatrix4(M)\n if (v.y < mn) mn = v.y\n }\n })\n return mn\n }\n function finishRoll(c: any) {\n const A = c.rollState\n const m = c.meta\n c.rollState = null\n c.flipped = true\n c.vehicle.rotation.x = A.s * A.target\n if (A.hits < 2 && m.kind !== 'bike') {\n const cs = Math.cos(c.vehicle.rotation.x)\n const sn = Math.sin(c.vehicle.rotation.x)\n let best = null\n let by = 1e9\n A.S.forEach(function (q: any) {\n const y = q[0] * cs - q[1] * sn\n if (y < by) {\n by = y\n best = q\n }\n })\n if (best) rollContact(c, A, best)\n }\n /* settles on the real lowest point (the dented roof and rigid parts count) */\n const R = rollMeshes(c)\n const mn = exactMinY(c, R.list)\n if (mn < 1e8) c.vehicle.position.y -= mn\n /* thin rods (antennas, sticks) that would go through the ground break and shed pieces */\n c.root.updateMatrixWorld(true)\n const inv = new THREE.Matrix4().copy(c.root.matrixWorld).invert()\n R.thin.forEach(function (e: any) {\n const ob = e.o\n const bb = new THREE.Box3().setFromObject(ob).applyMatrix4(inv)\n if (bb.min.y < -0.01 && ob.parent) {\n const pf = bb.getCenter(new V3())\n pf.y = Math.max(0.05, pf.y)\n ob.visible = false\n I.burst(c, 'plastic', pf, 3, { speed: 1.2 })\n I.burst(c, 'spark', pf, 5, { speed: 2 })\n }\n })\n /* upside-down helicopter: the blades that would go through the ground break into pieces */\n if (m.kind === 'heli')\n c.parts.forEach(function (p: any) {\n if ((p.kind !== 'rotor' && p.kind !== 'tail_rotor') || !p.obj) return\n const main = p.kind === 'rotor'\n p.obj.traverse(function (o: any) {\n if (!o.isMesh || !o.visible) return\n const bb = new THREE.Box3().setFromObject(o).applyMatrix4(inv)\n if (!main && bb.min.y >= -0.01) return\n const pf = bb.getCenter(new V3())\n pf.y = Math.max(0.05, Math.min(pf.y, 0.4))\n o.visible = false\n I.burst(c, 'scrap', pf, 3, { speed: 1.4, mat: o.material && !Array.isArray(o.material) ? o.material : MATERIALS.trim })\n I.burst(c, 'spark', pf, 6, { speed: 2.2 })\n I.burst(c, 'dust', pf.clone().setY(0.1), 2, { speed: 0.8, s: 1.1 })\n })\n c.spin = c.spin.filter(function (sp: any) {\n return sp.o !== p.obj\n })\n })\n if (m.kind === 'heli') {\n const mn2 = exactMinY(c, R.list)\n if (mn2 < 1e8 && Math.abs(mn2) > 0.005) c.vehicle.position.y -= mn2\n }\n if (m.kind === 'boat') {\n c.vehicle.position.y -= 0.45\n c.sunk = c.vehicle.position.y\n }\n c.wheels.forEach(function (w: any, i: any) {\n c.spin.push({ o: w, axis: 'z', v: 2.2 + hash(i, 2, 3) * 2, decay: 0.12 })\n })\n const mot = c.parts.find(function (p: any) {\n return p.kind === 'engine'\n })\n if (mot && m.kind !== 'boat') kit.addEmitter(c, mot.pos.clone().add(new V3(0, -0.3, 0)), 'black', { rate: 4 })\n }\n function tickRoll(c: any, dt: any) {\n const A = c.rollState\n A.t += dt\n const p = Math.min(1, A.t / A.dur)\n const e = p * p * (3 - 2 * p)\n const phi = A.s * A.target * e\n const cs = Math.cos(phi)\n const sn = Math.sin(phi)\n let minY = 1e9\n let idx = 0\n A.S.forEach(function (q: any, i: any) {\n const y = q[0] * cs - q[1] * sn\n if (y < minY - 1e-6) {\n minY = y\n idx = i\n }\n })\n const q = A.S[idx]\n const zi = q[0] * sn + q[1] * cs\n if (idx !== A.last) {\n if (A.last < 0) A.cz = c.vehicle.position.z + zi\n else {\n const pq = A.S[A.last]\n A.cz += zi - (pq[0] * sn + pq[1] * cs)\n }\n A.last = idx\n if (A.t > 0.15 && (!A.hitAt || Math.hypot(q[0] - A.hitAt[0], q[1] - A.hitAt[1]) > 0.35)) {\n A.hitAt = q\n c.vehicle.rotation.x = phi\n c.vehicle.position.y = -minY\n c.vehicle.position.z = A.cz - zi\n rollContact(c, A, q)\n }\n }\n A.bounce = Math.max(0, A.bounce - dt * 0.5)\n c.vehicle.rotation.x = phi\n c.vehicle.position.y = -minY + Math.sin(Math.min(1, A.bounce / 0.1) * PI) * A.bounce * 0.6\n c.vehicle.position.z = A.cz - zi\n if (p >= 1) finishRoll(c)\n }\n kit.rollContact = rollContact\n\n Object.assign(I, { rollMeshes, convexHull, rollContact, exactMinY, finishRoll, tickRoll })\n}\n","/** Per-frame update loop for particles, fluids, spinning parts and rollover. */\nimport type { Kit } from './types'\n\nexport function installTick(kit: Kit): void {\n const I = kit._\n\n /* ================= per-frame loop ================= */\n kit.tick = function (c: any, dt: any) {\n c.time += dt\n if (c.rollState) I.tickRoll(c, dt)\n if (c.blast) I.tickBoom(c, dt)\n if (c.flying || c.bigFx) I.tickFlying(c, dt)\n if (c.hood) {\n const h = c.hood\n const tg = Math.max(h.target, h.latch)\n h.ang += (tg - h.ang) * Math.min(1, dt * 4.5)\n h.piv.rotation.z = h.ang * (h.sign || 1)\n }\n c.spin.forEach(function (s: any) {\n s.o.rotation[s.axis] += dt * s.v\n if (s.decay) s.v *= Math.max(0, 1 - s.decay * dt)\n })\n I.tickEmit(c, dt)\n I.tickParticles(c, dt)\n I.updateFluids(c, dt)\n if (c.meta.kind === 'boat' && !c.flipped && !c.rollState) {\n c.vehicle.position.y = (c.sunk || 0) + Math.sin(c.time * 1.3) * 0.04\n c.vehicle.rotation.z = Math.sin(c.time * 0.9) * 0.02\n }\n }\n kit.settle = function (c: any, sec: any) {\n const n = Math.round(sec * 30)\n for (let i = 0; i < n; i++) kit.tick(c, 1 / 30)\n }\n kit.setHood = function (c: any, open: any) {\n if (!c.hood) return false\n c.hood.target = open ? c.hood.open : 0\n return true\n }\n\n Object.assign(I, {})\n}\n","/** Armoured vehicle details (plating, hatches, add-on armour) and the applyArmor helper. */\nimport type { Kit } from './types'\nimport { clamp, hash } from './util'\n\nexport function installArmor(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, MATERIALS } = I\n\n /* ================= modified state ================= */\n const STEEL_MATERIAL = makeMaterial('#4e534f', { metalness: 0.55, roughness: 0.5 })\n const PLATE_MATERIALS = ['#4f5450', '#5b605b', '#454a47', '#56584f', '#4b4d4a'].map(function (h) {\n return makeMaterial(h, { metalness: 0.5, roughness: 0.55 })\n })\n kit.steelMaterial = STEEL_MATERIAL\n function jerryCan(c: any, x: any, y: any, z: any, col: any) {\n c.roundBox(0.34, 0.44, 0.16, 0.04, makeMaterial(col, { roughness: 0.5 }), x, y, z)\n c.tube(\n [\n [x - 0.1, y + 0.22, z],\n [x - 0.05, y + 0.28, z],\n [x + 0.05, y + 0.28, z],\n [x + 0.1, y + 0.22, z],\n ],\n 0.015,\n makeMaterial(col),\n )\n c.cylinder(0.025, 0.025, 0.05, MATERIALS.trim, x + 0.12, y + 0.24, z)\n }\n kit.jerryCan = jerryCan\n function applyArmor(c: any) {\n const m = c.meta\n const k = m.kind\n if (k === 'bike') {\n /* box resting on the roof rack (meta.rack = height) with a jerry can on top */\n const ry = m.rack || (m.belt || 0.8) - 0.05\n const bxx = (m.rear || -0.9) + 0.3\n const bh = m.length < 1.9 ? 0.26 : 0.32\n c.roundBox(m.length < 1.9 ? 0.36 : 0.42, bh, 0.32, 0.03, m.length < 1.9 ? MATERIALS.wood : makeMaterial('#3d3a2e'), bxx, ry + bh / 2, 0)\n jerryCan(c, bxx, ry + bh + 0.22, 0, '#8e2a20')\n if (m.length >= 1.9)\n [1, -1].forEach(function (s2) {\n c.tube(\n [\n [0.38, 0.9, s2 * 0.18],\n [0.45, 0.6, s2 * 0.32],\n [0.1, 0.3, s2 * 0.3],\n ],\n 0.02,\n MATERIALS.steel,\n )\n })\n return\n }\n if (k === 'boat') {\n const bx = m.front - 1.5\n const x0 = m.rear + 1.2\n const yt = m.top + 0.5\n for (let z = -0.6; z <= 0.61; z += 0.2) c.rod(new V3(x0, yt, z), new V3(bx, yt, z), 0.012, STEEL_MATERIAL)\n ;[x0, bx].forEach(function (x) {\n ;[-0.65, 0.65].forEach(function (zz) {\n c.rod(new V3(x, m.belt, zz), new V3(x, yt, zz), 0.03, STEEL_MATERIAL)\n })\n })\n ;[0.5, 0.2, -0.1].forEach(function (zz, i) {\n jerryCan(c, m.rear + 1.3, m.belt + 0.1, zz, i % 2 ? '#3e5a34' : '#8e2a20')\n })\n c.cylinder(0.14, 0.1, 0.2, MATERIALS.steel, bx, yt + 0.12, 0, 'x')\n c.cylinder(0.11, 0.11, 0.02, MATERIALS.head, bx + 0.1, yt + 0.12, 0, 'x')\n return\n }\n if (k === 'plane' || k === 'heli') {\n const wz = k === 'plane' ? 2.6 : 1.05\n const wy = k === 'plane' ? m.top - 0.25 : 0.55\n const pod = makeMaterial('#5c6158', { metalness: 0.4, roughness: 0.5 })\n ;[1, -1].forEach(function (s) {\n c.cylinder(0.18, 0.18, 1.3, pod, 0.2, wy - 0.25, s * wz, 'x')\n c.sphere(0.18, pod, 0.85, wy - 0.25, s * wz, 1.6, 1, 1)\n c.sphere(0.18, pod, -0.45, wy - 0.25, s * wz, 1.3, 1, 1)\n c.rod(new V3(0.2, wy - 0.1, s * wz), new V3(0.2, wy, s * wz), 0.02, MATERIALS.steel)\n })\n c.cylinder(0.16, 0.12, 0.22, MATERIALS.steel, m.front - 0.6, 0.85, 0.3, 'x')\n c.cylinder(0.13, 0.13, 0.02, MATERIALS.head, m.front - 0.48, 0.85, 0.3, 'x')\n return\n }\n if (!m.bullet) {\n c.glass.slice().forEach(function (gm2: any) {\n if (!gm2.parent) return\n const b = new THREE.Box3().setFromObject(gm2)\n const dx = b.max.x - b.min.x\n const dz = b.max.z - b.min.z\n const h = (b.max.y - b.min.y) * 0.96\n const yc = (b.max.y + b.min.y) / 2\n if (gm2.userData.ghost) {\n for (let xx = b.min.x; xx <= b.max.x; xx += 0.15)\n [b.min.z - 0.03, b.max.z + 0.03].forEach(function (zz) {\n c.rod(new V3(xx, b.min.y, zz), new V3(xx, b.max.y, zz), 0.014, STEEL_MATERIAL)\n })\n } else if (dz < 0.25 && dx > 0.2) {\n const z0 = b.max.z > 0 ? b.max.z + 0.035 : b.min.z - 0.035\n for (let x = b.min.x + 0.06; x < b.max.x - 0.03; x += 0.12)\n c.rod(new V3(x, yc - h / 2, z0), new V3(x, yc + h / 2, z0), 0.014, STEEL_MATERIAL)\n ;[yc - h / 2, yc + h / 2].forEach(function (y) {\n c.rod(new V3(b.min.x, y, z0), new V3(b.max.x, y, z0), 0.02, STEEL_MATERIAL)\n })\n }\n })\n c.quads.forEach(function (q: any) {\n const off = 0.06\n const bx2 = q.b[0] + q.n[0] * off\n const by2 = q.b[1] + q.n[1] * off\n const tx = q.t[0] + q.n[0] * off\n const ty = q.t[1] + q.n[1] * off\n for (let f = -1; f <= 1.0001; f += 0.14) c.rod(new V3(bx2, by2, f * q.hb), new V3(tx, ty, f * q.ht), 0.014, STEEL_MATERIAL)\n c.rod(new V3(bx2, by2, -q.hb), new V3(bx2, by2, q.hb), 0.02, STEEL_MATERIAL)\n c.rod(new V3(tx, ty, -q.ht), new V3(tx, ty, q.ht), 0.02, STEEL_MATERIAL)\n })\n }\n /* ram: an almost vertical blade flush with the bumper, held by arms back to the frame rail */\n const ph = clamp(Math.min(m.bodyHeight, 0.9) * 0.8, 0.32, 0.7)\n const yb = Math.max(0.1, m.clearance * 0.55)\n const fy = yb + ph / 2\n const fx = m.front + 0.11\n c.roundBox(0.07, ph, m.width * 1.02, 0.03, STEEL_MATERIAL, fx, fy, 0, { rot: [0, 0, -0.1] })\n ;[-0.3, 0.3].forEach(function (zf) {\n c.rod(new V3(m.front - 0.35, yb + 0.05, m.width * zf), new V3(fx - 0.03, yb + 0.05, m.width * zf), 0.035, MATERIALS.trim)\n c.rod(new V3(m.front - 0.25, yb + 0.05, m.width * zf), new V3(fx - 0.03, fy + ph * 0.25, m.width * zf), 0.025, MATERIALS.trim)\n })\n for (let bar = 0; bar < 3; bar++)\n c.rod(\n new V3(fx + 0.045, yb + ph * (0.2 + bar * 0.3), -m.width * 0.5),\n new V3(fx + 0.045, yb + ph * (0.2 + bar * 0.3), m.width * 0.5),\n 0.02,\n STEEL_MATERIAL,\n )\n const n = Math.max(4, Math.round(m.width / 0.32))\n const spk = makeMaterial('#8a8e8a', { metalness: 0.7, roughness: 0.35 })\n for (let i = 0; i < n; i++) {\n const sp = c.add(\n new THREE.ConeGeometry(0.035, 0.26, 10),\n spk,\n fx + 0.17,\n yb + ph * (i % 2 ? 0.35 : 0.65),\n -m.width * 0.44 + (i + 0.5) * ((m.width * 0.88) / n),\n )\n sp.rotation.z = -PI / 2\n }\n /* side plates: between the bumpers, cut out over the wheels, glued to the curve of the side */\n if (k !== 'tractor') {\n const x0 = m.rear + 0.15\n const x1 = m.front - 0.15\n const brk = [x0, x1]\n const wl: any = []\n c.wheels.forEach(function (w: any) {\n if (!w.parent) return\n const r = w.userData.r || 0.33\n wl.push([w.position.x - r - 0.07, w.position.x + r + 0.07, w.position.y + r + 0.05])\n })\n wl.forEach(function (w: any) {\n if (w[0] > x0 && w[0] < x1) brk.push(w[0])\n if (w[1] > x0 && w[1] < x1) brk.push(w[1])\n })\n brk.sort(function (a, b) {\n return a - b\n })\n const yTop = Math.min(m.belt - 0.06, m.clearance + 0.15 + Math.min(m.bodyHeight, 1.0) * 0.75)\n const pieces: any = []\n for (let b = 0; b < brk.length - 1; b++) {\n const a0 = brk[b]\n const a1 = brk[b + 1]\n const mid = (a0 + a1) / 2\n let bot = m.clearance + 0.1\n wl.forEach(function (w: any) {\n if (mid > w[0] && mid < w[1]) bot = Math.max(bot, w[2])\n })\n if (yTop - bot < 0.14 || a1 - a0 < 0.12) continue\n const np = Math.max(1, Math.round((a1 - a0) / 1.0))\n for (let q = 0; q < np; q++) pieces.push([a0 + ((a1 - a0) * q) / np, a0 + ((a1 - a0) * (q + 1)) / np, bot])\n }\n ;[1, -1].forEach(function (s2) {\n pieces.forEach(function (pc: any, j: any) {\n const pl = pc[1] - pc[0] - 0.03\n const px = (pc[0] + pc[1]) / 2\n const plH = yTop - pc[2]\n const py = pc[2] + plH / 2\n function zAt(x: any) {\n const h = I.probe(c, new V3(x, py, s2 * (m.width / 2 + 2)), new V3(0, 0, -s2), 2 + m.width * 0.4)\n return h && Math.abs(h.p.z) > m.width * 0.3 ? h.p.z : (s2 * m.width) / 2\n }\n const za = zAt(px - pl * 0.4)\n const zb = zAt(px + pl * 0.4)\n const pz = (zAt(px) + (za + zb) / 2) / 2 + s2 * 0.035\n const yaw = -Math.atan2(zb - za, pl * 0.8)\n const pm = c.roundBox(pl, plH, 0.035, 0.012, PLATE_MATERIALS[(j * 2 + (s2 > 0 ? 0 : 1)) % PLATE_MATERIALS.length], px, py, pz, {\n rot: [(hash(j, s2, 2) - 0.5) * 0.04, yaw, (hash(j, s2, 1) - 0.5) * 0.06],\n })\n ;[-1, 1].forEach(function (u) {\n ;[-1, 1].forEach(function (v) {\n c.sphere(\n 0.016,\n MATERIALS.steel,\n px + u * pl * 0.42 * Math.cos(yaw),\n py + v * plH * 0.38,\n pz + s2 * 0.02 - u * Math.sin(yaw) * pl * 0.42,\n )\n })\n })\n pm.userData.armorPlate = true\n })\n })\n }\n if (m.roof) {\n const r = m.roof\n const ry = (r.y || m.top) + 0.12\n const rl = r.x1 - r.x0\n const rw = r.w\n c.tube(\n [\n [r.x0, ry, -rw / 2],\n [r.x1, ry, -rw / 2],\n [r.x1, ry, rw / 2],\n [r.x0, ry, rw / 2],\n [r.x0, ry, -rw / 2],\n ],\n 0.022,\n MATERIALS.trim,\n { seg: 40 },\n )\n ;[r.x0 + 0.05, r.x1 - 0.05].forEach(function (x) {\n ;[-rw / 2, rw / 2].forEach(function (zz) {\n c.rod(new V3(x, ry - 0.12, zz), new V3(x, ry, zz), 0.02, MATERIALS.trim)\n })\n })\n for (let xs = r.x0 + 0.2; xs < r.x1; xs += 0.3) c.rod(new V3(xs, ry, -rw / 2), new V3(xs, ry, rw / 2), 0.012, MATERIALS.trim)\n const cans = Math.max(1, Math.min(4, Math.floor(rl / 0.45)))\n for (let q = 0; q < cans; q++) jerryCan(c, r.x0 + 0.25 + q * 0.4, ry + 0.24, -rw * 0.28, q % 2 ? '#3e5a34' : '#8e2a20')\n if (rl > 1.0 && rw > 0.9) {\n const sp2 = c.wheel(r.x1 - 0.45, 0.001, 0.32, 0.2, { noPart: true })\n sp2.rotation.x = PI / 2\n sp2.position.set(r.x1 - 0.45, ry + 0.11, rw * 0.2)\n c.wheels.pop()\n }\n }\n if (m.bed) {\n jerryCan(c, m.bed.x0 + 0.3, m.bed.y + 0.23, 0.6, '#8e2a20')\n jerryCan(c, m.bed.x0 + 0.3, m.bed.y + 0.23, 0.4, '#8e2a20')\n c.roundBox(0.8, 0.45, 0.6, 0.05, makeMaterial('#4a4b3c'), m.bed.x0 + 0.9, m.bed.y + 0.23, -0.4)\n c.roundBox(0.5, 0.3, 0.4, 0.04, MATERIALS.wood, m.bed.x0 + 0.8, m.bed.y + 0.15, 0.3)\n }\n }\n kit.applyArmor = applyArmor\n\n Object.assign(I, { STEEL_MATERIAL, PLATE_MATERIALS, jerryCan, applyArmor })\n}\n","/** Zone core: bands, effects text, box helpers and part lookups. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installZoneCore(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n\n /* ================= damage zones ================= */\n /* Every vehicle has named zones with health from 0 to 100. The core derives the zones from the meta (autoZones) and the builder refines\n them with c.zone(id, label, box, parts, options). The band (intact, scratched, dented, destroyed, torn_off) decides the look,\n which is deterministic: the same zone in the same band always gives the same result. When the band changes, the app rebuilds the\n vehicle (kit.build(key, state, zoneStates)) and applyZones reapplies every zone. Damage stays inside the zone box: the\n dent field is masked by the box and each owned part (wheel, light, glass, hood, mirror) only obeys its own zone. */\n const BAND_DEFINITIONS = [\n { id: 'intact', min: 76, health: 100, color: '#6f8f63' },\n { id: 'scratched', min: 51, health: 63, color: '#d8b440' },\n { id: 'dented', min: 26, health: 38, color: '#e07c2c' },\n { id: 'destroyed', min: 1, health: 13, color: '#c8392e' },\n { id: 'torn_off', min: 0, health: 0, color: '#6e7377' },\n ]\n /** The five damage bands, worst last. `health` is a typical health value inside the band. */\n const BANDS = BAND_DEFINITIONS.map(function (b) {\n return { id: b.id, name: kit.t('bands.' + b.id), min: b.min, health: b.health, color: b.color }\n })\n function bandOf(h: any) {\n h = Math.round(clamp(h == null ? 100 : h, 0, 100))\n for (let i = 0; i < BANDS.length; i++) if (h >= BANDS[i].min) return i\n return 4\n }\n kit.bands = BANDS\n kit.bandOf = bandOf\n const ZONE_WEIGHTS: Record<string, number> = { door: 1, panel: 1, roof: 1.2, lid: 0.8, hood: 1, bumper: 0.6, glass: 0.4, light: 0.3, wheel: 0.8, internal: 1.5, part: 1 }\n /* effect text per key, in the five bands; {who} becomes the occupant of that side. The text comes from the game plugin. */\n const ZONE_EFFECTS: any = {}\n /* key -> 5 texts (one per band); filled by configure({ zoneEffects }) */\n kit.zoneEffects = ZONE_EFFECTS\n function zoneFx(z: any, b: any) {\n const t = (z.fx || ZONE_EFFECTS[z.fxKey] || ZONE_EFFECTS[z.type] || ZONE_EFFECTS.panel || [])[b] || kit.config.texts.noEffect || ''\n return t.replace(/\\{who\\}/g, z.who || kit.config.texts.who)\n }\n kit.zoneEffect = function (z: any, h: any) {\n return zoneFx(z, bandOf(h == null ? z.health : h))\n }\n /* box: [x0, x1, y0, y1, z0, z1], { x0, x1, y0, y1, z0, z1 } or THREE.Box3 (c.vehicle coordinates) */\n function normalizeBox(b: any) {\n if (!b) return null\n if (Array.isArray(b))\n return {\n x0: Math.min(b[0], b[1]),\n x1: Math.max(b[0], b[1]),\n y0: Math.min(b[2], b[3]),\n y1: Math.max(b[2], b[3]),\n z0: Math.min(b[4], b[5]),\n z1: Math.max(b[4], b[5]),\n }\n if (b.isBox3) return { x0: b.min.x, x1: b.max.x, y0: b.min.y, y1: b.max.y, z0: b.min.z, z1: b.max.z }\n return { x0: b.x0, x1: b.x1, y0: b.y0, y1: b.y1, z0: b.z0, z1: b.z1 }\n }\n kit.normalizeBox = normalizeBox\n function boxLo(B: any, a: any) {\n return a === 0 ? B.x0 : a === 1 ? B.y0 : B.z0\n }\n function boxHi(B: any, a: any) {\n return a === 0 ? B.x1 : a === 1 ? B.y1 : B.z1\n }\n function boxContains(B: any, x: any, y: any, z: any, e: any) {\n e = e || 0\n return x >= B.x0 - e && x <= B.x1 + e && y >= B.y0 - e && y <= B.y1 + e && z >= B.z0 - e && z <= B.z1 + e\n }\n function boxCenter(B: any) {\n return new V3((B.x0 + B.x1) / 2, (B.y0 + B.y1) / 2, (B.z0 + B.z1) / 2)\n }\n function boxVolume(B: any) {\n return Math.max(1e-4, B.x1 - B.x0) * Math.max(1e-4, B.y1 - B.y0) * Math.max(1e-4, B.z1 - B.z0)\n }\n function boxDistance(B: any, p: any) {\n const dx = Math.max(B.x0 - p.x, 0, p.x - B.x1)\n const dy = Math.max(B.y0 - p.y, 0, p.y - B.y1)\n const dz = Math.max(B.z0 - p.z, 0, p.z - B.z1)\n return Math.hypot(dx, dy, dz)\n }\n function boxIntersects(B: any, b3: any) {\n return b3.max.x >= B.x0 && b3.min.x <= B.x1 && b3.max.y >= B.y0 && b3.min.y <= B.y1 && b3.max.z >= B.z0 && b3.min.z <= B.z1\n }\n function worldInverseOf(c: any) {\n c.root.updateMatrixWorld(true)\n return new THREE.Matrix4().copy(c.vehicle.matrixWorld).invert()\n }\n /* box of an object in c.vehicle coordinates */\n function localBox(c: any, o: any, inv: any) {\n inv = inv || worldInverseOf(c)\n const bb = new THREE.Box3()\n const tmp = new THREE.Box3()\n const M = new THREE.Matrix4()\n o.traverse(function (x: any) {\n if (!x.isMesh || !x.geometry || !x.geometry.attributes.position || x.userData.decal) return\n if (!x.geometry.boundingBox) x.geometry.computeBoundingBox()\n tmp.copy(x.geometry.boundingBox).applyMatrix4(M.multiplyMatrices(inv, x.matrixWorld))\n bb.union(tmp)\n })\n return bb\n }\n kit.localBox = localBox\n function slug(s: any) {\n return String(s)\n .toLowerCase()\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_|_$/g, '')\n }\n function wheelInfo(c: any) {\n const ws = c.wheels.filter(function (w: any) {\n return w.parent\n })\n if (!ws.length) return null\n let xf = -1e9\n let xr = 1e9\n let rf = 0.3\n let rr = 0.3\n ws.forEach(function (w: any) {\n const r = w.userData.r || 0.3\n if (w.position.x > xf) {\n xf = w.position.x\n rf = r\n }\n if (w.position.x < xr) {\n xr = w.position.x\n rr = r\n }\n })\n return { list: ws, xf: xf, xr: xr, rf: rf, rr: rr }\n }\n function partsOf(c: any, kind: any) {\n return c.parts.filter(function (p: any) {\n return p.kind === kind\n })\n }\n function lightCenter(c: any, L: any, inv: any) {\n if (L.group) return localBox(c, L.group, inv).getCenter(new V3())\n const bb = new THREE.Box3()\n L.lens.concat(L.inner).forEach(function (m: any) {\n bb.union(localBox(c, m, inv))\n })\n return bb.isEmpty() ? new V3() : bb.getCenter(new V3())\n }\n function lightBoxOf(c: any, L: any, inv: any) {\n if (L.group) return localBox(c, L.group, inv)\n const bb = new THREE.Box3()\n L.lens.concat(L.inner).forEach(function (m: any) {\n bb.union(localBox(c, m, inv))\n })\n return bb\n }\n function hideObj(c: any, o: any) {\n if (!o) return\n o.visible = false\n c.parts.forEach(function (p: any) {\n if (p.obj === o) p.done = true\n })\n }\n function shown(c: any, o: any) {\n for (let q = o; q && q !== c.vehicle; q = q.parent) if (q.visible === false) return false\n return !!o\n }\n\n Object.assign(I, {\n BANDS,\n bandOf,\n ZONE_WEIGHTS,\n ZONE_EFFECTS,\n zoneFx,\n normalizeBox,\n boxLo,\n boxHi,\n boxContains,\n boxCenter,\n boxVolume,\n boxDistance,\n boxIntersects,\n worldInverseOf,\n localBox,\n slug,\n wheelInfo,\n partsOf,\n lightCenter,\n lightBoxOf,\n hideObj,\n shown,\n })\n}\n","/** Zone decals: scratches, rust, burn marks and dents drawn as textures. */\nimport type { Kit } from './types'\n\nexport function installZoneDecals(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const { makeMaterial, DOUBLE_SIDE } = I\n\n /* ---- damage materials ---- */\n function dmat(hex: any, o: any) {\n return makeMaterial(hex, Object.assign({ polygonOffset: true, polygonOffsetFactor: -2, polygonOffsetUnits: -3, side: DOUBLE_SIDE }, o || {}))\n }\n const DAMAGE_MATERIALS = {\n /* without an environment map, high-metalness metal turns black and chipped paint looks like a bullet hole: light, barely metallic metal */\n fine: dmat('#b9bec0', { metalness: 0.3, roughness: 0.45 }),\n deep: dmat('#d6dadc', { metalness: 0.35, roughness: 0.35 }),\n primer: dmat('#8a8d8b', { roughness: 0.95 }),\n metal: dmat('#c3c7ca', { metalness: 0.35, roughness: 0.38 }),\n rust: dmat('#6b3a1e', { roughness: 1 }),\n rust2: dmat('#46220f', { roughness: 1 }),\n hole: dmat('#0a0a0b', { roughness: 1 }),\n edge: dmat('#c9cdd0', { metalness: 0.45, roughness: 0.3 }),\n seam: dmat('#060607', { roughness: 1 }),\n soot: makeMaterial('#14110f', {\n roughness: 1,\n transparent: true,\n opacity: 0.62,\n depthWrite: false,\n side: DOUBLE_SIDE,\n polygonOffset: true,\n polygonOffsetFactor: -2,\n polygonOffsetUnits: -3,\n }),\n scrape: makeMaterial('#1b1a19', {\n roughness: 1,\n transparent: true,\n opacity: 0.55,\n depthWrite: false,\n polygonOffset: true,\n polygonOffsetFactor: -1,\n polygonOffsetUnits: -2,\n }),\n }\n kit.damageMaterials = DAMAGE_MATERIALS\n const _zq = new THREE.Quaternion()\n const _zq2 = new THREE.Quaternion()\n const _zz = new V3(0, 0, 1)\n function orientDecal(m: any, p: any, n: any, ang: any) {\n _zq.setFromUnitVectors(_zz, n)\n _zq2.setFromAxisAngle(n, ang || 0)\n m.quaternion.copy(_zq2.multiply(_zq))\n m.position.copy(p).addScaledVector(n, 0.004)\n }\n function decalMesh(c: any, geo: any, mat: any, p: any, n: any, ang: any, obj?: any) {\n const m = c.add(geo, mat, 0, 0, 0)\n m.castShadow = false\n m.receiveShadow = false\n m.userData.decal = true\n m.raycast = function () {}\n orientDecal(m, p, n, ang)\n if (obj && obj.parent && obj.parent !== c.vehicle) {\n c.root.updateMatrixWorld(true)\n obj.parent.attach(m)\n }\n return m\n }\n function blobGeometry(r: any, rnd: any, jag?: any, ell?: any) {\n const s = new THREE.Shape()\n const nz = I.valueNoise(Math.floor(rnd() * 997))\n const N = 18\n const e = ell || 1\n for (let k = 0; k <= N; k++) {\n const a = (k / N) * PI * 2\n const rr = r * (0.55 + 0.6 * nz(Math.cos(a) * 1.7 + 3, Math.sin(a) * 1.7 + 3)) * (jag && k % 2 ? 0.7 : 1)\n s[k ? 'lineTo' : 'moveTo'](Math.cos(a) * rr * e, Math.sin(a) * rr)\n }\n return new THREE.ShapeGeometry(s)\n }\n /* torn metal: a dark hole with a sharp edge of metal teeth that bend outward */\n function tearDecal(c: any, p: any, n: any, r: any, rnd: any, obj: any) {\n const N = 13\n const pts: any = []\n for (let k = 0; k < N; k++) {\n const a = (k / N) * PI * 2 + (rnd() - 0.5) * 0.3\n const rr = r * (k % 2 ? 0.42 + rnd() * 0.25 : 0.8 + rnd() * 0.35)\n pts.push([Math.cos(a) * rr * 1.25, Math.sin(a) * rr])\n }\n const s = new THREE.Shape()\n pts.forEach(function (q: any, i: any) {\n s[i ? 'lineTo' : 'moveTo'](q[0] * 0.86, q[1] * 0.86)\n })\n const hole = decalMesh(c, new THREE.ShapeGeometry(s), DAMAGE_MATERIALS.hole, p, n, rnd() * 6)\n const hp = hole.parent\n const pos: any = []\n pts.forEach(function (q: any, i: any) {\n const q2 = pts[(i + 1) % N]\n const ox = q[0] * 1.12\n const oy = q[1] * 1.12\n pos.push(q[0] * 0.86, q[1] * 0.86, 0, q2[0] * 0.86, q2[1] * 0.86, 0, ox, oy, 0.025 + rnd() * 0.03)\n })\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n g.computeVertexNormals()\n const e = c.add(g, DAMAGE_MATERIALS.edge, 0, 0, 0)\n e.castShadow = false\n e.userData.decal = true\n e.raycast = function () {}\n e.quaternion.copy(hole.quaternion)\n e.position.copy(hole.position)\n if (obj && obj.parent && obj.parent !== c.vehicle) {\n c.root.updateMatrixWorld(true)\n obj.parent.attach(hole)\n obj.parent.attach(e)\n }\n void hp\n return hole\n }\n /* ---- surface inside the box: rays from outside in ---- */\n const _zr = new THREE.Raycaster()\n /* Every ray of a `zoneDecals` call stays inside one region around the zone (the rays of `zoneSurf` and the strokes of `scratchPath`). Bodywork\n meshes have tens of thousands of triangles and three.js tests all of them per ray, so for those the call raycasts a proxy that holds only the\n triangles whose box meets the region: same triangles that can be hit, same faces and distances, a fraction of the tests. */\n const PROXY_MIN_TRIANGLES = 500\n const STROKE_REACH = 0.6 /* scratchPath: 0.08 above the surface + 0.2 of ray + up to 0.25 along the stroke + the 0.02 of the box test */\n const _pv = new V3()\n const _pm = new THREE.Matrix4()\n function decalRegion(c: any, z: any) {\n const B = z.box\n const lo = [0, 1, 2].map(function (k) {\n return I.boxLo(B, k) - STROKE_REACH\n })\n const hi = [0, 1, 2].map(function (k) {\n return I.boxHi(B, k) + STROKE_REACH\n })\n const a = axisOf(z.dir)\n const dn = z.dir.clone().normalize()\n const sg = z.dir.getComponent(a) > 0 ? 1 : -1\n const outer = sg > 0 ? I.boxLo(B, a) - 0.6 : I.boxHi(B, a) + 0.6\n const far = 0.6 + (I.boxHi(B, a) - I.boxLo(B, a)) + 0.05\n for (let i = 0; i < 8; i++) {\n const p = new V3()\n p.setComponent(a, outer)\n ;[0, 1, 2]\n .filter(function (k) {\n return k !== a\n })\n .forEach(function (k, j) {\n p.setComponent(k, (i >> j) & 1 ? I.boxHi(B, k) : I.boxLo(B, k))\n })\n for (let e = 0; e < 2; e++) {\n const q = e ? p.clone().addScaledVector(dn, far) : p\n for (let k = 0; k < 3; k++) {\n lo[k] = Math.min(lo[k], q.getComponent(k) - 0.05)\n hi[k] = Math.max(hi[k], q.getComponent(k) + 0.05)\n }\n }\n }\n return { lo, hi }\n }\n /* the candidates of a decal call with the heavy meshes cut down to the region of the zone (the others stay as they are) */\n function regionCands(c: any, z: any, cands: any) {\n if (!cands.some(heavy)) return cands\n const R = decalRegion(c, z)\n const Mw = c.vehicle.matrixWorld\n return cands.map(function (o: any) {\n if (!heavy(o)) return o\n /* the ray test would have left the bounds of the mesh computed; the mesh keeps that */\n if (!o.geometry.boundingSphere) o.geometry.computeBoundingSphere()\n if (!o.geometry.boundingBox) o.geometry.computeBoundingBox()\n return proxyIn(o, Mw, R)\n })\n }\n function heavy(o: any) {\n const g = o.geometry\n const pos = g && g.attributes && g.attributes.position\n return (\n o.raycast === THREE.Mesh.prototype.raycast /* a mesh with a raycast of its own (the no-op of marks and puddles) keeps it */ &&\n !o.isSkinnedMesh &&\n !Array.isArray(o.material) &&\n pos &&\n !pos.isInterleavedBufferAttribute &&\n pos.itemSize === 3 &&\n !g.groups.length &&\n !(g.morphAttributes && g.morphAttributes.position) &&\n (g.index ? g.index.count : pos.count) / 3 >= PROXY_MIN_TRIANGLES\n )\n }\n function proxyIn(o: any, Mw: any, R: any) {\n /* the region (vehicle frame) as a box in the frame of the mesh */\n _pm.copy(o.matrixWorld).invert().multiply(Mw)\n const lo = [Infinity, Infinity, Infinity]\n const hi = [-Infinity, -Infinity, -Infinity]\n for (let i = 0; i < 8; i++) {\n _pv.set(i & 1 ? R.hi[0] : R.lo[0], i & 2 ? R.hi[1] : R.lo[1], i & 4 ? R.hi[2] : R.lo[2]).applyMatrix4(_pm)\n for (let k = 0; k < 3; k++) {\n lo[k] = Math.min(lo[k], _pv.getComponent(k))\n hi[k] = Math.max(hi[k], _pv.getComponent(k))\n }\n }\n const g = o.geometry\n const P = g.attributes.position.array\n const ix = g.index ? g.index.array : null\n const n = ix ? ix.length : P.length / 3\n const keep = new Uint32Array(n - (n % 3))\n let nk = 0\n for (let t = 0; t + 2 < n; t += 3) {\n const a = (ix ? ix[t] : t) * 3\n const b = (ix ? ix[t + 1] : t + 1) * 3\n const d = (ix ? ix[t + 2] : t + 2) * 3\n let out = false\n for (let k = 0; k < 3 && !out; k++) {\n const u = P[a + k]\n const v = P[b + k]\n const w = P[d + k]\n out = Math.max(u, v, w) < lo[k] || Math.min(u, v, w) > hi[k]\n }\n if (!out) {\n keep[nk++] = ix ? ix[t] : t\n keep[nk++] = ix ? ix[t + 1] : t + 1\n keep[nk++] = ix ? ix[t + 2] : t + 2\n }\n }\n if (!nk) return null\n /* the triangles of the region (kept) and the ones a single ray needs (scratch, narrowed again in castAt) share one index buffer */\n const kept = keep.slice(0, nk)\n const box = new Float32Array((kept.length / 3) * 6)\n for (let t = 0, j = 0; t < kept.length; t += 3, j += 6) {\n const a = kept[t] * 3\n const b = kept[t + 1] * 3\n const d = kept[t + 2] * 3\n for (let k = 0; k < 3; k++) {\n box[j + k] = Math.min(P[a + k], P[b + k], P[d + k])\n box[j + 3 + k] = Math.max(P[a + k], P[b + k], P[d + k])\n }\n }\n const pg = new THREE.BufferGeometry()\n pg.setAttribute('position', g.attributes.position)\n pg.setIndex(new THREE.BufferAttribute(new Uint32Array(kept.length), 1))\n /* the bounds of the whole mesh hold for the proxy too (the ray test only skips with them), and the proxy shares its positions: no pass over all vertices */\n pg.boundingSphere = g.boundingSphere\n pg.boundingBox = g.boundingBox\n const proxy: any = new THREE.Mesh(pg, o.material)\n proxy.layers.mask = o.layers.mask\n proxy.proxyOf = o\n proxy.kept = kept\n proxy.keptBox = box\n return proxy\n }\n /* the triangles of a proxy whose box meets the box of the ray (in the frame of the mesh): the rest cannot be hit by it */\n function narrowTo(rc: any, proxy: any) {\n const o = proxy.proxyOf\n const ray = rc.ray\n _pm.copy(o.matrixWorld).invert()\n _pv.copy(ray.origin).applyMatrix4(_pm)\n const x0 = _pv.x\n const y0 = _pv.y\n const z0 = _pv.z\n _pv.copy(ray.direction).multiplyScalar(rc.far).add(ray.origin).applyMatrix4(_pm)\n const lo0 = Math.min(x0, _pv.x) - 1e-4\n const lo1 = Math.min(y0, _pv.y) - 1e-4\n const lo2 = Math.min(z0, _pv.z) - 1e-4\n const hi0 = Math.max(x0, _pv.x) + 1e-4\n const hi1 = Math.max(y0, _pv.y) + 1e-4\n const hi2 = Math.max(z0, _pv.z) + 1e-4\n const K = proxy.kept\n const X = proxy.keptBox\n const dst = proxy.geometry.index.array\n let m = 0\n for (let t = 0, j = 0; t < K.length; t += 3, j += 6) {\n if (X[j + 3] < lo0 || X[j] > hi0 || X[j + 4] < lo1 || X[j + 1] > hi1 || X[j + 5] < lo2 || X[j + 2] > hi2) continue\n dst[m++] = K[t]\n dst[m++] = K[t + 1]\n dst[m++] = K[t + 2]\n }\n proxy.geometry.setDrawRange(0, m)\n }\n /* raycast against decal candidates; a hit on a proxy is reported on the mesh it stands for */\n function castAt(rc: any, cands: any) {\n for (let i = 0; i < cands.length; i++) {\n const q = cands[i]\n if (!q.proxyOf) continue\n q.matrixWorld.copy(q.proxyOf.matrixWorld)\n narrowTo(rc, q)\n }\n const hits = rc.intersectObjects(cands, false)\n for (let i = 0; i < hits.length; i++) if (hits[i].object.proxyOf) hits[i].object = hits[i].object.proxyOf\n return hits\n }\n function zoneCands(c: any, z: any, inv: any, glassToo: any) {\n const out: any = []\n c.vehicle.traverse(function (o: any) {\n if (!o.isMesh || o.userData.decal || o.userData.ghost || !o.geometry || o.isSprite) return\n for (let q = o; q && q !== c.vehicle; q = q.parent) if (!q.visible) return\n if (o.userData.glass && !glassToo) return\n const ow = I.ownerOf(c, o)\n if (ow && ow !== z) return\n if (!skinOK(c, z, o, ow)) return\n if (!o.geometry.boundingBox) o.geometry.computeBoundingBox()\n if (I.boxIntersects(z.box, I.localBox(c, o, inv))) out.push(o)\n })\n return out\n }\n /* decals only on bodywork: shell, paint, parts of the zone itself (or any mesh with anyMesh/part) */\n const _dsetC = new WeakMap()\n function skinOK(c: any, z: any, o: any, ow: any) {\n if (ow === z || z.anyMesh || z.type === 'part' || z.type === 'wheel') return true\n if (c.paints && c.paints.has(o.material)) return true\n let ds = _dsetC.get(c.deform)\n if (!ds) {\n ds = new Set(c.deform)\n _dsetC.set(c.deform, ds)\n }\n return ds.has(o) || c.deform.indexOf(o) >= 0\n }\n function axisOf(d: any) {\n const a = Math.abs(d.x) >= Math.abs(d.y) && Math.abs(d.x) >= Math.abs(d.z) ? 0 : Math.abs(d.y) >= Math.abs(d.z) ? 1 : 2\n return a\n }\n function zoneSurf(c: any, z: any, n: any, rnd: any, cands: any, o?: any) {\n o = o || {}\n const out = []\n const B = z.box\n const d = z.dir\n const a = axisOf(d)\n const ax = [0, 1, 2].filter(function (k) {\n return k !== a\n })\n const Mw = c.vehicle.matrixWorld\n const inv = I.worldInverseOf(c)\n const sg = d.getComponent(a) > 0 ? 1 : -1\n const outer = sg > 0 ? I.boxLo(B, a) - 0.6 : I.boxHi(B, a) + 0.6\n const u0 = o.u0 == null ? 0.1 : o.u0\n const u1 = o.u1 == null ? 0.9 : o.u1\n for (let t = 0; t < n * 4 && out.length < n; t++) {\n const org = new V3()\n org.setComponent(a, outer)\n ax.forEach(function (k) {\n org.setComponent(k, I.boxLo(B, k) + (I.boxHi(B, k) - I.boxLo(B, k)) * (u0 + (u1 - u0) * rnd()))\n })\n _zr.set(org.clone().applyMatrix4(Mw), d.clone().transformDirection(Mw))\n _zr.far = 0.6 + (I.boxHi(B, a) - I.boxLo(B, a)) + 0.05\n const hits = castAt(_zr, cands)\n for (let i = 0; i < hits.length; i++) {\n const h = hits[i]\n if (!h.face) continue\n const lp = h.point.clone().applyMatrix4(inv)\n if (!I.boxContains(B, lp.x, lp.y, lp.z, 0.02)) break\n const nn = h.face.normal.clone().transformDirection(h.object.matrixWorld).transformDirection(inv)\n if (nn.dot(d) > 0) nn.negate()\n out.push({ p: lp, n: nn, obj: h.object })\n break\n }\n }\n return out\n }\n /* scratch that follows the surface: points along the stroke are projected onto the bodywork and the stroke stops where the bodywork ends\n (no straight stick sticking out of the body curve) */\n const _rt = new THREE.Raycaster()\n function scratchPath(c: any, s: any, len: any, ang: any, cands: any, B: any) {\n const n = s.n.clone().normalize()\n const t = Math.abs(n.y) < 0.9 ? new V3().crossVectors(new V3(0, 1, 0), n) : new V3().crossVectors(new V3(1, 0, 0), n)\n t.normalize().applyAxisAngle(n, ang || 0)\n if (!cands || !cands.length) return null\n const Mw = c.vehicle.matrixWorld\n const inv = I.worldInverseOf(c)\n const M = Math.max(3, Math.round(len / 0.04))\n const pts = []\n function at(k: any) {\n const q = s.p.clone().addScaledVector(t, (len * 0.5 * k) / M)\n _rt.set(q.clone().addScaledVector(n, 0.08).applyMatrix4(Mw), n.clone().negate().transformDirection(Mw))\n _rt.far = 0.2\n const h = castAt(_rt, cands).find(function (x: any) {\n return x.face\n })\n if (!h) return null\n const lp = h.point.clone().applyMatrix4(inv)\n if (B && !I.boxContains(B, lp.x, lp.y, lp.z, 0.02)) return null\n const nn = h.face.normal.clone().transformDirection(h.object.matrixWorld).transformDirection(inv)\n if (nn.dot(n) < 0) nn.negate()\n if (nn.dot(n) < 0.55) return null\n return { p: lp, n: nn }\n }\n const c0 = at(0)\n if (!c0) return null\n pts.push(c0)\n for (let k = 1; k <= M; k++) {\n const a = at(k)\n if (!a) break\n pts.push(a)\n }\n for (let k = -1; k >= -M; k--) {\n const b = at(k)\n if (!b) break\n pts.unshift(b)\n }\n return pts.length >= 3 ? pts : null\n }\n function ribbonGeo(pts: any, wd: any, lift: any) {\n const pos: any = []\n const idx: any = []\n const N = pts.length\n const tg = new V3()\n const sd = new V3()\n pts.forEach(function (q: any, i: any) {\n const a = pts[Math.max(0, i - 1)].p\n const b = pts[Math.min(N - 1, i + 1)].p\n tg.subVectors(b, a).normalize()\n const e = Math.min(i, N - 1 - i) / Math.max(1, (N - 1) / 2)\n const w = wd * 0.5 * (0.25 + 0.75 * Math.min(1, e * 2.2))\n sd.crossVectors(q.n, tg).normalize().multiplyScalar(w)\n const base = q.p.clone().addScaledVector(q.n, lift)\n pos.push(base.x + sd.x, base.y + sd.y, base.z + sd.z, base.x - sd.x, base.y - sd.y, base.z - sd.z)\n if (i) {\n const j = (i - 1) * 2\n idx.push(j, j + 1, j + 2, j + 1, j + 3, j + 2)\n }\n })\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.Float32BufferAttribute(pos, 3))\n g.setIndex(idx)\n g.computeVertexNormals()\n return g\n }\n function scratchDecal(c: any, s: any, len: any, wd: any, mat: any, ang: any, cands: any, B: any, pts?: any) {\n pts = pts || scratchPath(c, s, len, ang, cands, B)\n if (!pts) return null\n const m = c.add(ribbonGeo(pts, wd, mat === DAMAGE_MATERIALS.deep ? 0.0038 : 0.003), mat, 0, 0, 0)\n m.castShadow = false\n m.receiveShadow = false\n m.userData.decal = true\n m.raycast = function () {}\n if (s.obj && s.obj.parent && s.obj.parent !== c.vehicle) {\n c.root.updateMatrixWorld(true)\n s.obj.parent.attach(m)\n }\n return m\n }\n /* scratches, chipped paint (grey primer and metal), rust and torn metal */\n function zoneDecals(c: any, z: any, spec: any, cands: any) {\n const R = c.rand\n const need =\n (spec.fine || 0) +\n (spec.deep || 0) +\n (spec.chip || 0) +\n (spec.rust || 0) +\n (spec.tear || 0) +\n (spec.ding || 0) +\n (spec.soot || 0) +\n (spec.crater || 0)\n if (!need) return []\n cands = regionCands(c, z, cands).filter(Boolean)\n const S = zoneSurf(c, z, need + 2, R, cands)\n let k = 0\n const ang0 = R() * PI\n function nx() {\n return S.length ? S[k++ % S.length] : null\n }\n let s\n let i\n for (i = 0; i < (spec.fine || 0); i++)\n if ((s = nx())) scratchDecal(c, s, 0.12 + R() * 0.18, 0.0035, DAMAGE_MATERIALS.fine, ang0 + (R() - 0.5) * 0.4, cands, z.box)\n for (i = 0; i < (spec.deep || 0); i++)\n if ((s = nx())) {\n const L2 = 0.18 + R() * 0.26\n const an = ang0 + (R() - 0.5) * 0.5\n const pth = scratchPath(c, s, L2, an, cands, z.box)\n if (pth) {\n scratchDecal(c, s, L2, 0.014, DAMAGE_MATERIALS.primer, an, cands, z.box, pth)\n scratchDecal(c, s, L2, 0.005, DAMAGE_MATERIALS.deep, an, cands, z.box, pth.slice(1, -1).length >= 3 ? pth.slice(1, -1) : pth)\n }\n }\n for (i = 0; i < (spec.chip || 0); i++)\n if ((s = nx())) {\n const r = 0.025 + R() * 0.035\n decalMesh(c, blobGeometry(r, R), DAMAGE_MATERIALS.primer, s.p, s.n, R() * 6, s.obj)\n const mm = decalMesh(c, blobGeometry(r * 0.55, R), DAMAGE_MATERIALS.metal, s.p.clone().addScaledVector(s.n, 0.0008), s.n, R() * 6, s.obj)\n void mm\n }\n for (i = 0; i < (spec.rust || 0); i++)\n if ((s = nx())) {\n const rr2 = 0.05 + R() * 0.08\n decalMesh(c, blobGeometry(rr2, R, false, 1.4), DAMAGE_MATERIALS.rust, s.p, s.n, R() * 6, s.obj)\n decalMesh(c, blobGeometry(rr2 * 0.5, R), DAMAGE_MATERIALS.rust2, s.p.clone().addScaledVector(s.n, 0.0008), s.n, R() * 6, s.obj)\n }\n /* soot (impact burn) and impact crater (metal ring with a dark core): armour and hull */\n for (i = 0; i < (spec.soot || 0); i++)\n if ((s = nx())) decalMesh(c, blobGeometry(0.14 + R() * 0.12, R, false, 1.5), DAMAGE_MATERIALS.soot, s.p, s.n, R() * 6, s.obj)\n for (i = 0; i < (spec.crater || 0); i++)\n if ((s = nx())) {\n const rc = 0.035 + R() * 0.035\n decalMesh(c, blobGeometry(rc * 1.5, R, true), DAMAGE_MATERIALS.metal, s.p, s.n, R() * 6, s.obj)\n decalMesh(c, blobGeometry(rc * 0.8, R), DAMAGE_MATERIALS.hole, s.p.clone().addScaledVector(s.n, 0.0008), s.n, R() * 6, s.obj)\n }\n const tears = []\n for (i = 0; i < (spec.tear || 0); i++) if ((s = nx())) tears.push(tearDecal(c, s.p, s.n, 0.07 + R() * 0.06, R, s.obj))\n return S\n }\n\n Object.assign(I, {\n dmat,\n DAMAGE_MATERIALS,\n _zq,\n _zq2,\n _zz,\n orientDecal,\n decalMesh,\n blobGeometry,\n tearDecal,\n _zr,\n zoneCands,\n _dsetC,\n skinOK,\n axisOf,\n zoneSurf,\n _rt,\n scratchPath,\n ribbonGeo,\n scratchDecal,\n zoneDecals,\n })\n}\n","/** Zone dent field: deterministic vertex displacement inside a zone box. */\nimport type { Kit } from './types'\nimport { smooth } from './util'\n\nexport function installZoneDent(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n const { cutGeometry } = I\n\n /* ---- dent masked by the box (follows the panel) ---- */\n function sm(t: any) {\n return smooth(t)\n }\n function subdivIn(geo: any, rel: any, B: any, maxLen: any) {\n const a = geo.attributes.position.array\n /* the result grows from the size of the mesh (a typed array: a plain array of this many numbers is the slowest part of the call) */\n let out = new Float32Array(a.length + 4096)\n let used = 0\n const push = function (a0: number, a1: number, a2: number, b0: number, b1: number, b2: number, c0: number, c1: number, c2: number) {\n if (used + 9 > out.length) {\n const bigger = new Float32Array(out.length * 2)\n bigger.set(out)\n out = bigger\n }\n out[used] = a0\n out[used + 1] = a1\n out[used + 2] = a2\n out[used + 3] = b0\n out[used + 4] = b1\n out[used + 5] = b2\n out[used + 6] = c0\n out[used + 7] = c1\n out[used + 8] = c2\n used += 9\n }\n const e = 0.15\n function d(p: any, q: any) {\n return Math.hypot(p[0] - q[0], p[1] - q[1], p[2] - q[2])\n }\n function mid(p: any, q: any) {\n return [(p[0] + q[0]) / 2, (p[1] + q[1]) / 2, (p[2] + q[2]) / 2]\n }\n function tri(A: any, Bv: any, C: any, depth: any) {\n const ab = d(A, Bv)\n const bc = d(Bv, C)\n const ca = d(C, A)\n const mx = Math.max(ab, bc, ca)\n if (mx <= maxLen || depth > 9) {\n push(A[0], A[1], A[2], Bv[0], Bv[1], Bv[2], C[0], C[1], C[2])\n return\n }\n if (mx === ab) {\n const D = mid(A, Bv)\n tri(A, D, C, depth + 1)\n tri(D, Bv, C, depth + 1)\n } else if (mx === bc) {\n const E2 = mid(Bv, C)\n tri(A, Bv, E2, depth + 1)\n tri(A, E2, C, depth + 1)\n } else {\n const F2 = mid(C, A)\n tri(A, Bv, F2, depth + 1)\n tri(F2, Bv, C, depth + 1)\n }\n }\n /* the box test of each triangle runs on the raw array (what is outside the zone is the most of the mesh and is copied as it is) */\n const M = rel.elements\n const at = function (x: number, y: number, z: number, k: number) {\n const w = 1 / (M[3] * x + M[7] * y + M[11] * z + M[15])\n return k === 0 ? (M[0] * x + M[4] * y + M[8] * z + M[12]) * w : k === 1 ? (M[1] * x + M[5] * y + M[9] * z + M[13]) * w : (M[2] * x + M[6] * y + M[10] * z + M[14]) * w\n }\n const lo = [B.x0 - e, B.y0 - e, B.z0 - e]\n const hi = [B.x1 + e, B.y1 + e, B.z1 + e]\n for (let i = 0; i < a.length; i += 9) {\n let outside = false\n for (let k = 0; k < 3 && !outside; k++) {\n const p = at(a[i], a[i + 1], a[i + 2], k)\n const q = at(a[i + 3], a[i + 4], a[i + 5], k)\n const r = at(a[i + 6], a[i + 7], a[i + 8], k)\n outside = Math.max(p, q, r) < lo[k] || Math.min(p, q, r) > hi[k]\n }\n if (outside) push(a[i], a[i + 1], a[i + 2], a[i + 3], a[i + 4], a[i + 5], a[i + 6], a[i + 7], a[i + 8])\n else tri([a[i], a[i + 1], a[i + 2]], [a[i + 3], a[i + 4], a[i + 5]], [a[i + 6], a[i + 7], a[i + 8]], 0)\n }\n const g = new THREE.BufferGeometry()\n g.setAttribute('position', new THREE.BufferAttribute(out.slice(0, used), 3))\n g.userData.crease = true\n g.userData.p0 = null\n return g\n }\n /* meshes this zone may dent: shell (c.deform), paint, its own parts and, with anyMesh, any mesh */\n function dentTargets(c: any, z: any, inv: any) {\n const dset = new Set(c.deform)\n const out: any = []\n c.vehicle.traverse(function (o: any) {\n if (!o.isMesh || o.userData.decal || o.userData.ghost || !o.geometry || !o.geometry.attributes.position) return\n for (let q = o; q && q !== c.vehicle; q = q.parent) if (!q.visible) return\n const ow = I.ownerOf(c, o)\n const isG = !!o.userData.glass\n if (isG && !(z.alsoGlass || ow === z)) return\n if (ow && ow !== z && !(isG && z.alsoGlass)) return\n const ok = dset.has(o) || (c.paints && c.paints.has(o.material)) || ow === z || z.anyMesh\n if (!ok) return\n if (!o.geometry.boundingBox) o.geometry.computeBoundingBox()\n if (!I.boxIntersects(z.box, I.localBox(c, o, inv))) return\n out.push({ o: o, deform: dset.has(o) })\n })\n return out\n }\n /* the box `B` (zone frame) seen from the frame that `m` maps into it: [x0, y0, z0, x1, y1, z1] of its 8 corners, widened a hair */\n function boxInFrame(B: any, m: any, tmp: any) {\n const r = [Infinity, Infinity, Infinity, -Infinity, -Infinity, -Infinity]\n for (let i = 0; i < 8; i++) {\n tmp.set(i & 1 ? B.x1 : B.x0, i & 2 ? B.y1 : B.y0, i & 4 ? B.z1 : B.z0).applyMatrix4(m)\n for (let k = 0; k < 3; k++) {\n r[k] = Math.min(r[k], tmp.getComponent(k) - 1e-4)\n r[k + 3] = Math.max(r[k + 3], tmp.getComponent(k) + 1e-4)\n }\n }\n return r\n }\n /* dents: [{ u, v (centre, absolute tangent coordinates), ru, rv (radii in m), depth }], crease: { v, w, depth } */\n function zoneDent(c: any, z: any, dents: any, dirty: any, opt: any) {\n opt = opt || {}\n const B = z.box\n const d = z.dir\n const a = I.axisOf(d)\n const ax = [0, 1, 2].filter(function (k) {\n return k !== a\n })\n const sg = d.getComponent(a) > 0 ? 1 : -1\n const outer = sg > 0 ? I.boxLo(B, a) : I.boxHi(B, a)\n const depthA = I.boxHi(B, a) - I.boxLo(B, a)\n const m = c.meta\n const hu = (I.boxHi(B, ax[0]) - I.boxLo(B, ax[0])) / 2\n const hv = (I.boxHi(B, ax[1]) - I.boxLo(B, ax[1])) / 2\n const cu = I.boxLo(B, ax[0]) + hu\n const cv = I.boxLo(B, ax[1]) + hv\n const C = new V3(((m.front || 1) + (m.rear || -1)) / 2, (m.clearance || 0.3) + (m.bodyHeight || 0.6) * 0.5, 0)\n const edge = opt.edge || 0.28\n function field(p: any) {\n if (!I.boxContains(B, p.x, p.y, p.z, 0)) return 0\n const u = p.getComponent(ax[0])\n const v = p.getComponent(ax[1])\n const su = (u - cu) / hu\n const sv = (v - cv) / hv\n const mask = sm((1 - Math.abs(su)) / edge) * sm((1 - Math.abs(sv)) / edge)\n const tin = Math.abs(p.getComponent(a) - outer) / Math.max(0.05, depthA)\n const md = 1 - sm((tin - 0.5) / 0.5)\n let amt = 0\n dents.forEach(function (D: any) {\n const r = Math.hypot((u - D.u) / D.ru, (v - D.v) / D.rv)\n if (r < 1) amt = Math.max(amt, D.depth * sm(1 - r) * (1 + 0.12 * Math.sin(u * 9.1 + v * 5.3 + D.ph)))\n })\n if (opt.crease) {\n const cr = opt.crease\n const t = 1 - Math.abs(v - cr.v) / cr.w\n if (t > 0) amt = Math.max(amt, cr.depth * sm(t) * sm((1 - Math.abs(su)) / 0.45))\n }\n amt *= mask * md\n const lim = -((p.x - C.x) * d.x + (p.y - C.y) * d.y + (p.z - C.z) * d.z) - 0.05\n return Math.max(0, Math.min(amt, lim))\n }\n const inv = I.worldInverseOf(c)\n const T = opt.targets || dentTargets(c, z, inv)\n const rel = new THREE.Matrix4()\n const irel = new THREE.Matrix4()\n const v = new V3()\n T.forEach(function (t: any) {\n const msh = t.o\n let g = msh.geometry\n rel.multiplyMatrices(inv, msh.matrixWorld)\n if (!t.deform && !msh.userData.zCloned) {\n g = msh.geometry = g.clone()\n msh.userData.zCloned = true\n }\n let boundsDue = false\n const nonIdx = !g.index\n const onlyPos = Object.keys(g.attributes).every(function (k) {\n return k === 'position' || k === 'normal'\n })\n if (t.deform && nonIdx && onlyPos && !msh.userData.glass && !opt.noSub) {\n const ng = subdivIn(g, rel, B, opt.sub || 0.075)\n g.dispose()\n g = msh.geometry = ng\n boundsDue = true /* computed once, after the vertices moved */\n dirty.add(msh)\n }\n irel.copy(rel).invert()\n const pos = g.attributes.position\n let changed = false\n /* the box of the zone in the frame of the mesh: a vertex outside it is outside the field (it returns 0 there), so it skips the transform */\n const near = boxInFrame(B, irel, v)\n for (let i = 0; i < pos.count; i++) {\n v.fromBufferAttribute(pos, i)\n if (v.x < near[0] || v.x > near[3] || v.y < near[1] || v.y > near[4] || v.z < near[2] || v.z > near[5]) continue\n v.applyMatrix4(rel)\n const f = field(v)\n if (f <= 1e-5) continue\n v.addScaledVector(d, f)\n if (opt.extra) opt.extra(v, f)\n v.applyMatrix4(irel)\n pos.setXYZ(i, v.x, v.y, v.z)\n changed = true\n }\n if (opt.extraAll) {\n for (let j = 0; j < pos.count; j++) {\n v.fromBufferAttribute(pos, j).applyMatrix4(rel)\n if (opt.extraAll(v)) {\n v.applyMatrix4(irel)\n pos.setXYZ(j, v.x, v.y, v.z)\n changed = true\n }\n }\n }\n if (changed) {\n pos.needsUpdate = true\n dirty.add(msh)\n }\n if (changed || boundsDue) {\n g.computeBoundingSphere()\n g.computeBoundingBox()\n }\n })\n /* rigid parts (trim, handles, liner, plate) follow the field at their centre */\n const dset = new Set(c.deform)\n const moved: any = []\n c.vehicle.children.forEach(function (o: any) {\n if (dset.has(o) || o.userData.noFollow || o.userData.decal || o.isSprite || o.userData.glass) return\n if (!(o.isMesh || (o.isGroup && o.userData.rigid))) return\n const ow = I.ownerOf(c, o)\n if (ow && ow !== z) return\n if (\n T.some(function (t: any) {\n return t.o === o\n })\n )\n return\n const bb = I.localBox(c, o, inv)\n if (bb.isEmpty()) return\n const sz = bb.getSize(new V3())\n if (Math.max(sz.x, sz.y, sz.z) > 1.4) return\n const cen = bb.getCenter(new V3())\n const f = field(cen)\n if (f <= 1e-4) return\n o.position.addScaledVector(d, f)\n moved.push(o)\n })\n return { field: field, moved: moved, ax: ax, a: a, cu: cu, cv: cv, hu: hu, hv: hv, outer: outer }\n }\n /* cuts the skin inside a rectangle of the zone; returns the cut piece (or null). rect: [u0, u1, v0, v1] absolute */\n function cutPanel(c: any, z: any, rect: any, keep: any, dirty: any, o: any) {\n o = o || {}\n const B = z.box\n const d = z.dir\n const a = I.axisOf(d)\n const ax = [0, 1, 2].filter(function (k) {\n return k !== a\n })\n const inv = I.worldInverseOf(c)\n const outN = d.clone().negate()\n const T = dentTargets(c, z, inv).filter(function (t: any) {\n return !t.o.userData.glass && (t.deform || z.cutAll || z.anyMesh || (c.paints && c.paints.has(t.o.material)))\n })\n const pieces: any = []\n const rel = new THREE.Matrix4()\n const v = new V3()\n const nv = new V3()\n const nm = new THREE.Matrix3()\n T.forEach(function (t: any) {\n const msh = t.o\n const g = msh.geometry\n if (!g.attributes.position.count) return\n rel.multiplyMatrices(inv, msh.matrixWorld)\n nm.getNormalMatrix(rel)\n const bb = I.localBox(c, msh, inv)\n const whole =\n bb.min.x >= B.x0 - 0.02 &&\n bb.max.x <= B.x1 + 0.02 &&\n bb.min.y >= B.y0 - 0.02 &&\n bb.max.y <= B.y1 + 0.02 &&\n bb.min.z >= B.z0 - 0.02 &&\n bb.max.z <= B.z1 + 0.02\n if (whole && !t.deform) {\n pieces.push({ mesh: msh, whole: true })\n return\n }\n const test = {\n tag: 'part',\n sel:\n o.anyN || z.cutAll\n ? null\n : function (n: any) {\n nv.copy(n).applyMatrix3(nm).normalize()\n return nv.dot(outN) > 0.3\n },\n sdf: function (x: any, y: any, zz: any) {\n v.set(x, y, zz).applyMatrix4(rel)\n let q = -1e9\n q = Math.max(\n q,\n rect[0] - v.getComponent(ax[0]),\n v.getComponent(ax[0]) - rect[1],\n rect[2] - v.getComponent(ax[1]),\n v.getComponent(ax[1]) - rect[3],\n )\n q = Math.max(q, I.boxLo(B, a) - v.getComponent(a), v.getComponent(a) - I.boxHi(B, a))\n return q\n },\n }\n const r = cutGeometry(g, [test])\n const cg = r.cut.part\n if (!cg || !cg.attributes.position.count) return\n g.dispose()\n msh.geometry = r.geo\n r.geo.computeBoundingSphere()\n r.geo.computeBoundingBox()\n dirty.add(msh)\n if (!keep) {\n cg.dispose()\n pieces.push({ cut: true })\n return\n }\n const pm = new THREE.Mesh(cg, msh.material)\n pm.castShadow = true\n pm.receiveShadow = true\n rel.decompose(pm.position, pm.quaternion, pm.scale)\n c.vehicle.add(pm)\n pm.updateMatrixWorld(true)\n pieces.push({ mesh: pm, cut: true })\n })\n return pieces\n }\n /* groups meshes into a pivot (in c.vehicle coordinates) keeping the world position */\n function pivotOf(c: any, objs: any, at: any) {\n const piv = new THREE.Group()\n piv.position.copy(at)\n piv.userData.rigid = true\n piv.userData.noFollow = true\n c.vehicle.add(piv)\n c.root.updateMatrixWorld(true)\n objs.forEach(function (o: any) {\n if (o && o.parent) {\n piv.attach(o)\n o.traverse(function (x: any) {\n x.userData.noFollow = true\n })\n const di = c.deform.indexOf(o)\n if (di >= 0) c.deform.splice(di, 1)\n }\n })\n return piv\n }\n\n Object.assign(I, { sm, subdivIn, dentTargets, zoneDent, cutPanel, pivotOf })\n}\n","/** Per-zone damage for body panels: doors, lids, hoods, roofs, hulls and wings. */\nimport type { Kit } from './types'\nimport { clamp } from './util'\n\nexport function installDamagePanels(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n const { MATERIALS } = I\n\n /* ---- body panel (door, fender, side panel, roof, lid, armour, hull, wing) ---- */\n function panelBand(c: any, z: any, b: any, dirty: any) {\n const R = c.rand\n const inv = I.worldInverseOf(c)\n const B = z.box\n const d = z.dir\n const a = I.axisOf(d)\n const ax = [0, 1, 2].filter(function (k) {\n return k !== a\n })\n const u0 = I.boxLo(B, ax[0])\n const u1 = I.boxHi(B, ax[0])\n const v0 = I.boxLo(B, ax[1])\n const v1 = I.boxHi(B, ax[1])\n const lu = u1 - u0\n const lv = v1 - v0\n const depA = I.boxHi(B, a) - I.boxLo(B, a)\n const stiff = clamp(c.meta.stiff || 0, 0, 1) * (z.fxKey === 'armor' ? 1 : 0.6)\n const dk = 1 - 0.7 * stiff\n if (b === 0) {\n if (z.health < 92) I.zoneDecals(c, z, { fine: 2 }, I.zoneCands(c, z, inv))\n return\n }\n if (b === 4) {\n const mg = Math.min(0.05, lu * 0.08, lv * 0.08)\n let rect = [u0 + mg, u1 - mg, v0 + mg, v1 - mg]\n if (z.type === 'door' || z.type === 'lid') rect = [u0 + 0.03, u1 - 0.03, v0 + Math.min(0.08, lv * 0.1), v1 - 0.02]\n const pcs = I.cutPanel(c, z, rect, false, dirty)\n pcs.forEach(function (q: any) {\n if (q.whole) I.hideObj(c, q.mesh)\n })\n followersIn(c, z, inv).forEach(function (o: any) {\n I.hideObj(c, o)\n })\n /* owned parts (propeller, pylon, siren) disappear whole: cutting only the skin left pieces floating */\n z.owned.forEach(function (o: any) {\n if (o.parent && c.wheels.indexOf(o) < 0 && !o.userData.glass) I.hideObj(c, o)\n })\n c.spin = c.spin.filter(function (sp: any) {\n return I.shown(c, sp.o)\n })\n if (z.type === 'roof') roofOff(c, z, inv)\n if (z.fxKey === 'tail_cone' && c.meta.kind === 'heli') tailOff(c, z, inv)\n ;(z.mirrors || []).forEach(function (o: any) {\n I.hideObj(c, o)\n })\n if (z.type === 'door')\n windowsOver(c, z, inv).forEach(function (g: any) {\n I.glassBand(c, z, g, 4)\n })\n I.zoneDecals(c, z, { rust: 3, deep: 2 }, I.zoneCands(c, z, I.worldInverseOf(c)))\n return\n }\n const dents = []\n const opt: any = {}\n if (b === 1) {\n for (let i = 0; i < 3; i++)\n dents.push({\n u: u0 + lu * (0.2 + R() * 0.6),\n v: v0 + lv * (0.25 + R() * 0.5),\n ru: 0.06 + R() * 0.04,\n rv: 0.06 + R() * 0.04,\n depth: (0.012 + R() * 0.016) * dk,\n ph: R() * 6,\n })\n I.zoneDent(c, z, dents, dirty, { edge: 0.15 })\n I.zoneDecals(c, z, { deep: 4, chip: 3, fine: 2 }, I.zoneCands(c, z, inv))\n return\n }\n /* the dent follows the panel: an ellipse stretched along the long axis, with a crease along it */\n const longU = lu >= lv\n const D0 = b === 2 ? 0.06 + R() * 0.06 : 0.15 + R() * 0.15\n const maxD = Math.max(0.03, Math.min(D0, depA * 0.55, 0.3)) * dk\n const uc = u0 + lu * (0.4 + R() * 0.2)\n const vc = v0 + lv * (0.4 + R() * 0.2)\n dents.push({ u: uc, v: vc, ru: lu * (longU ? 0.48 : 0.38), rv: lv * (longU ? 0.38 : 0.48), depth: maxD, ph: R() * 6 })\n if (b === 3)\n dents.push({\n u: u0 + lu * (0.2 + R() * 0.6),\n v: v0 + lv * (0.25 + R() * 0.5),\n ru: lu * 0.3,\n rv: lv * 0.3,\n depth: maxD * 0.8,\n ph: R() * 6,\n })\n opt.crease = longU ? null : null\n if (longU) opt.crease = { v: vc + (R() - 0.5) * lv * 0.15, w: Math.min(0.09, lv * 0.2), depth: maxD * 0.55 }\n if (b === 3)\n opt.extra = function (p: any, f: any) {\n p.addScaledVector(d, 0.012 * Math.sin(p.getComponent(ax[0]) * 17) * Math.min(1, f / 0.05))\n }\n /* dented door: the rear edge of the door sticks out (misaligned gap) */\n if (z.type === 'door' && b >= 2) {\n const hingeHi = z.hinge !== 'rear'\n const xe = hingeHi ? B.x0 : B.x1\n const sideOut = d.clone().negate()\n opt.extraAll = function (p: any) {\n if (!I.boxContains(B, p.x, p.y, p.z, 0)) return false\n const t = 1 - Math.abs(p.x - xe) / 0.12\n if (t <= 0) return false\n const tin = Math.abs(p.getComponent(a) - (d.getComponent(a) > 0 ? B.z0 : B.z1))\n if (tin > 0.2) return false\n p.addScaledVector(sideOut, 0.014 * I.sm(t) * I.sm((p.y - B.y0) / 0.1) * I.sm((B.y1 - p.y) / 0.1))\n return true\n }\n }\n I.zoneDent(c, z, dents, dirty, opt)\n if (z.fxKey === 'tail_cone' && c.meta.kind === 'heli') {\n const kxx = B.x0 + (B.x1 - B.x0) * (b === 2 ? 0.55 : 0.62)\n const kyy = (B.y0 + B.y1) / 2\n I.bendAft(c, z, kxx, kyy, b === 2 ? 0.035 : 0.16, dirty)\n }\n if (z.mirrors && z.mirrors.length) mirrorHang(c, z, b === 2 ? 0.95 : 1.3)\n if (b === 3) {\n if (z.type === 'door') doorHang(c, z, dirty, inv)\n else if (z.type === 'lid') lidHang(c, z, dirty)\n else if (z.type !== 'roof' && !z.noFlap) flapHang(c, z, dirty)\n if (z.type === 'door')\n windowsOver(c, z, I.worldInverseOf(c)).forEach(function (g: any) {\n I.glassBand(c, z, g, 3)\n })\n }\n const cands = I.zoneCands(c, z, I.worldInverseOf(c))\n /* armour barely dents and fibre hulls crack: the band shows through the marks (craters, soot, chips) */\n if (z.fxKey === 'armor') I.zoneDecals(c, z, b === 2 ? { crater: 5, soot: 2 } : { crater: 8, soot: 4, tear: 1 }, cands)\n else if (z.fxKey === 'hull') I.zoneDecals(c, z, b === 2 ? { deep: 5, chip: 6 } : { deep: 4, chip: 4, soot: 2, tear: 2 }, cands)\n if (b === 2) I.zoneDecals(c, z, { deep: 4, chip: 3 }, cands)\n else\n I.zoneDecals(\n c,\n z,\n {\n deep: 4,\n chip: z.plastic ? 0 : 2,\n rust: z.plastic ? 0 : 3,\n tear: z.plastic || z.noFlap || z.type === 'door' || z.type === 'lid' ? 0 : 1,\n },\n cands,\n )\n if (z.type === 'door' && b === 2) doorGap(c, z, b, cands)\n }\n /* torn-off roof: the headliner and whatever is attached on top (beacon, light bar, roof rack, roof lights) come away with it */\n function roofOff(c: any, z: any, inv: any) {\n const B = z.box\n const top = c.meta.top || B.y1\n c.vehicle.traverse(function (o: any) {\n if (!o.isMesh || !o.visible || o.userData.decal || o.userData.glass) return\n if (o.material === MATERIALS.headliner) {\n const hb = I.localBox(c, o, inv)\n const hc = hb.getCenter(new V3())\n if (I.boxContains(B, hc.x, hc.y, hc.z, 0.12)) I.hideObj(c, o)\n }\n })\n c.vehicle.children.forEach(function (o: any) {\n if (!o.visible || o.userData.decal || o.isSprite || o.userData.glass || c.deform.indexOf(o) >= 0 || c.wheels.indexOf(o) >= 0) return\n const ow = I.ownerOf(c, o)\n if (ow && ow !== z) return\n const bb = I.localBox(c, o, inv)\n if (bb.isEmpty()) return\n const cen = bb.getCenter(new V3())\n const sz = bb.getSize(new V3())\n if (Math.max(sz.x, sz.z) > 2.2) return\n if (\n (bb.min.y > top - 0.1 || bb.min.y > B.y0 + (B.y1 - B.y0) * 0.5 - 0.1) &&\n cen.x > B.x0 - 0.1 &&\n cen.x < B.x1 + 0.1 &&\n Math.abs(cen.z) < Math.max(Math.abs(B.z0), Math.abs(B.z1)) + 0.1\n )\n I.hideObj(c, o)\n })\n }\n /* torn-off tail cone: everything behind the start of the cone (pylon, fin, tail rotor, tail skid) disappears, from any zone */\n function tailOff(c: any, z: any, inv: any) {\n const kx = z.box.x1 - (z.box.x1 - z.box.x0) * 0.15\n c.vehicle.children.forEach(function (o: any) {\n if (!o.visible || o.userData.decal || o.isSprite) return\n const bb = I.localBox(c, o, inv)\n if (bb.isEmpty()) return\n if (bb.max.x < kx + 0.05) I.hideObj(c, o)\n })\n c.spin = c.spin.filter(function (sp: any) {\n return I.shown(c, sp.o)\n })\n }\n function followersIn(c: any, z: any, inv: any) {\n const dset = new Set(c.deform)\n const out: any = []\n c.vehicle.children.forEach(function (o: any) {\n if (dset.has(o) || o.userData.decal || o.isSprite || o.userData.glass || !o.visible) return\n if (!(o.isMesh || (o.isGroup && o.userData.rigid))) return\n const ow = I.ownerOf(c, o)\n if (ow && ow !== z) return\n if (c.wheels.indexOf(o) >= 0) return\n const bb = I.localBox(c, o, inv)\n if (bb.isEmpty()) return\n const cen = bb.getCenter(new V3())\n const sz = bb.getSize(new V3())\n if (!I.boxContains(z.box, cen.x, cen.y, cen.z, 0) || Math.max(sz.x, sz.y, sz.z) > 1.4) return\n if (sz.getComponent(I.axisOf(z.dir)) > 0.09) return /* only thin parts along the direction of the bodywork (liner, trim, handle, plate) */\n out.push(o)\n })\n return out\n }\n function windowsOver(c: any, z: any, inv: any) {\n return c.glass.filter(function (g: any) {\n if (!g.parent || !g.visible) return false\n const cen = I.localBox(c, g, inv).getCenter(new V3())\n return (\n Math.sign(cen.z) === z.side &&\n Math.abs(cen.z) > (c.meta.width || 1.7) * 0.25 &&\n cen.x > z.box.x0 + 0.05 &&\n cen.x < z.box.x1 - 0.05 &&\n cen.y > z.box.y1 - 0.15\n )\n })\n }\n function doorGap(c: any, z: any, b: any, cands: any) {\n const B = z.box\n const xe = z.hinge === 'rear' ? B.x1 : B.x0\n const inv = I.worldInverseOf(c)\n const d = z.dir\n const Mw = c.vehicle.matrixWorld\n const pts = []\n for (let k = 0; k < 6; k++) {\n const y = B.y0 + 0.08 + ((B.y1 - B.y0 - 0.16) * k) / 5\n const org = new V3(xe + 0.006, y, z.side < 0 ? B.z0 - 0.5 : B.z1 + 0.5)\n I._zr.set(org.clone().applyMatrix4(Mw), d.clone().transformDirection(Mw))\n I._zr.far = 0.5 + (B.z1 - B.z0)\n const h = I._zr.intersectObjects(cands, false)[0]\n if (h) pts.push(h.point.clone().applyMatrix4(inv).addScaledVector(d, -0.004))\n }\n if (pts.length < 3) return\n const seam = c.tube(pts, b === 2 ? 0.0045 : 0.006, I.DAMAGE_MATERIALS.seam, { seg: 24, rs: 4 })\n seam.castShadow = false\n seam.userData.decal = true\n }\n function mirrorHang(c: any, z: any, ang: any) {\n const objs = z.mirrors.filter(function (o: any) {\n return o.parent\n })\n if (!objs.length) return\n const inv = I.worldInverseOf(c)\n const bb = new THREE.Box3()\n objs.forEach(function (o: any) {\n bb.union(I.localBox(c, o, inv))\n })\n const at = new V3((bb.min.x + bb.max.x) / 2, (bb.min.y + bb.max.y) / 2, z.side < 0 ? bb.max.z : bb.min.z)\n const piv = I.pivotOf(c, objs, at)\n piv.rotation.x = z.side * -ang\n piv.rotation.y = z.side * 0.25\n }\n /* door hanging on a hinge: the door skin becomes a part, swings out on the front hinge and falls behind */\n function doorHang(c: any, z: any, dirty: any, inv: any) {\n const B = z.box\n const rect = [B.x0 + 0.03, B.x1 - 0.03, B.y0 + Math.min(0.08, (B.y1 - B.y0) * 0.1), B.y1 - 0.02]\n const pcs = I.cutPanel(c, z, rect, true, dirty).filter(function (q: any) {\n return q.mesh\n })\n if (!pcs.length) return\n const objs = pcs\n .map(function (q: any) {\n return q.mesh\n })\n .concat(followersIn(c, z, inv))\n const hx = z.hinge === 'rear' ? B.x0 + 0.03 : B.x1 - 0.03\n const bb = new THREE.Box3()\n objs.forEach(function (o: any) {\n bb.union(I.localBox(c, o, I.worldInverseOf(c)))\n })\n const at = new V3(hx, (bb.min.y + bb.max.y) / 2, z.side < 0 ? bb.min.z : bb.max.z)\n const yaw = I.pivotOf(c, [], at)\n const tilt = new THREE.Group()\n yaw.add(tilt)\n c.root.updateMatrixWorld(true)\n objs.forEach(function (o: any) {\n tilt.attach(o)\n o.traverse(function (x: any) {\n x.userData.noFollow = true\n })\n })\n const dx = Math.abs(hx - (z.hinge === 'rear' ? B.x1 : B.x0))\n const sgn = z.hinge === 'rear' ? -1 : 1\n yaw.rotation.y = z.side * sgn * (0.42 + c.rand() * 0.15)\n tilt.rotation.z = sgn * Math.min(0.22, Math.asin(clamp((bb.min.y - 0.03) / Math.max(0.3, dx), 0, 0.9)))\n c.parts.forEach(function (p: any) {\n if (p.kind === 'door') p.done = true\n })\n }\n /* hanging lid: opens on the top hinge (or drops on the bottom one, on a cargo bed) */\n function lidHang(c: any, z: any, dirty: any) {\n const B = z.box\n const rect = [B.y0 + 0.05, B.y1 - 0.03, B.z0 + 0.05, B.z1 - 0.05]\n const d = z.dir\n const a = I.axisOf(d)\n if (a !== 0) return flapHang(c, z, dirty)\n const pcs = I.cutPanel(c, z, rect, true, dirty).filter(function (q: any) {\n return q.mesh\n })\n if (!pcs.length) return\n const bb = new THREE.Box3()\n const inv = I.worldInverseOf(c)\n pcs.forEach(function (q: any) {\n bb.union(I.localBox(c, q.mesh, inv))\n })\n const top = z.hinge !== 'down'\n const sx = d.x > 0 ? -1 : 1\n const at = new V3(sx < 0 ? bb.min.x : bb.max.x, top ? bb.max.y : bb.min.y, 0)\n const piv = I.pivotOf(\n c,\n pcs.map(function (q: any) {\n return q.mesh\n }),\n at,\n )\n piv.rotation.z = (top ? 1 : -1) * sx * (top ? 0.55 : 1.2)\n piv.rotation.x = (c.rand() - 0.5) * 0.12\n }\n /* torn and bent-out metal flap on a panel corner */\n function flapHang(c: any, z: any, dirty: any) {\n const R = c.rand\n const B = z.box\n const d = z.dir\n const a = I.axisOf(d)\n const ax = [0, 1, 2].filter(function (k) {\n return k !== a\n })\n const u0 = I.boxLo(B, ax[0])\n const u1 = I.boxHi(B, ax[0])\n const v0 = I.boxLo(B, ax[1])\n const v1 = I.boxHi(B, ax[1])\n const lu = u1 - u0\n const lv = v1 - v0\n const ks = clamp((c.meta.length || 4.2) / 4.2, 0.45, 1)\n const fu = Math.min(0.45 * ks, lu * 0.32)\n const fv = Math.min(0.35 * ks, lv * 0.4)\n const cu = u0 + lu * (0.3 + R() * 0.4)\n const cv = v0 + lv * (0.3 + R() * 0.4)\n const rect = [cu - fu / 2, cu + fu / 2, cv - fv / 2, cv + fv / 2]\n const pcs = I.cutPanel(c, z, rect, true, dirty).filter(function (q: any) {\n return q.mesh && q.cut\n })\n if (!pcs.length) return\n const at = new V3()\n at.setComponent(a, d.getComponent(a) > 0 ? I.boxLo(B, a) : I.boxHi(B, a))\n at.setComponent(ax[0], rect[0])\n at.setComponent(ax[1], (rect[2] + rect[3]) / 2)\n const inv = I.worldInverseOf(c)\n const bb = new THREE.Box3()\n pcs.forEach(function (q: any) {\n bb.union(I.localBox(c, q.mesh, inv))\n })\n at.setComponent(a, bb.getCenter(new V3()).getComponent(a))\n const piv = I.pivotOf(\n c,\n pcs.map(function (q: any) {\n return q.mesh\n }),\n at,\n )\n const axisV = new V3()\n axisV.setComponent(ax[1], 1)\n const outv = d.clone().negate()\n const tangent = new V3()\n tangent.setComponent(ax[0], 1)\n const sgn = new V3().crossVectors(axisV, tangent).dot(outv) > 0 ? 1 : -1\n piv.quaternion.setFromAxisAngle(axisV, sgn * (0.6 + R() * 0.3))\n }\n\n Object.assign(I, { panelBand, roofOff, tailOff, followersIn, windowsOver, doorGap, mirrorHang, doorHang, lidHang, flapHang })\n}\n","/** Per-zone damage for separate parts: lights, wheels, glass, internals, rotors and landing gear. */\nimport type { Kit } from './types'\nimport { clamp, hash, rng } from './util'\n\nexport function installDamageParts(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const PI = Math.PI\n const I = kit._\n const document = kit.document\n const { MATERIALS } = I\n\n /* ---- glass ---- */\n function glassPt(c: any, g: any, rnd: any) {\n g.geometry.computeBoundingBox()\n const bb = g.geometry.boundingBox.clone().applyMatrix4(g.matrix)\n const s = bb.getSize(new V3())\n return new V3(bb.min.x + s.x * (0.3 + rnd() * 0.4), bb.min.y + s.y * (0.3 + rnd() * 0.4), bb.min.z + s.z * (0.3 + rnd() * 0.4))\n }\n function glassIn(c: any, g: any) {\n const p = glassPt(c, g, function () {\n return 0.5\n })\n const m = c.meta\n return new V3((m.front + m.rear) / 2 - p.x, 0, -p.z).normalize()\n }\n function glassBand(c: any, z: any, g: any, b: any) {\n const G = g.userData.glass\n if (!G || !g.parent) return\n const R = c.rand\n const bullet = c.meta.bullet\n if (b === 1) I.crackGlass(c, g, glassPt(c, g, R), 0.2, 0.26)\n else if (b === 2) I.crackGlass(c, g, glassPt(c, g, R), 1.0)\n else if (b === 3) {\n if (G.type === 'laminated' || bullet) {\n for (let i = 0; i < 3; i++) I.crackGlass(c, g, glassPt(c, g, R), 1.2)\n I.burst(c, 'shard', c.toEffects(glassPt(c, g, R)), 10, { speed: 1.2 })\n } else I.shatterGlass(c, g, 1.0, glassIn(c, g))\n } else if (b === 4) {\n if (!G.broken && G.type !== 'laminated' && !bullet) I.shatterGlass(c, g, 1.0, glassIn(c, g))\n else I.burst(c, 'shard', c.toEffects(glassPt(c, g, R)), 14, { speed: 1.4 })\n G.broken = true\n g.visible = false\n }\n }\n /* ---- headlights and taillights ---- */\n const crackLensCache = new Map()\n let crackTextureCache: any = null\n function crackTexture() {\n if (crackTextureCache) return crackTextureCache\n const cv = document.createElement('canvas')\n cv.width = cv.height = 128\n const x: any = cv.getContext('2d')\n const r = rng(77)\n x.fillStyle = '#ffffff'\n x.fillRect(0, 0, 128, 128)\n for (let pass = 0; pass < 2; pass++) {\n x.strokeStyle = pass ? 'rgba(255,255,255,1)' : 'rgba(30,30,30,0.9)'\n x.lineWidth = pass ? 1 : 2.4\n const rr = rng(77)\n for (let i = 0; i < 9; i++) {\n let a = (i / 9) * PI * 2 + rr() * 0.4\n let px = 60\n let py = 66\n x.beginPath()\n x.moveTo(px, py)\n for (let k = 1; k < 5; k++) {\n a += (rr() - 0.5) * 0.5\n px += Math.cos(a) * 14\n py += Math.sin(a) * 14\n x.lineTo(px, py)\n }\n x.stroke()\n }\n }\n void r\n crackTextureCache = new THREE.CanvasTexture(cv)\n return crackTextureCache\n }\n function crackLens(mat: any) {\n if (crackLensCache.has(mat)) return crackLensCache.get(mat)\n const m2 = mat.clone()\n m2.map = crackTexture()\n m2.needsUpdate = true\n crackLensCache.set(mat, m2)\n return m2\n }\n function lightBand(c: any, z: any, Lt: any, b: any) {\n if (!Lt || Lt.broken === 'gone') return\n const dir = new V3(Lt.kind === 'taillight' ? 1 : -1, 0, 0)\n if (b === 1) {\n Lt.lens.forEach(function (m: any) {\n if (m.material && !Array.isArray(m.material)) m.material = crackLens(m.material)\n })\n ;(Lt.halo || []).forEach(function (h: any) {\n h.material = h.material.clone()\n h.material.opacity *= 0.55\n })\n } else if (b >= 2) {\n I.breakLight(c, Lt, dir)\n if (b === 3 && Lt.group) {\n Lt.group.rotation.x += (c.rand() - 0.5) * 0.5\n Lt.group.rotation.z += -0.25\n Lt.group.position.y -= 0.035\n Lt.group.position.addScaledVector(dir, -0.02)\n Lt.group.userData.noFollow = true\n }\n if (b === 4) {\n if (Lt.group) Lt.group.visible = false\n else\n Lt.lens.concat(Lt.inner).forEach(function (m: any) {\n m.visible = false\n })\n Lt.broken = 'gone'\n }\n }\n }\n /* ---- wheels: flat flattens the bottom of the tyre; without a tyre, the wheel sits on its rim ---- */\n function tireMeshes(w: any) {\n const out: any = []\n w.traverse(function (o: any) {\n if (o.isMesh && o.material === MATERIALS.rubber) out.push(o)\n })\n return out\n }\n function flattenTire(w: any, k: any) {\n const r = w.userData.r || 0.3\n const yb = -r * (1 - k)\n const v = new V3()\n const M = new THREE.Matrix4()\n const Mi = new THREE.Matrix4()\n tireMeshes(w).forEach(function (t: any) {\n if (!t.userData.zCloned) {\n t.geometry = t.geometry.clone()\n t.userData.zCloned = true\n }\n t.updateMatrix()\n M.copy(t.matrix)\n Mi.copy(M).invert()\n const p = t.geometry.attributes.position\n for (let i = 0; i < p.count; i++) {\n v.fromBufferAttribute(p, i).applyMatrix4(M)\n if (v.y < yb) {\n const e = (yb - v.y) / Math.max(0.01, r * k)\n v.y = yb\n v.z *= 1 + 0.25 * Math.min(1, e)\n v.applyMatrix4(Mi)\n p.setXYZ(i, v.x, v.y, v.z)\n }\n }\n p.needsUpdate = true\n t.geometry.computeVertexNormals()\n t.geometry.computeBoundingSphere()\n })\n }\n function wheelBand(c: any, z: any, w: any, b: any) {\n if (!w || !w.parent) return\n const r = w.userData.r || 0.3\n const s = w.position.z >= 0 ? 1 : -1\n const R = c.rand\n if (b === 1) {\n for (let i = 0; i < 3; i++) {\n const a = R() * PI * 2\n const sc = new THREE.Mesh(new THREE.BoxGeometry(r * 0.35, 0.006, 0.002), I.DAMAGE_MATERIALS.deep)\n sc.position.set(Math.cos(a) * r * 0.45, Math.sin(a) * r * 0.45, s * (r * 0.5 + 0.02))\n sc.rotation.z = a + PI / 2\n sc.userData.decal = true\n w.add(sc)\n }\n } else if (b === 2) {\n flattenTire(w, 0.13)\n c.zoneDrops.push({ x: w.position.x, z: w.position.z, d: r * 0.13 })\n } else if (b === 3) {\n flattenTire(w, 0.24)\n w.rotation.y += (R() - 0.5) * 0.25\n w.rotation.x += s * 0.1\n c.zoneDrops.push({ x: w.position.x, z: w.position.z, d: r * 0.24 })\n } else if (b === 4) {\n let rr = 0\n w.traverse(function (o: any) {\n if (!o.isMesh || o.material === MATERIALS.rubber) return\n if (!o.geometry.boundingSphere) o.geometry.computeBoundingSphere()\n const cc = o.geometry.boundingSphere.center.clone().applyMatrix4(o.matrix)\n rr = Math.max(rr, Math.hypot(cc.x, cc.y) + o.geometry.boundingSphere.radius * 0.7)\n })\n rr = clamp(rr || r * 0.62, r * 0.4, r * 0.85)\n tireMeshes(w).forEach(function (t: any) {\n t.visible = false\n })\n c.zoneDrops.push({ x: w.position.x, z: w.position.z, d: r - rr })\n const gp = c.toEffects(new V3(w.position.x, 0.02, w.position.z))\n I.burst(c, 'spark', gp, 14, { speed: 2.4, spread: 1.6 })\n const mk = new THREE.Mesh(new THREE.PlaneGeometry(1.6, 0.06), I.DAMAGE_MATERIALS.scrape)\n mk.rotation.x = -PI / 2\n mk.position.set(gp.x - 0.8, 0.006, gp.z)\n mk.userData.decal = true\n mk.raycast = function () {}\n c.effects.add(mk)\n }\n }\n /* ---- aircraft landing gear: dented sags, destroyed breaks the front leg (nose on the ground), torn off = belly landing ---- */\n function gearBand(c: any, z: any, b: any) {\n const R = c.rand\n const ws = z.wheels.filter(function (w: any) {\n return w.parent\n })\n const objs = z.owned.filter(function (o: any) {\n return o.parent\n })\n if (!ws.length) return\n if (b <= 2) {\n ws.forEach(function (w: any) {\n wheelBand(c, z, w, b)\n })\n return\n }\n if (b === 3) {\n const xmax = Math.max.apply(\n null,\n ws.map(function (w: any) {\n return w.position.x\n }),\n )\n const front = ws.filter(function (w: any) {\n return w.position.x > xmax - 0.3\n })\n ws.forEach(function (w: any) {\n if (front.indexOf(w) < 0) wheelBand(c, z, w, 2)\n })\n front.forEach(function (w: any) {\n const r = w.userData.r || 0.3\n const near = objs.filter(function (o: any) {\n const p = o.position\n const bb = I.localBox(c, o, I.worldInverseOf(c))\n const cen = bb.getCenter(new V3())\n void p\n return Math.abs(cen.x - w.position.x) < 0.5 && Math.abs(cen.z - w.position.z) < 0.5\n })\n const inv = I.worldInverseOf(c)\n const top = new V3(w.position.x, w.position.y + r, w.position.z)\n near.forEach(function (o: any) {\n const bb = I.localBox(c, o, inv)\n top.y = Math.max(top.y, bb.max.y)\n })\n w.userData.gpos = w.position.clone()\n const piv = I.pivotOf(c, [w].concat(near), top)\n piv.rotation.z = 0.75 + R() * 0.25\n piv.rotation.x = (R() - 0.5) * 0.3\n c.zoneDrops.push({ x: w.position.x, z: w.position.z, d: r * 1.25 })\n I.burst(c, 'spark', c.toEffects(new V3(w.position.x, 0.03, w.position.z)), 10, { speed: 2, spread: 1.4 })\n })\n return\n }\n /* torn off: the gear disappears and the aircraft settles on its belly, slightly nose down */\n ws.concat(objs).forEach(function (o: any) {\n I.hideObj(c, o)\n })\n /* propeller stopped horizontally (hit the ground and the engine died) */\n I.partsOf(c, 'propeller').forEach(function (hp: any) {\n const o = hp.obj\n if (!o || !o.parent) return\n c.spin = c.spin.filter(function (q: any) {\n return q.o !== o\n })\n let best = 0\n let by = -1e9\n for (let k = 0; k < 12; k++) {\n o.rotation.x = (k / 12) * PI\n c.root.updateMatrixWorld(true)\n const y0 = I.localBox(c, o, I.worldInverseOf(c)).min.y\n if (y0 > by + 1e-4) {\n by = y0\n best = o.rotation.x\n }\n }\n o.rotation.x = best\n I.hurtEngine(c, 0.3)\n })\n c.root.updateMatrixWorld(true)\n const inv2 = I.worldInverseOf(c)\n let lo = 1e9\n let xs = 0\n c.vehicle.traverse(function (o: any) {\n if (!o.isMesh || o.userData.decal || o.isSprite || !o.geometry || !o.geometry.attributes.position) return\n for (let q = o; q && q !== c.vehicle; q = q.parent) if (!q.visible) return\n const bb = I.localBox(c, o, inv2)\n if (bb.min.y < lo) {\n lo = bb.min.y\n xs = (bb.min.x + bb.max.x) / 2\n }\n })\n if (lo < 1e8 && lo > 0.02) c.vehicle.position.y -= lo - 0.01\n const m = c.meta\n const gp = c.toEffects(new V3(xs, 0.02, 0))\n I.burst(c, 'spark', gp, 18, { speed: 2.6, spread: 1.8 })\n const mk = new THREE.Mesh(new THREE.PlaneGeometry(Math.min(4, (m.length || 6) * 0.5), 0.5), I.DAMAGE_MATERIALS.scrape)\n mk.rotation.x = -PI / 2\n mk.position.set(gp.x - 1.2, 0.006, gp.z)\n mk.userData.decal = true\n mk.raycast = function () {}\n c.effects.add(mk)\n }\n /* ---- internal zones: engine, radiator, tank, battery, underbody ---- */\n function internalBand(c: any, z: any, b: any) {\n const m = c.meta\n const p = z.pos ? z.pos.clone() : I.boxCenter(z.box)\n const sub = z.sub || z.id\n const land = ['boat', 'plane', 'heli'].indexOf(m.kind) < 0\n if (b === 0) return\n if (sub === 'engine') {\n if (b === 1) I.hurtEngine(c, 0.8)\n if (b === 2) {\n I.hurtEngine(c, 0.55)\n kit.addEmitter(c, p.clone().add(new V3(0, 0.3, 0)), 'white', { rate: 2, s: 0.7 })\n }\n if (b >= 3) {\n I.hurtEngine(c, b === 4 ? 0.05 : 0.25)\n kit.addEmitter(c, p.clone().add(new V3(0, 0.3, 0)), 'black', { rate: b === 4 ? 6 : 4 })\n if (land) I.puddle(c, 'oil', p.clone().setY(Math.max(0.2, m.clearance || 0.3)), b === 4 ? 0.9 : 0.6)\n }\n if (b === 4) kit.addEmitter(c, p.clone().add(new V3(0, 0.15, 0)), 'fire', { rate: 7, s: 0.7 })\n if (b >= 2 && c.hood && !c.hood.noLatch && c.hood.x1 > 0 === p.x > 0) c.hood.latch = Math.max(c.hood.latch, 0.08)\n } else if (sub === 'radiator') {\n if (b === 2) kit.addEmitter(c, p.clone().add(new V3(-0.1, 0.25, 0)), 'white', { rate: 2.5, s: 0.7 })\n if (b >= 3) {\n kit.addEmitter(c, p.clone().add(new V3(-0.1, 0.25, 0)), 'white', { rate: b === 4 ? 8 : 5 })\n I.hurtEngine(c, b === 4 ? 0.35 : 0.6)\n }\n } else if (sub === 'fuel_tank') {\n const fu = I.tankFuel(c, { label: z.name })\n if (fu && land && b >= 2) {\n const pd = I.puddle(c, fu, p.clone(), b === 2 ? 0.35 : b === 3 ? 0.95 : 1.4)\n if (b === 4 && fu === 'gasoline') I.igniteFuel(c, pd)\n }\n if (b === 4 && !land) kit.addEmitter(c, p.clone(), 'black', { rate: 3 })\n } else if (sub === 'battery') {\n if (b >= 3) kit.addEmitter(c, p.clone().add(new V3(0, 0.6, 0)), 'black', { rate: 3 })\n if (b === 4) kit.addEmitter(c, p.clone().add(new V3(0, 0.15, 0)), 'fire', { rate: 8, s: 0.8 })\n } else if (sub === 'underbody') {\n const ug = m.underbodyGroup\n if (b >= 2 && ug) {\n ug.rotation.z += b === 2 ? 0.012 : 0.03\n ug.position.y -= b === 2 ? 0.015 : 0.05\n }\n if (b === 4 && ug) {\n ug.position.y -= 0.06\n I.burst(c, 'spark', c.toEffects(new V3(m.rear + 0.6, 0.05, 0)), 12, { speed: 2 })\n }\n if (b >= 3 && land) I.puddle(c, 'oil', new V3(((m.front || 1) + (m.rear || -1)) / 2 + 0.6, 0.2, 0), 0.4)\n }\n }\n /* ---- hood ---- */\n function hoodBand(c: any, z: any, b: any, dirty: any) {\n const H = c.hood && z.owned.indexOf(c.hood.piv) >= 0 ? c.hood : null\n if (!H) return I.panelBand(c, z, b, dirty)\n const R = c.rand\n const inv = I.worldInverseOf(c)\n const cands = I.zoneCands(c, z, inv)\n if (b === 0) {\n if (z.health < 92) I.zoneDecals(c, z, { fine: 2 }, cands)\n return\n } /* intact (76 to 99): only fine scratches, no dents and no unlatching */\n if (b === 1) {\n I.zoneDecals(c, z, { deep: 3, chip: 3, fine: 2 }, cands)\n return\n }\n if (b === 4) {\n H.piv.visible = false\n c.parts.forEach(function (p: any) {\n if (p.kind === 'hood') p.done = true\n })\n c.hood = null\n return\n }\n const B = z.box\n const len = B.x1 - B.x0\n const wz = B.z1 - B.z0\n const dep = b === 2 ? 0.05 + R() * 0.03 : 0.1 + R() * 0.05\n I.zoneDent(\n c,\n z,\n [{ u: B.x0 + len * (0.55 + R() * 0.2), v: (R() - 0.5) * wz * 0.3, ru: len * 0.38, rv: wz * 0.32, depth: dep, ph: R() * 6 }],\n dirty,\n { crease: { v: (R() - 0.5) * wz * 0.2, w: 0.08, depth: dep * 0.6 }, noSub: false },\n )\n H.latch = Math.max(H.latch, b === 2 ? 0.15 : 0.28)\n if (b === 3) {\n /* folded up: the front half rises around a crease line */\n const xf = H.x0 + (H.x1 - H.x0) * (0.5 + R() * 0.1)\n const k = 0.55 + R() * 0.2\n const v = new V3()\n H.piv.children.forEach(function (msh: any) {\n if (!msh.isMesh) return\n msh.updateMatrix()\n const M = msh.matrix\n const Mi = new THREE.Matrix4().copy(M).invert()\n const p = msh.geometry.attributes.position\n for (let i = 0; i < p.count; i++) {\n v.fromBufferAttribute(p, i).applyMatrix4(M)\n const gx = v.x + H.x0\n if (gx > xf) {\n const t = gx - xf\n v.y += t * k * (1 + 0.15 * Math.sin(v.z * 7))\n v.x -= t * (1 - Math.cos(Math.atan(k))) * 0.5\n }\n v.applyMatrix4(Mi)\n p.setXYZ(i, v.x, v.y, v.z)\n }\n p.needsUpdate = true\n msh.geometry.computeBoundingSphere()\n dirty.add(msh)\n })\n I.zoneDecals(c, z, { deep: 3, chip: 2, rust: 2, tear: 1 }, I.zoneCands(c, z, I.worldInverseOf(c)))\n } else I.zoneDecals(c, z, { deep: 3, chip: 3 }, I.zoneCands(c, z, I.worldInverseOf(c)))\n }\n /* ---- bumper ---- */\n function bumperBand(c: any, z: any, b: any, dirty: any) {\n const o = z.owned[0]\n if (!o || !o.parent) return I.panelBand(c, z, b, dirty)\n const R = c.rand\n const inv = I.worldInverseOf(c)\n const cands = I.zoneCands(c, z, inv)\n const bb = I.localBox(c, o, inv)\n const cen = bb.getCenter(new V3())\n const sx = cen.x > 0 ? 1 : -1\n if (b === 0) {\n if (z.health < 92) I.zoneDecals(c, z, { fine: 2 }, cands)\n return\n } /* intact (76 to 99): the bumper stays in place */\n if (b === 1) {\n I.zoneDecals(c, z, { deep: 3, chip: 2 }, cands)\n return\n }\n if (b === 4) {\n I.hideObj(c, o)\n return\n }\n I.zoneDecals(c, z, { deep: 3, chip: 2, rust: b === 3 ? 2 : 0 }, cands)\n const sideHit = R() < 0.5 ? -1 : 1\n const p = new V3(cen.x, cen.y, (sideHit * (bb.max.z - bb.min.z)) / 2)\n if (b === 2) {\n I.hangBumper(c, o, p)\n return\n }\n /* destroyed: fell off and lies on the ground in front of (or behind) the vehicle, slightly crooked */\n const di = c.deform.indexOf(o)\n if (di >= 0) c.deform.splice(di, 1)\n if (o.parent !== c.vehicle) {\n c.root.updateMatrixWorld(true)\n c.vehicle.attach(o)\n }\n const hh = (bb.max.y - bb.min.y) / 2\n o.position.x += sx * (0.35 + R() * 0.2)\n o.position.y += hh + 0.004 - bb.min.y - hh\n o.rotation.y += (R() - 0.5) * 0.5\n o.rotation.x += (R() - 0.5) * 0.12\n o.userData.noFollow = true\n c.parts.forEach(function (q: any) {\n if (q.obj === o) q.done = true\n })\n }\n /* ---- loose parts (bike, rotor, weapon, skid) ---- */\n function partBand(c: any, z: any, b: any, dirty: any) {\n const objs = z.owned.filter(function (o: any) {\n return o.parent\n })\n if (!objs.length) return I.panelBand(c, z, b, dirty)\n const R = c.rand\n const inv = I.worldInverseOf(c)\n const cands = I.zoneCands(c, z, inv)\n if (b >= 1 && b <= 3)\n I.zoneDecals(c, z, { deep: b + 1, chip: z.plastic ? 0 : b, rust: b === 3 && !z.plastic && !z.noFlap ? 2 : 0 }, cands)\n if (z.track) {\n const tk = z.track\n if (b === 2) {\n tk.position.y -= 0.025\n }\n if (b === 3) {\n tk.position.addScaledVector(z.dir, -0.12)\n tk.position.y -= 0.05\n tk.rotation.x += z.side * 0.05\n }\n if (b === 4) I.hideObj(c, tk)\n return\n }\n if (z.kindPart && b >= 2 && b <= 3) {\n objs.forEach(function (o: any) {\n o.children.forEach(function (ch: any, i: any) {\n if (ch.type === 'Group' || ch.isMesh) {\n ch.rotation.z += (-0.12 - hash(i, 1, 1) * 0.2) * (b - 1)\n ch.rotation.x += (i % 2 ? 0.15 : -0.15) * (b - 1)\n }\n })\n })\n c.spin = c.spin.filter(function (s: any) {\n return objs.indexOf(s.o) < 0\n })\n return\n }\n if (b === 4) {\n objs.forEach(function (o: any) {\n I.hideObj(c, o)\n })\n c.spin = c.spin.filter(function (s: any) {\n return objs.indexOf(s.o) < 0\n })\n return\n }\n if (b < 2) return\n const m = c.meta\n const B = z.box\n const C = new V3(((m.front || 1) + (m.rear || -1)) / 2, (m.clearance || 0.3) + 0.3, 0)\n const at = z.anchor\n ? new V3(z.anchor[0], z.anchor[1], z.anchor[2])\n : new V3(clamp(C.x, B.x0, B.x1), clamp(C.y, B.y0, B.y1), clamp(C.z, B.z0, B.z1))\n const outv = I.boxCenter(B).sub(at)\n outv.y = 0\n if (outv.lengthSq() < 1e-4) outv.set(1, 0, 0)\n outv.normalize()\n const axis = new V3().crossVectors(new V3(0, 1, 0), outv).normalize()\n const th = b === 2 ? 0.08 + R() * 0.05 : 0.3 + R() * 0.15\n const piv = I.pivotOf(c, objs, at)\n piv.quaternion.setFromAxisAngle(axis, th)\n piv.position.y -= b === 3 ? 0.03 : 0.01\n c.spin = c.spin.filter(function (s: any) {\n return objs.indexOf(s.o) < 0\n })\n }\n /* bent tail cone: everything behind the crease (cone, fin, tail rotor) rotates downward around it.\n Meshes that cross the crease bend per vertex; whole parts behind it rotate as a rigid body. */\n function bendAft(c: any, z: any, kx: any, ky: any, ang: any, dirty: any) {\n const inv = I.worldInverseOf(c)\n const q = new THREE.Quaternion().setFromAxisAngle(new V3(0, 0, 1), ang)\n const K = new V3(kx, ky, 0)\n const v = new V3()\n const rel = new THREE.Matrix4()\n const irel = new THREE.Matrix4()\n const blend = 0.25\n function rot(p: any, k: any) {\n const a2 = ang * k\n const cs = Math.cos(a2)\n const sn = Math.sin(a2)\n const dx = p.x - kx\n const dy = p.y - ky\n p.x = kx + dx * cs - dy * sn\n p.y = ky + dx * sn + dy * cs\n }\n const rigid: any = []\n const verts: any = []\n c.vehicle.children.forEach(function (o: any) {\n if (o.userData.decal || o.isSprite || !o.visible) return\n const ow = I.ownerOf(c, o)\n if (ow && ow !== z && ow.id !== 'rotor_cauda' && I.boxCenter(ow.box).x > kx) return\n const bb = I.localBox(c, o, inv)\n if (bb.isEmpty() || bb.min.x >= kx) return\n if (bb.max.x < kx - 0.02 || !o.isMesh) {\n if (bb.max.x < kx + 0.3) rigid.push(o)\n } else verts.push(o)\n })\n rigid.forEach(function (o: any) {\n const p = o.position.clone()\n rot(p, 1)\n o.position.copy(p)\n o.quaternion.premultiply(q)\n })\n verts.forEach(function (msh: any) {\n if (!msh.geometry || !msh.geometry.attributes.position) return\n if (!msh.userData.zCloned && c.deform.indexOf(msh) < 0) {\n msh.geometry = msh.geometry.clone()\n msh.userData.zCloned = true\n }\n msh.updateMatrixWorld(true)\n rel.multiplyMatrices(inv, msh.matrixWorld)\n irel.copy(rel).invert()\n const pos = msh.geometry.attributes.position\n let ch = false\n for (let i = 0; i < pos.count; i++) {\n v.fromBufferAttribute(pos, i).applyMatrix4(rel)\n if (v.x >= kx) continue\n rot(v, I.sm((kx - v.x) / blend))\n v.applyMatrix4(irel)\n pos.setXYZ(i, v.x, v.y, v.z)\n ch = true\n }\n if (ch) {\n pos.needsUpdate = true\n dirty.add(msh)\n }\n })\n void K\n }\n\n Object.assign(I, {\n glassPt,\n glassIn,\n glassBand,\n crackLensCache,\n crackTextureCache,\n crackTexture,\n crackLens,\n lightBand,\n tireMeshes,\n flattenTire,\n wheelBand,\n gearBand,\n internalBand,\n hoodBand,\n bumperBand,\n partBand,\n bendAft,\n })\n}\n","/** Zone derivation from the vehicle meta, merged with builder declarations. */\nimport type { Kit } from './types'\n\nexport function installZoneDerive(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n\n /* ---- finalisation: direction, side, owned parts, map ---- */\n function parseDir(d: any) {\n if (!d) return null\n if (d.isVector3) return d.clone().normalize()\n if (Array.isArray(d)) return new V3(d[0], d[1], d[2]).normalize()\n return (\n ({\n left: new V3(0, 0, 1),\n right: new V3(0, 0, -1),\n front: new V3(-1, 0, 0),\n rear: new V3(1, 0, 0),\n up: new V3(0, -1, 0),\n down: new V3(0, 1, 0),\n } as Record<string, any>)[d] || null\n )\n }\n function resolveObjs(c: any, list: any, z: any) {\n const out: any = []\n ;(list || []).forEach(function (o: any) {\n if (!o) return\n if (typeof o === 'string') {\n c.parts.forEach(function (p: any) {\n if ((p.label === o || p.kind === o) && p.obj) {\n if (p.light) z.lights.push(p.light)\n else out.push(p.obj)\n }\n })\n c.glass.forEach(function (g: any) {\n if (g.userData.glass && g.userData.glass.label === o) z.glass.push(g)\n })\n return\n }\n if (o.lens && o.inner) {\n z.lights.push(o)\n return\n }\n if (o.isObject3D) {\n if (o.userData.glass) z.glass.push(o)\n else if (c.wheels.indexOf(o) >= 0) z.wheels.push(o)\n else out.push(o)\n }\n })\n return out\n }\n function deriveZones(c: any) {\n const m = c.meta\n let list: any = []\n const byId: any = {}\n ;(m.zones === false ? [] : I.autoZones(c)).forEach(function (z: any) {\n byId[z.id] = z\n list.push(z)\n })\n ;(c.zoneDefs || []).forEach(function (d: any) {\n let z = byId[d.id]\n if (d.remove) {\n if (z) {\n list.splice(list.indexOf(z), 1)\n delete byId[d.id]\n }\n /* removing the left headlight also removes the extra groups on the same side (headlight_left_2...) */\n list.slice().forEach(function (q: any) {\n if (q.id.indexOf(d.id + '_') === 0 && /^\\d+$/.test(q.id.slice(d.id.length + 1))) {\n list.splice(list.indexOf(q), 1)\n delete byId[q.id]\n }\n })\n return\n }\n if (z) {\n const o0 = z.objs || []\n Object.assign(z, d)\n z.objs = d.objs ? (d.replace ? d.objs : o0.concat(d.objs)) : o0\n } else {\n z = Object.assign({ type: 'panel' }, d)\n byId[d.id] = z\n list.push(z)\n }\n })\n const inv = I.worldInverseOf(c)\n const F = m.front\n const R = m.rear\n const W = m.width || 1.7\n const owner = new Map()\n /* zone created (or refined as part/wheel) with parts only, no box: the box comes from the parts themselves */\n ;(c.zoneDefs || []).forEach(function (d: any) {\n const z = byId[d.id]\n if (!z || d.remove || d.box || !d.objs || !d.objs.length) return\n if (z.box && !d.fit && !(z.type === 'part' || z.type === 'wheel')) return\n const tmp = { lights: [], glass: [], wheels: [] }\n const os = resolveObjs(c, d.objs, tmp)\n const bb = new THREE.Box3()\n os.concat(tmp.glass, tmp.wheels).forEach(function (o: any) {\n bb.union(I.localBox(c, o, inv))\n })\n tmp.lights.forEach(function (Lt) {\n bb.union(I.lightBoxOf(c, Lt, inv))\n })\n if (z.box && z.type === 'wheel')\n (z.wheels || []).forEach(function (w: any) {\n bb.union(I.localBox(c, w, inv))\n })\n if (bb.isEmpty()) return\n bb.expandByScalar(0.05)\n if (z.box && z.type === 'part' && !d.fit) {\n const B0 = z.box\n bb.union(new THREE.Box3(new V3(B0.x0, B0.y0, B0.z0), new V3(B0.x1, B0.y1, B0.z1)))\n }\n z.box = I.normalizeBox(bb)\n })\n list = list.filter(function (z: any) {\n return z.box && z.name\n })\n list.forEach(function (z: any) {\n z.glass = (z.glass || []).slice()\n z.lights = (z.lights || []).slice()\n z.wheels = (z.wheels || []).slice()\n z.tags = z.tags || []\n z.owned = resolveObjs(c, z.objs, z)\n if (z.plastic == null && (c.meta.kind === 'bike' || c.meta.kind === 'quad') && (z.fxKey === 'fairing' || z.fxKey === 'seat'))\n z.plastic = true\n if (z.plastic) z.noFlap = true\n const cen = I.boxCenter(z.box)\n if (z.side == null) z.side = cen.z < -W * 0.2 ? -1 : cen.z > W * 0.2 ? 1 : 0\n z.dir =\n parseDir(z.dir) ||\n (z.side\n ? new V3(0, 0, -z.side)\n : cen.x > F - 0.2 * (F - R)\n ? new V3(-1, 0, 0)\n : cen.x < R + 0.2 * (F - R)\n ? new V3(1, 0, 0)\n : new V3(0, -1, 0))\n z.weight = z.weight || I.ZONE_WEIGHTS[z.type] || 1\n z.internal = z.type === 'internal'\n z.health = 100\n if (z.side < 0 && z.tags.indexOf('left') < 0) z.tags.push('left')\n if (z.side > 0 && z.tags.indexOf('right') < 0) z.tags.push('right')\n z.owned.forEach(function (o: any) {\n owner.set(o, z)\n })\n z.glass.forEach(function (o: any) {\n if (!owner.has(o)) owner.set(o, z)\n })\n z.wheels.forEach(function (o: any) {\n owner.set(o, z)\n })\n z.lights.forEach(function (Lt: any) {\n if (Lt.group) owner.set(Lt.group, z)\n Lt.lens.concat(Lt.inner).forEach(function (o: any) {\n owner.set(o, z)\n })\n })\n })\n /* glass without a zone of its own goes to the panel zone that contains it (aircraft cabin, helicopter nose) */\n c.glass.forEach(function (g: any) {\n if (owner.has(g) || !g.parent || !g.userData.glass || g.userData.ghost) return\n const cg = I.localBox(c, g, inv).getCenter(new V3())\n let best: any = null\n list.forEach(function (z: any) {\n if (z.internal || z.type === 'wheel' || z.type === 'light') return\n if (I.boxContains(z.box, cg.x, cg.y, cg.z, 0.05) && (!best || I.boxVolume(z.box) < I.boxVolume(best.box))) best = z\n })\n if (best) {\n best.glass.push(g)\n owner.set(g, best)\n }\n })\n /* loose parts (children of c.vehicle) join the smallest \"part\" zone that contains them */\n const looseParts = list.filter(function (z: any) {\n return z.type === 'part'\n })\n if (looseParts.length)\n c.vehicle.children.forEach(function (o: any) {\n if (owner.has(o) || o.userData.decal || o.isSprite || o.userData.glass || c.wheels.indexOf(o) >= 0) return\n const bb = I.localBox(c, o, inv)\n if (bb.isEmpty()) return\n const cen = bb.getCenter(new V3())\n const sz = bb.getSize(new V3())\n let best: any = null\n looseParts.forEach(function (z: any) {\n const B = z.box\n if (!I.boxContains(B, cen.x, cen.y, cen.z, 0.02)) return\n if (sz.x > (B.x1 - B.x0) * 1.6 + 0.1 || sz.y > (B.y1 - B.y0) * 1.6 + 0.1 || sz.z > (B.z1 - B.z0) * 1.6 + 0.1) return\n if (!best || I.boxVolume(B) < I.boxVolume(best.box)) best = z\n })\n if (best) {\n best.owned.push(o)\n owner.set(o, best)\n c.lights.forEach(function (Lt: any) {\n if (Lt.group === o && best.lights.indexOf(Lt) < 0) best.lights.push(Lt)\n })\n }\n })\n /* mirrors: small parts outside the body width, at belt height, next to the front door */\n list.forEach(function (z: any) {\n if (!z.mirror) return\n z.mirrors = []\n const B = z.box\n const belt = m.belt || 1\n c.vehicle.children.forEach(function (o: any) {\n if (owner.has(o) || !o.isMesh || o.userData.decal) return\n const bb = I.localBox(c, o, inv)\n const cen = bb.getCenter(new V3())\n const sz = bb.getSize(new V3())\n if (Math.max(sz.x, sz.y, sz.z) > 0.6) return\n if (\n Math.sign(cen.z) !== z.side ||\n Math.abs(cen.z) < W / 2 + 0.015 ||\n cen.y < belt - 0.15 ||\n cen.y > belt + 0.4 ||\n cen.x < B.x1 - 0.55 ||\n cen.x > B.x1 + 0.25\n )\n return\n z.mirrors.push(o)\n owner.set(o, z)\n })\n /* the housing and the mirror glass stay next to the arm already found (the core may sit inside the body width) */\n if (z.mirrors.length) {\n const mb = new THREE.Box3()\n z.mirrors.forEach(function (o: any) {\n mb.union(I.localBox(c, o, inv))\n })\n mb.expandByScalar(0.05)\n c.vehicle.children.forEach(function (o: any) {\n if (owner.has(o) || !o.isMesh || o.userData.decal || o.userData.glass) return\n const bb = I.localBox(c, o, inv)\n const sz = bb.getSize(new V3())\n if (Math.max(sz.x, sz.y, sz.z) > 0.3 || !mb.intersectsBox(bb)) return\n z.mirrors.push(o)\n owner.set(o, z)\n })\n }\n })\n list.forEach(function (z: any) {\n const B = z.box\n z.map = z.map || [Math.max(B.x0, R - 0.3), Math.min(B.x1, F + 0.3), Math.max(B.z0, -W / 2 - 0.35), Math.min(B.z1, W / 2 + 0.35)]\n })\n carMap(c, list)\n c.zoneOwners = owner\n return list\n }\n /* more readable top-down map for cars: door on the edge, side glass inward, roof in the middle */\n function carMap(c: any, list: any) {\n const m = c.meta\n const W = m.width || 1.7\n const hw = W / 2\n const gh = m.glasshouse\n if ((m.kind || 'car') !== 'car' || !gh || gh.fb == null) return\n list.forEach(function (z: any) {\n if (z.mapSet) return\n const B = z.box\n const s = z.side\n if (z.type === 'door' || /^fender|^side_rear/.test(z.id)) z.map = [B.x0, B.x1, s < 0 ? -hw : hw - 0.16, s < 0 ? -hw + 0.16 : hw]\n else if (z.type === 'glass' && s) z.map = [B.x0, B.x1, s < 0 ? -hw + 0.17 : hw - 0.3, s < 0 ? -hw + 0.3 : hw - 0.17]\n else if (z.id === 'roof') z.map = [Math.min(gh.rt, gh.rb + 0.3), Math.max(gh.ft, gh.fb - 0.3), -hw + 0.31, hw - 0.31]\n else if (z.type === 'glass' && z.tags.indexOf('windshield') >= 0)\n z.map = [Math.max(gh.ft, gh.fb - 0.3), gh.fb + 0.02, -hw + 0.31, hw - 0.31]\n else if (z.type === 'glass') z.map = [B.x0 - 0.02, Math.min(gh.rt, gh.rb + 0.3), -hw + 0.31, hw - 0.31]\n else if (z.id === 'hood' || z.id === 'lid' || z.id === 'cargo_bed')\n z.map = [Math.max(B.x0, z.id === 'hood' ? gh.fb : -1e9), Math.min(B.x1, z.id === 'hood' ? 1e9 : gh.rb), -hw + 0.17, hw - 0.17]\n else if (z.type === 'bumper' || /^bumper/.test(z.id))\n z.map = [z.id === 'bumper_front' ? m.front - 0.2 : m.rear - 0.02, z.id === 'bumper_front' ? m.front + 0.02 : m.rear + 0.2, -hw, hw]\n else if (z.type === 'wheel') {\n const w = z.wheels[0]\n const r = (w && w.userData.r) || 0.3\n if (w)\n z.map = [\n w.position.x - r * 0.85,\n w.position.x + r * 0.85,\n w.position.z < 0 ? -hw - 0.2 : hw - 0.02,\n w.position.z < 0 ? -hw + 0.02 : hw + 0.2,\n ]\n } else if (z.type === 'light')\n z.map = [Math.max(B.x0, m.rear - 0.02), Math.min(B.x1, m.front + 0.02), Math.max(B.z0, -hw), Math.min(B.z1, hw)]\n })\n }\n function zonesOf(c: any) {\n if (!c.zones) c.zones = deriveZones(c)\n return c.zones\n }\n kit.zonesOf = zonesOf\n function ownerOf(c: any, o: any) {\n const own = c.zoneOwners\n if (!own) return null\n for (let q = o; q && q !== c.vehicle; q = q.parent) if (own.has(q)) return own.get(q)\n return null\n }\n kit.zoneOwner = ownerOf\n\n Object.assign(I, { parseDir, resolveObjs, deriveZones, carMap, zonesOf, ownerOf })\n}\n","/** Automatic zone derivation for each vehicle family. */\nimport type { Kit } from './types'\nimport { legacyGlassId, legacyLightId } from './legacy-seeds'\n\nconst REAR_GLASS_KEYS = ['rear_window', 'window_rear', 'quarter_glass']\n\nexport function installZoneAuto(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n const t = kit.t\n const matchers = kit.matchers\n\n /* ---- automatic derivation by vehicle type ---- */\n function autoZones(c: any) {\n const m = c.meta\n let Z: any = []\n const inv = I.worldInverseOf(c)\n const kind = m.kind || 'car'\n const F = m.front\n const R = m.rear\n const L = m.length || F - R\n const W = m.width || 1.7\n const cl = m.clearance == null ? 0.3 : m.clearance\n const belt = m.belt || cl + 0.6\n const top = m.top || belt + 0.5\n const hw = W / 2\n const WH = I.wheelInfo(c)\n function add(id: any, name: any, type: any, box: any, o?: any) {\n const z = Object.assign({ id: id, name: name, type: type, box: I.normalizeBox(box) }, o || {})\n Z.push(z)\n return z\n }\n let fam = kind\n if (kind === 'quad') fam = 'bike'\n if (kind === 'bus' || kind === 'truck' || kind === 'tractor') fam = 'heavy'\n if (kind === 'car' && (m.bullet || m.armored || I.partsOf(c, 'track').length)) fam = 'military'\n let glassDone = false\n let lightsDone = false\n let wheelsDone = false\n\n /* glass, lights and wheels in common */\n function glassZones(grouped: any) {\n glassDone = true\n const gl = c.glass.filter(function (g: any) {\n return g.parent && g.userData.glass && !g.userData.ghost\n })\n if (!gl.length) return\n const info = gl.map(function (g: any) {\n const pt = c.parts.find(function (p: any) {\n return p.obj === g\n })\n const gd = g.userData.glass\n const bb = I.localBox(c, g, inv)\n const label = (pt && pt.label) || gd.label || t('parts.glass')\n const key = (pt && pt.key) || gd.key || null\n return { g: g, n: label, key: key, side: gd.side || 0, bb: bb, cen: bb.getCenter(new V3()) }\n })\n const isWindshield = function (q: any) {\n return q.key ? /(^|_)windshield($|_)/.test(q.key) : matchers.windshield.test(q.n)\n }\n const isRearGlass = function (q: any) {\n return q.key ? REAR_GLASS_KEYS.indexOf(q.key) >= 0 || /(^|_)rear($|_)/.test(q.key) : matchers.rear.test(q.n)\n }\n if (!grouped && gl.length <= 10) {\n const used: any = {}\n const usedSeed: any = {}\n info.forEach(function (q: any) {\n let n = q.n\n let word = q.side ? (q.side < 0 ? 'left' : 'right') : null\n let appended = null\n if (!q.side && !matchers.side.test(n) && Math.abs(q.cen.z) > W * 0.2) {\n n = t('parts.glass_side_m', { label: n, s: q.cen.z < 0 ? -1 : 1 })\n appended = q.cen.z < 0 ? 'left' : 'right'\n word = appended\n }\n /* keyed glass gets \"<key>_<side>\"; free-text labels keep the slug of the label */\n let id = q.key ? q.key + (word ? '_' + word : '') : I.slug(n)\n if (!matchers.glassId.test(id)) id = 'glass_' + id\n if (used[id]) id += '_' + ++used[id]\n else used[id] = 1\n let seed = legacyGlassId(q.key, q.n, q.side, appended, id)\n if (usedSeed[seed]) seed += '_' + ++usedSeed[seed]\n else usedSeed[seed] = 1\n const front = isWindshield(q)\n const rearG = isRearGlass(q) && Math.abs(q.cen.z) < W * 0.2\n const who = front\n ? t('who.front_seats')\n : rearG\n ? t('who.rear_seats')\n : q.cen.x >\n (m.glasshouse && m.glasshouse.pillars && m.glasshouse.pillars.length\n ? Math.max.apply(null, m.glasshouse.pillars)\n : (F + R) / 2)\n ? q.cen.z < 0\n ? t('who.driver')\n : t('who.passenger')\n : t(q.cen.z < 0 ? 'who.rear_left' : 'who.rear_right')\n add(id, n, 'glass', q.bb.clone().expandByScalar(0.04), {\n glass: [q.g],\n fxKey: front ? 'windshield' : 'glass',\n who: who,\n tags: front ? ['windshield'] : [],\n seedId: seed,\n })\n })\n return\n }\n const groups: any = { f: [], l: [], r: [], b: [] }\n info.forEach(function (q: any) {\n const k =\n isWindshield(q) || (Math.abs(q.cen.z) < W * 0.25 && q.cen.x > (F + R) / 2)\n ? 'f'\n : Math.abs(q.cen.z) < W * 0.25\n ? 'b'\n : q.cen.z < 0\n ? 'l'\n : 'r'\n groups[k].push(q)\n })\n ;[\n ['f', 'windshield', 'windshield', 'who.front_seats', 'glass_front', 'vidros_f'],\n ['l', 'glass_left', 'glass', 'who.left_side', 'glass_left', 'vidros_e'],\n ['r', 'glass_right', 'glass', 'who.right_side', 'glass_right', 'vidros_d'],\n ['b', 'rear_window', 'glass', 'who.rear_seats', 'glass_rear', 'vidros_t'],\n ].forEach(function (G) {\n const L2 = groups[G[0]]\n if (!L2.length) return\n const bb = new THREE.Box3()\n L2.forEach(function (q: any) {\n bb.union(q.bb)\n })\n add(G[4], t('zones.' + G[1]), 'glass', bb.expandByScalar(0.04), {\n glass: L2.map(function (q: any) {\n return q.g\n }),\n fxKey: G[2],\n who: t(G[3]),\n tags: G[0] === 'f' ? ['windshield'] : [],\n seedId: G[5],\n })\n })\n }\n function lightZones() {\n lightsDone = true\n const G: any = {}\n c.lights.forEach(function (Lt: any) {\n const cen = I.lightCenter(c, Lt, inv)\n const k = Lt.kind === 'taillight' ? 'taillight' : 'headlight'\n const s = Math.abs(cen.z) < W * 0.12 ? 'center' : cen.z < 0 ? 'left' : 'right'\n const key = k + '_' + s\n ;(G[key] || (G[key] = [])).push(Lt)\n })\n Object.keys(G).forEach(function (key) {\n const p = key.split('_')\n const n =\n p[1] === 'center'\n ? p[0] === 'headlight'\n ? t('zones.light_bar_front')\n : fam === 'bike'\n ? t('zones.taillight')\n : t('zones.light_bar_rear')\n : t(p[0] === 'headlight' ? 'zones.headlight' : 'zones.taillight_side', { s: p[1] === 'left' ? -1 : 1 })\n if (fam === 'bike' && p[0] === 'headlight') return /* the motorcycle headlight sits in the fairing */\n /* lights on the same side that are far apart (roof light, trunk taillight) become separate zones, so the box does not cover half the vehicle */\n const cl2: any = []\n const split = fam === 'car' || fam === 'heavy' || fam === 'military'\n G[key].forEach(function (Lt: any) {\n if (!split) {\n if (!cl2.length) cl2.push({ L: [], bb: new THREE.Box3() })\n cl2[0].L.push(Lt)\n cl2[0].bb.union(I.lightBoxOf(c, Lt, inv))\n return\n }\n const lb = I.lightBoxOf(c, Lt, inv)\n const q = cl2.find(function (k2: any) {\n return k2.bb.distanceToPoint(lb.getCenter(new V3())) < 0.7\n })\n if (q) {\n q.L.push(Lt)\n q.bb.union(lb)\n } else cl2.push({ L: [Lt], bb: lb.clone() })\n })\n cl2.sort(function (a2: any, b2: any) {\n return (p[0] === 'headlight' ? -1 : 1) * (a2.bb.max.x - b2.bb.max.x) || a2.bb.min.y - b2.bb.min.y\n })\n cl2.forEach(function (q: any, i: any) {\n add(i ? key + '_' + (i + 1) : key, i ? n + ' (' + (i + 1) + ')' : n, 'light', q.bb.expandByScalar(0.03), {\n lights: q.L,\n fxKey: p[0],\n seedId: legacyLightId(p[0], p[1], i),\n })\n })\n })\n }\n function wheelZones(byAxle: any) {\n wheelsDone = true\n if (!WH) return\n const ws = WH.list\n if (byAxle || ws.length > 6) {\n const ax: any = []\n ws.slice()\n .sort(function (a: any, b: any) {\n return b.position.x - a.position.x\n })\n .forEach(function (w: any) {\n const a = ax.find(function (q: any) {\n return Math.abs(q.x - w.position.x) < 0.75\n })\n if (a) a.w.push(w)\n else ax.push({ x: w.position.x, w: [w] })\n })\n ax.forEach(function (a: any, i: any) {\n const bb = new THREE.Box3()\n a.w.forEach(function (w: any) {\n bb.union(I.localBox(c, w, inv))\n })\n const n =\n ax.length === 1\n ? t('zones.wheels')\n : i === 0\n ? t('zones.wheels_axle_front')\n : i === ax.length - 1\n ? t('zones.wheels_axle_rear')\n : t('zones.wheels_axle_n', { n: i + 1 })\n add('wheels_axle_' + (i + 1), n, 'wheel', bb.expandByScalar(0.04), { wheels: a.w, fxKey: 'axle', seedId: 'rodas_eixo' + (i + 1) })\n })\n return\n }\n const used: any = {}\n ws.forEach(function (w: any) {\n const fr = w.position.x >= (WH.xf + WH.xr) / 2 ? 'front' : 'rear'\n const sd = Math.abs(w.position.z) < 0.08 ? 0 : w.position.z < 0 ? -1 : 1\n let n = sd ? t('zones.wheel_' + fr + '_side', { s: sd }) : t('zones.wheel_' + fr)\n let id = 'wheel_' + fr + (sd ? (sd < 0 ? '_left' : '_right') : '')\n let seed = 'roda_' + (fr === 'front' ? 'dianteira' : 'traseira') + (sd ? (sd < 0 ? '_esquerda' : '_direita') : '')\n if (used[id]) {\n id += '_' + ++used[id]\n seed += '_' + used[id]\n n += ' ' + used[id]\n } else used[id] = 1\n add(id, n, 'wheel', I.localBox(c, w, inv).expandByScalar(0.04), { wheels: [w], who: '', seedId: seed })\n })\n }\n function internal(kind2: any, n: any, fxKey: any, sz?: any) {\n const ps = I.partsOf(c, kind2)\n if (!ps.length) return null\n const p = ps[0].pos\n const s = sz || [0.42, 0.3, 0.4]\n return add(kind2, n, 'internal', [p.x - s[0], p.x + s[0], p.y - s[1], p.y + s[1], p.z - s[2], p.z + s[2]], {\n fxKey: fxKey || kind2,\n pos: p.clone(),\n sub: kind2,\n })\n }\n\n if (fam === 'car') {\n const gh = m.glasshouse && m.glasshouse.fb != null ? m.glasshouse : null\n const sb = 0.34\n const out = 0.25\n const fb = gh ? gh.fb : F - 0.3 * L\n const rb = gh && gh.rb != null ? gh.rb : R + 0.2 * L\n const xr = WH ? WH.xr : R + 0.25 * L\n const rr = WH ? WH.rr : 0.3\n const doorF = fb - 0.03\n const pil =\n gh && gh.pillars\n ? gh.pillars.slice().sort(function (a: any, b: any) {\n return b - a\n })\n : []\n const B = pil.length && pil[0] < doorF - 0.45 && pil[0] > rb + 0.2 ? pil[0] : Math.max(rb + 0.1, doorF - 1.1)\n const rearDoor = pil.length > 0 && pil[0] < doorF - 0.45 && B - Math.max(rb, xr) > 0.5\n const C = rearDoor ? Math.max(pil[1] != null && pil[1] < B - 0.4 ? pil[1] : rb, xr + rr * 0.2) : B\n const y0s = Math.max(0.03, cl - 0.12)\n const y1s = belt + 0.03\n const sideB = function (x0: any, x1: any, s: any, y0?: any, y1?: any) {\n return s < 0\n ? [x0, x1, y0 == null ? y0s : y0, y1 == null ? y1s : y1, -hw - out, -hw + sb]\n : [x0, x1, y0 == null ? y0s : y0, y1 == null ? y1s : y1, hw - sb, hw + out]\n }\n let bF = m.frontBumper && m.frontBumper.parent ? m.frontBumper : null\n let bR = m.rearBumper && m.rearBumper.parent ? m.rearBumper : null\n I.partsOf(c, 'bumper').forEach(function (p: any) {\n if (!p.obj || !p.obj.parent) return\n if (p.pos.x > (F + R) / 2) bF = bF || p.obj\n else bR = bR || p.obj\n })\n add('bumper_front', t('zones.bumper_front'), bF ? 'bumper' : 'panel', [F - 0.3, F + 0.25, -0.02, cl + 0.36, -hw - 0.2, hw + 0.2], {\n objs: bF ? [bF] : [],\n dir: [-1, 0, 0],\n fxKey: 'bumper',\n tags: ['front'],\n })\n if (c.hood && c.hood.piv && c.hood.x1 > (F + R) / 2) {\n const hb = I.localBox(c, c.hood.piv, inv)\n add(\n 'hood',\n t('zones.hood'),\n 'hood',\n [hb.min.x - 0.02, hb.max.x + 0.03, hb.min.y - 0.08, hb.max.y + 0.15, hb.min.z - 0.02, hb.max.z + 0.02],\n { objs: [c.hood.piv], dir: [0, -1, 0] },\n )\n } else\n add('hood', t('zones.hood'), 'panel', [fb + 0.02, F - 0.22, (cl + belt) / 2, belt + 0.2, -hw + 0.12, hw - 0.12], {\n dir: [0, -1, 0],\n fxKey: 'hood',\n })\n ;[-1, 1].forEach(function (s) {\n const e = s < 0 ? 'left' : 'right'\n if (F - 0.22 - doorF > 0.2)\n add('fender_front_' + e, t('zones.fender_front', { s }), 'panel', sideB(doorF, F - 0.22, s), { side: s, fxKey: 'fender' })\n add(\n 'door_front_' + e,\n t(rearDoor || pil.length ? 'zones.door_front' : 'zones.door', { s }),\n 'door',\n sideB(B, doorF, s, null, y1s),\n {\n side: s,\n hinge: 'front',\n mirror: true,\n who: t(s < 0 ? 'who.driver' : 'who.passenger'),\n },\n )\n if (rearDoor)\n add('door_rear_' + e, t('zones.door_rear', { s }), 'door', sideB(C, B, s), {\n side: s,\n hinge: 'front',\n who: t(s < 0 ? 'who.rear_left' : 'who.rear_right'),\n })\n if (C - (R + 0.22) > 0.22)\n add('side_rear_' + e, t('zones.side_rear', { s }), 'panel', sideB(R + 0.22, C, s), {\n side: s,\n fxKey: 'side_panel',\n who: t(m.bed ? 'who.cargo' : 'who.rear_seats'),\n })\n })\n if (gh && gh.roof)\n add(\n 'roof',\n t('zones.roof'),\n 'roof',\n [Math.min(rb, gh.rt) - 0.06, Math.max(fb, gh.ft) + 0.06, belt + 0.1, top + 0.15, -hw - 0.05, hw + 0.05],\n { dir: [0, -1, 0], alsoGlass: true },\n )\n else\n add('roof', t('zones.roof'), 'roof', [R + 0.25 * L, F - 0.35 * L, belt + 0.1, top + 0.15, -hw - 0.05, hw + 0.05], {\n dir: [0, -1, 0],\n alsoGlass: true,\n })\n if (m.bed) {\n const bx1 = Math.max(m.bed.x0, m.bed.x1)\n add('cargo_bed', t('zones.cargo_bed'), 'lid', [R - 0.15, bx1 + 0.04, cl - 0.05, belt + 0.2, -hw + sb - 0.02, hw - sb + 0.02], {\n dir: [1, 0, 0],\n fxKey: 'cargo_bed',\n hinge: 'down',\n tags: ['rear'],\n })\n } else {\n const tx1 = Math.max(R + 0.35, Math.min(rb + 0.12, R + 1.1))\n add(\n 'lid',\n t(rb - R > 0.7 ? 'zones.trunk_lid' : 'zones.tail_lid'),\n 'lid',\n [R - 0.15, tx1, cl + 0.3, belt + 0.22, -hw + 0.12, hw - 0.12],\n { dir: [1, 0, 0], hinge: 'up', tags: ['rear'] },\n )\n }\n add('bumper_rear', t('zones.bumper_rear'), bR ? 'bumper' : 'panel', [R - 0.25, R + 0.3, -0.02, cl + 0.36, -hw - 0.2, hw + 0.2], {\n objs: bR ? [bR] : [],\n dir: [1, 0, 0],\n fxKey: 'bumper',\n tags: ['rear'],\n })\n add('underbody', t('zones.underbody'), 'internal', [R, F, -0.05, cl + 0.06, -hw, hw], { fxKey: 'underbody', sub: 'underbody' })\n glassZones(false)\n lightZones()\n wheelZones(false)\n internal('engine', t(c.meta.bay && c.meta.bay.motor === 'electric' ? 'zones.engine_electric' : 'zones.engine'), 'engine')\n internal('radiator', t('zones.radiator'), 'radiator', [0.2, 0.25, 0.45])\n internal('fuel_tank', t('zones.fuel_tank'), 'fuel_tank', [0.35, 0.18, 0.4])\n internal('battery', t('zones.battery'), 'battery', [0.35, 0.2, 0.4])\n } else if (fam === 'bike') {\n const xf = WH ? WH.xf : F - 0.3\n const xrb = WH ? WH.xr : R + 0.3\n const rf2 = WH ? WH.rf : 0.3\n const wb = xf - xrb\n const bici = c.spec && c.spec.fuel === 'none'\n const wq = Math.max(0.36, hw + 0.05)\n const tb = top\n if (kind === 'quad') {\n add('fairing', t('zones.fairing'), 'part', [xf - 0.25, F + 0.12, rf2 * 1.2, tb - 0.08, -wq, wq], {\n fxKey: 'fairing',\n dir: [-1, 0, 0],\n })\n add('handlebar', t('zones.handlebar_levers'), 'part', [xf - 0.75, xf - 0.25, belt + 0.05, tb + 0.12, -wq, wq], {\n fxKey: 'handlebar',\n dir: [0, -1, 0],\n })\n add('fuel_tank', t('zones.tank'), 'part', [xrb + wb * 0.45, xf - 0.75, belt - 0.15, belt + 0.25, -0.25, 0.25], {\n fxKey: 'fuel_tank',\n dir: [0, -1, 0],\n seedId: 'tanque_moto',\n })\n add('seat', t('zones.seat_rack'), 'part', [R - 0.12, xrb + wb * 0.45, belt - 0.2, tb + 0.12, -wq, wq], {\n fxKey: 'seat',\n dir: [0, -1, 0],\n })\n } else if (bici) {\n add('handlebar', t('zones.handlebar'), 'part', [xf - 0.45, xf + 0.15, tb - 0.22, tb + 0.12, -0.4, 0.4], {\n fxKey: 'handlebar',\n dir: [0, -1, 0],\n })\n add('frame', t('zones.frame'), 'part', [xrb + rf2 * 0.6, xf - rf2 * 0.3, rf2 * 0.6, tb - 0.22, -0.12, 0.12], {\n fxKey: 'frame',\n dir: [0, 0, 1],\n })\n add('seat', t('zones.seat_rack'), 'part', [R - 0.1, xrb + rf2 * 0.6, rf2 * 1.4, tb + 0.12, -0.3, 0.3], {\n fxKey: 'seat',\n dir: [0, -1, 0],\n })\n } else {\n add('fairing', t('zones.fairing'), 'part', [xf - 0.3, F + 0.12, rf2 * 1.5, tb - 0.2, -0.38, 0.38], {\n fxKey: 'fairing',\n dir: [-1, 0, 0],\n })\n add('handlebar', t('zones.handlebar_levers'), 'part', [xf - 0.6, xf + 0.05, tb - 0.2, tb + 0.15, -0.55, 0.55], {\n fxKey: 'handlebar',\n dir: [0, -1, 0],\n })\n add('fuel_tank', t('zones.tank'), 'part', [xrb + wb * 0.52, xf - 0.28, belt - 0.12, tb - 0.2, -0.3, 0.3], {\n fxKey: 'fuel_tank',\n dir: [0, -1, 0],\n seedId: 'tanque_moto',\n })\n add('seat', t('zones.seat_tail'), 'part', [R - 0.12, xrb + wb * 0.52, belt - 0.2, tb - 0.15, -0.3, 0.3], {\n fxKey: 'seat',\n dir: [0, -1, 0],\n })\n }\n if (!bici) {\n const ex = m.exhaust\n const es = ex && ex.z < 0 ? -1 : 1\n add('engine', t('zones.engine'), 'part', [xrb + wb * 0.3, xf - wb * 0.22, 0.12, belt - 0.12, -0.24, 0.24], {\n fxKey: 'engine',\n dir: [0, 0, 1],\n sub: 'engine',\n })\n add(\n 'exhaust',\n t('zones.exhaust'),\n 'part',\n es > 0 ? [R - 0.25, xrb + wb * 0.45, 0.08, belt - 0.12, 0.1, 0.5] : [R - 0.25, xrb + wb * 0.45, 0.08, belt - 0.12, -0.5, -0.1],\n { fxKey: 'exhaust', dir: [0, 0, -es], side: es },\n )\n }\n glassZones(true)\n lightZones()\n wheelZones(false)\n } else if (fam === 'heavy') {\n const bus = kind === 'bus'\n const tractor = kind === 'tractor'\n const sbH = 0.42\n const cabL = m.cabLength || (bus ? 2.0 : tractor ? 0 : 2.3)\n if (tractor) {\n const xc = (WH ? WH.xr : R + 0.6) + 0.35\n add('front', t('zones.grille_front'), 'panel', [F - 0.4, F + 0.25, 0.1, belt + 0.3, -hw * 0.6, hw * 0.6], {\n dir: [-1, 0, 0],\n tags: ['front'],\n })\n add(\n 'tractor_hood',\n t('zones.engine_hood'),\n c.hood && c.hood.piv ? 'hood' : 'panel',\n [xc + 0.3, F - 0.4, belt - 0.25, belt + 0.45, -hw * 0.45, hw * 0.45],\n { dir: [0, -1, 0], fxKey: 'hood', objs: c.hood && c.hood.piv ? [c.hood.piv] : [] },\n )\n ;[-1, 1].forEach(function (s) {\n add(\n 'fender_rear_' + (s < 0 ? 'left' : 'right'),\n t('zones.fender_rear', { s }),\n 'panel',\n s < 0 ? [R - 0.1, xc + 0.5, 0.6, top - 0.6, -hw - 0.2, -hw + 0.55] : [R - 0.1, xc + 0.5, 0.6, top - 0.6, hw - 0.55, hw + 0.2],\n { side: s, fxKey: 'fender' },\n )\n })\n /* operator station: seat, steering wheel and platform (not the canopy, which is the roll-bar zone) */\n const stp = c.seatTops[0]\n const sy = stp ? stp.y : belt + 0.2\n add('operator_station', t('zones.operator_station'), 'part', [R - 0.1, xc + 0.5, sy - 0.45, sy + 0.75, -hw * 0.45, hw * 0.45], {\n dir: [0, -1, 0],\n fxKey: 'cab',\n who: t('who.tractor_driver'),\n noFlap: true,\n })\n } else {\n const cx0 = F - cabL\n add(\n 'cab_front',\n t(bus ? 'zones.bus_front' : 'zones.cab_front'),\n 'panel',\n [F - 0.45, F + 0.25, Math.max(0.05, cl - 0.1), top + 0.1, -hw - 0.1, hw + 0.1],\n { dir: [-1, 0, 0], fxKey: 'cab', who: t('who.driver'), tags: ['front'] },\n )\n ;[-1, 1].forEach(function (s) {\n const e = s < 0 ? 'left' : 'right'\n add(\n 'cab_' + e,\n t(bus ? 'zones.bus_front_side' : 'zones.cab_side', { s }),\n 'panel',\n s < 0\n ? [cx0, F - 0.45, Math.max(0.05, cl - 0.1), top + 0.1, -hw - 0.25, -hw + sbH]\n : [cx0, F - 0.45, Math.max(0.05, cl - 0.1), top + 0.1, hw - sbH, hw + 0.25],\n { side: s, fxKey: 'cab', who: t(s < 0 ? 'who.driver' : bus ? 'who.boarding_door' : 'who.helper') },\n )\n })\n const big = bus\n ? t('zones.body_saloon')\n : m.bigBlast || matchers.tank.test((c.spec && c.spec.name) || '')\n ? t('zones.body_tank')\n : m.bodyLabel || t(m.bodyKind === 'body' ? 'zones.body_body' : 'zones.body_box')\n ;[-1, 1].forEach(function (s) {\n add(\n 'body_' + (s < 0 ? 'left' : 'right'),\n t('zones.body_side', { label: big, s }),\n 'panel',\n s < 0\n ? [R + 0.4, cx0, Math.max(0.05, cl - 0.1), top + 0.15, -hw - 0.25, -hw + sbH]\n : [R + 0.4, cx0, Math.max(0.05, cl - 0.1), top + 0.15, hw - sbH, hw + 0.25],\n { side: s, fxKey: 'side_panel', who: t(bus ? 'who.seated_side' : 'who.cargo') },\n )\n })\n add(\n 'body_rear',\n t('zones.body_rear', { label: big }),\n 'panel',\n [R - 0.25, R + 0.4, Math.max(0.05, cl - 0.1), top + 0.15, -hw - 0.1, hw + 0.1],\n {\n dir: [1, 0, 0],\n fxKey: bus ? 'side_panel' : 'lid',\n who: t(bus ? 'who.back_seats' : 'who.cargo'),\n tags: ['rear'],\n },\n )\n }\n add('chassis', t('zones.chassis'), 'internal', [R, F, -0.05, cl + 0.12, -hw, hw], { fxKey: 'chassis', sub: 'underbody' })\n glassZones(true)\n lightZones()\n wheelZones(true)\n internal('engine', t('zones.engine'), 'engine', [0.6, 0.45, 0.5])\n internal('fuel_tank', t(bus ? 'zones.diesel_tank' : 'zones.fuel_tank'), 'fuel_tank', [0.4, 0.3, 0.35])\n } else if (fam === 'military') {\n const sbm = 0.45\n const lag = I.partsOf(c, 'track')\n const hb2 = (m.hullTop || belt) + 0.12\n add('armor_front', t('zones.armor_front'), 'panel', [F - 0.65, F + 0.3, Math.max(0.05, cl - 0.15), hb2, -hw - 0.2, hw + 0.2], {\n dir: [-1, 0, 0],\n fxKey: 'armor',\n tags: ['front'],\n })\n ;[-1, 1].forEach(function (s) {\n add(\n 'armor_' + (s < 0 ? 'left' : 'right'),\n t('zones.armor_side', { s }),\n 'panel',\n s < 0\n ? [R + 0.45, F - 0.65, Math.max(0.05, cl - 0.15), hb2, -hw - 0.3, -hw + sbm]\n : [R + 0.45, F - 0.65, Math.max(0.05, cl - 0.15), hb2, hw - sbm, hw + 0.3],\n { side: s, fxKey: 'armor', who: t('who.crew_side') },\n )\n })\n add('armor_rear', t('zones.armor_rear'), 'panel', [R - 0.3, R + 0.45, Math.max(0.05, cl - 0.15), hb2, -hw - 0.2, hw + 0.2], {\n dir: [1, 0, 0],\n fxKey: 'armor',\n tags: ['rear'],\n })\n /* weapon: the longest mesh in x above the belt line (barrel) */\n let gun: any = null\n let gl2 = 0\n c.vehicle.traverse(function (o: any) {\n if (!o.isMesh || o.userData.decal) return\n const bb = I.localBox(c, o, inv)\n const sx = bb.max.x - bb.min.x\n const sy = bb.max.y - bb.min.y\n const sz = bb.max.z - bb.min.z\n if (bb.min.y > belt - 0.1 && sx > 0.7 && sx > 5 * Math.max(sy, sz) && sx > gl2) {\n gl2 = sx\n gun = { o: o, bb: bb }\n }\n })\n if (gun)\n add('weapon', t(gl2 > 2 ? 'zones.cannon' : 'zones.weapon'), 'part', gun.bb.clone().expandByScalar(0.08), {\n objs: [gun.o],\n fxKey: 'weapon',\n dir: [0, -1, 0],\n anchor: [gun.bb.min.x, (gun.bb.min.y + gun.bb.max.y) / 2, (gun.bb.min.z + gun.bb.max.z) / 2],\n })\n add('turret', t('zones.turret'), 'roof', [R + 0.35, F - 0.3, hb2, top + 0.25, -hw + 0.12, hw - 0.12], {\n dir: [0, -1, 0],\n fxKey: 'turret',\n alsoGlass: true,\n })\n if (lag.length)\n lag.forEach(function (p: any) {\n const s = p.pos.z < 0 ? -1 : 1\n const bb = I.localBox(c, p.obj, inv)\n const ws2 = c.wheels.filter(function (w: any) {\n return Math.sign(w.position.z) === s\n })\n const objs = [p.obj]\n c.spin.forEach(function (sp: any) {\n if (sp.track && Math.sign(sp.o.position.z) === s) objs.push(sp.o)\n })\n add('track_' + (s < 0 ? 'left' : 'right'), t('zones.track', { s }), 'part', bb.expandByScalar(0.05), {\n objs: objs,\n wheels: ws2,\n fxKey: 'track',\n side: s,\n track: p.obj,\n dir: [0, 0, -s],\n })\n })\n else if (WH)\n [-1, 1].forEach(function (s) {\n const ws3 = WH.list.filter(function (w: any) {\n return Math.sign(w.position.z) === s\n })\n if (!ws3.length) return\n const bb = new THREE.Box3()\n ws3.forEach(function (w: any) {\n bb.union(I.localBox(c, w, inv))\n })\n add('wheels_' + (s < 0 ? 'left' : 'right'), t('zones.wheels_side', { s }), 'wheel', bb.expandByScalar(0.04), {\n wheels: ws3,\n fxKey: 'axle',\n side: s,\n })\n })\n wheelsDone = true\n glassZones(true)\n lightZones()\n internal('engine', t('zones.engine'), 'engine', [0.6, 0.4, 0.55])\n } else if (fam === 'boat') {\n const bowL = 0.28 * L\n const sternL = 0.2 * L\n add('bow', t('zones.bow'), 'panel', [F - bowL, F + 0.3, cl - 0.4, belt + 0.25, -hw - 0.3, hw + 0.3], {\n dir: [-1, 0, 0],\n fxKey: 'hull',\n tags: ['front'],\n anyMesh: true,\n })\n ;[-1, 1].forEach(function (s) {\n add(\n 'side_' + (s < 0 ? 'left' : 'right'),\n t(s < 0 ? 'zones.port_side' : 'zones.starboard_side'),\n 'panel',\n s < 0\n ? [R + sternL, F - bowL, cl - 0.4, belt + 0.06, -hw - 0.35, -hw + 0.4]\n : [R + sternL, F - bowL, cl - 0.4, belt + 0.06, hw - 0.4, hw + 0.35],\n { side: s, fxKey: 'hull', who: t('who.boat_side'), anyMesh: true },\n )\n })\n add('stern', t('zones.stern'), 'panel', [R - 0.25, R + sternL, cl - 0.4, belt + 0.35, -hw - 0.3, hw + 0.3], {\n dir: [1, 0, 0],\n fxKey: 'hull',\n tags: ['rear'],\n anyMesh: true,\n })\n add('deck', t('zones.deck'), 'roof', [R + sternL, F - bowL, belt + 0.06, top + 0.4, -hw + 0.4, hw - 0.4], {\n dir: [0, -1, 0],\n fxKey: 'deck',\n alsoGlass: true,\n })\n const pp = I.partsOf(c, 'stern')[0]\n if (pp && pp.obj) {\n const pb = I.localBox(c, pp.obj, inv)\n add('engine', t('zones.outboard_engine'), 'part', pb.expandByScalar(0.05), {\n objs: [pp.obj],\n fxKey: 'engine',\n dir: [1, 0, 0],\n sub: 'engine',\n pos: pp.pos.clone(),\n })\n } else internal('engine', t('zones.engine'), 'engine', [0.5, 0.35, 0.45])\n internal('fuel_tank', t('zones.fuel_tank'), 'fuel_tank', [0.35, 0.25, 0.35])\n glassZones(true)\n lightZones()\n wheelZones(false)\n } else if (fam === 'plane') {\n const fw = (m.fuselageWidth || 1.2) / 2\n const span = W / 2\n const wingBB = new THREE.Box3()\n const tailX = R + Math.min(2.0, 0.28 * L)\n c.vehicle.traverse(function (o: any) {\n if (!o.isMesh || o.userData.decal) return\n const bb = I.localBox(c, o, inv)\n if (Math.max(Math.abs(bb.min.z), Math.abs(bb.max.z)) > Math.max(2.0, span * 0.45) && bb.min.x > tailX) wingBB.union(bb)\n })\n if (wingBB.isEmpty()) wingBB.set(new V3(F - 3.0, belt, -span), new V3(F - 1.5, top, span))\n const hp = I.partsOf(c, 'propeller')[0]\n add(\n 'nose',\n t(hp ? 'zones.nose_propeller' : 'zones.nose_engine'),\n 'panel',\n [F - 1.25, F + 0.6, cl - 0.8, top + 0.2, -fw - 0.5, fw + 0.5],\n {\n dir: [-1, 0, 0],\n fxKey: 'nose',\n objs: hp && hp.obj ? [hp.obj] : [],\n tags: ['front'],\n anyMesh: true,\n },\n )\n add('cab', t('zones.cabin_glass'), 'panel', [wingBB.min.x - 0.4, F - 1.25, belt - 0.4, top + 0.15, -fw - 0.12, fw + 0.12], {\n dir: [0, 0, 1],\n fxKey: 'aircraft_cabin',\n who: t('who.pilot'),\n anyMesh: true,\n })\n ;[-1, 1].forEach(function (s) {\n add(\n 'wing_' + (s < 0 ? 'left' : 'right'),\n t('zones.wing', { s }),\n 'panel',\n s < 0\n ? [wingBB.min.x - 0.15, wingBB.max.x + 0.15, wingBB.min.y - 0.25, wingBB.max.y + 0.25, -span - 0.3, -fw - 0.18]\n : [wingBB.min.x - 0.15, wingBB.max.x + 0.15, wingBB.min.y - 0.25, wingBB.max.y + 0.25, fw + 0.18, span + 0.3],\n { side: s, dir: [0, -1, 0], fxKey: 'wing', cutAll: true, anyMesh: true },\n )\n })\n add('fuselage', t('zones.rear_fuselage'), 'panel', [tailX, wingBB.min.x - 0.4, cl - 0.2, top, -fw - 0.12, fw + 0.12], {\n dir: [0, 0, 1],\n fxKey: 'panel',\n anyMesh: true,\n })\n add('tail', t('zones.tail'), 'panel', [R - 0.4, tailX, 0, top + 0.6, -span * 0.5, span * 0.5], {\n dir: [0, -1, 0],\n fxKey: 'tail',\n cutAll: true,\n anyMesh: true,\n tags: ['rear'],\n })\n const gear = c.wheels.filter(function (w: any) {\n return w.parent\n })\n if (gear.length) {\n /* legs and fairings of the wheels (low parts near each wheel) belong to the gear: they fold and disappear together */\n const gb = new THREE.Box3()\n const gobj: any = []\n gear.forEach(function (w: any) {\n gb.union(I.localBox(c, w, inv))\n })\n c.vehicle.children.forEach(function (o: any) {\n if (!o.isMesh || o.userData.decal || o.userData.glass || c.wheels.indexOf(o) >= 0) return\n const bb = I.localBox(c, o, inv)\n const cen = bb.getCenter(new V3())\n const sz = bb.getSize(new V3())\n if (bb.isEmpty() || cen.y > cl * 0.85 || bb.max.y > cl + 0.45 || Math.max(sz.x, sz.y, sz.z) > 1.6) return\n if (\n !gear.some(function (w: any) {\n return Math.abs(w.position.x - cen.x) < 0.7 && Math.abs(w.position.z - cen.z) < 0.9\n })\n )\n return\n gobj.push(o)\n gb.union(bb)\n })\n add('landing_gear', t('zones.landing_gear'), 'wheel', gb.expandByScalar(0.06), { wheels: gear, objs: gobj, fxKey: 'landing_gear' })\n }\n add(\n 'fuel_tanks',\n t('zones.wing_tanks'),\n 'internal',\n [wingBB.min.x, wingBB.max.x, wingBB.min.y - 0.1, wingBB.max.y + 0.1, -span * 0.55, span * 0.55],\n { fxKey: 'fuel_tank', sub: 'fuel_tank', pos: new V3((wingBB.min.x + wingBB.max.x) / 2, wingBB.min.y, -span * 0.35) },\n )\n glassZones(true)\n glassDone = true\n lightZones()\n wheelsDone = true\n Z = Z.filter(function (z: any) {\n return z.type !== 'glass'\n }) /* the aircraft glass stays in the cabin */\n } else if (fam === 'heli') {\n const fw2 = (m.fuselageWidth || 1.3) / 2\n const ft2 = m.fuselageTop || Math.min(top - 0.5, belt + 1.0)\n const rp = I.partsOf(c, 'rotor')[0]\n const rt = I.partsOf(c, 'tail_rotor')[0]\n add('nose', t('zones.nose_bubble'), 'panel', [F - 1.05, F + 0.3, cl - 0.25, ft2 + 0.1, -fw2 - 0.2, fw2 + 0.2], {\n dir: [-1, 0, 0],\n fxKey: 'aircraft_cabin',\n who: t('who.pilot'),\n tags: ['front'],\n anyMesh: true,\n })\n add('cab', t('zones.cabin'), 'panel', [F - Math.min(3.2, 0.36 * L), F - 1.05, cl - 0.25, ft2 + 0.1, -fw2 - 0.25, fw2 + 0.25], {\n dir: [0, 0, 1],\n fxKey: 'cab',\n who: t('who.passengers'),\n anyMesh: true,\n })\n add('tail_cone', t('zones.tail_cone'), 'panel', [R + 1.0, F - Math.min(3.2, 0.36 * L), cl, ft2 + 0.6, -fw2 - 0.3, fw2 + 0.3], {\n dir: [0, -1, 0],\n fxKey: 'tail_cone',\n cutAll: true,\n anyMesh: true,\n tags: ['rear'],\n })\n if (rp && rp.obj)\n add('rotor', t('zones.main_rotor'), 'part', I.localBox(c, rp.obj, inv).expandByScalar(0.05), {\n objs: [rp.obj],\n fxKey: 'rotor',\n dir: [0, -1, 0],\n kindPart: 'rotor',\n })\n if (rt && rt.obj)\n add('tail_rotor', t('zones.tail_rotor'), 'part', I.localBox(c, rt.obj, inv).expandByScalar(0.05), {\n objs: [rt.obj],\n fxKey: 'tail_rotor',\n dir: [0, 0, 1],\n kindPart: 'tail_rotor',\n })\n const gear2 = c.wheels.filter(function (w: any) {\n return w.parent\n })\n add(\n 'skids',\n t(gear2.length ? 'zones.landing_gear' : 'zones.skids'),\n gear2.length ? 'wheel' : 'part',\n [R + 1.0, F, -0.05, cl + 0.05, -W / 2 - 0.2, W / 2 + 0.2],\n { wheels: gear2, fxKey: gear2.length ? 'landing_gear' : 'skid', dir: [0, 1, 0] },\n )\n add('engine', t('zones.engine_transmission'), 'internal', [F - Math.min(3.4, 0.4 * L), F - 1.4, ft2 - 0.35, ft2 + 0.5, -fw2, fw2], {\n fxKey: 'engine',\n sub: 'engine',\n })\n glassZones(true)\n lightZones()\n wheelsDone = true\n Z = Z.filter(function (z: any) {\n return z.type !== 'glass'\n }) /* glass goes to the nose and the cabin */\n } else {\n /* generic: four sides and top */\n add('front', t('zones.front'), 'panel', [F - 0.4, F + 0.3, 0, top, -hw - 0.2, hw + 0.2], { dir: [-1, 0, 0], tags: ['front'] })\n ;[-1, 1].forEach(function (s) {\n add(\n 'side_' + (s < 0 ? 'left' : 'right'),\n t('zones.side', { s }),\n 'panel',\n s < 0 ? [R + 0.4, F - 0.4, 0, top, -hw - 0.3, -hw + 0.4] : [R + 0.4, F - 0.4, 0, top, hw - 0.4, hw + 0.3],\n { side: s },\n )\n })\n add('rear', t('zones.rear'), 'panel', [R - 0.3, R + 0.4, 0, top, -hw - 0.2, hw + 0.2], { dir: [1, 0, 0], tags: ['rear'] })\n add('top', t('zones.top'), 'roof', [R + 0.4, F - 0.4, top - 0.4, top + 0.2, -hw + 0.4, hw - 0.4], { dir: [0, -1, 0] })\n }\n if (!glassDone) glassZones(true)\n if (!lightsDone) lightZones()\n if (!wheelsDone) wheelZones(false)\n return Z\n }\n\n Object.assign(I, { autoZones })\n}\n","/** Applies zone health to a built vehicle: bands, decals, owned parts and scenarios. */\nimport type { Kit } from './types'\nimport { clamp, rng, strHash } from './util'\nimport { SEED_SALTS, legacyZoneId } from './legacy-seeds'\n\nexport function installZoneApply(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n const { RUST, crease } = I\n\n /* ---- applying all zones ---- */\n function fadePaint(c: any) {\n const cache2 = new Map()\n c.vehicle.traverse(function (o: any) {\n if (!o.isMesh || !c.paints || !c.paints.has(o.material)) return\n let nm2 = cache2.get(o.material)\n if (!nm2) {\n nm2 = o.material.clone()\n const hsl: any = {}\n nm2.color.getHSL(hsl)\n nm2.color.setHSL(hsl.h, hsl.s * 0.45, Math.min(0.75, hsl.l * 0.9 + 0.08))\n nm2.color.lerp(RUST, 0.12)\n nm2.roughness = 0.96\n nm2.metalness = 0.05\n cache2.set(o.material, nm2)\n }\n o.material = nm2\n })\n }\n function abandonFx(c: any) {\n fadePaint(c)\n I.hurtEngine(c, 0.45)\n const inv = I.worldInverseOf(c)\n ;(c.zones || []).forEach(function (z: any) {\n if (z.internal || ['panel', 'door', 'roof', 'lid', 'hood', 'bumper'].indexOf(z.type) < 0) return\n c.rand = rng(strHash((c.seedKey || c.key) + SEED_SALTS.rust + legacyZoneId(z)))\n I.zoneDecals(c, z, { rust: 3 }, I.zoneCands(c, z, inv))\n })\n }\n function burntFx(c: any) {\n I.burnAll(c)\n const m = c.meta\n const ep = I.enginePos(c)\n I.hurtEngine(c, 0)\n kit.addEmitter(c, ep.clone().add(new V3(0, 0.15, 0)), 'fire', { rate: 5, s: 0.6 })\n kit.addEmitter(c, new V3(((m.front || 1) + (m.rear || -1)) / 2, (m.clearance || 0.3) + 0.35, 0), 'fire', { rate: 4, s: 0.55 })\n kit.addEmitter(c, ep.clone().add(new V3(0, 0.9, 0)), 'black', { rate: 3, s: 1.3 })\n c.emitters = c.emitters.filter(function (e: any) {\n return e.kind !== 'exhaust'\n })\n c.burnt = true\n }\n function settleDrops(c: any) {\n const D = c.zoneDrops\n if (!D || !D.length || (['boat', 'plane', 'heli'].indexOf(c.meta.kind) >= 0 && c.meta.kind !== 'plane')) return\n const WH = I.wheelInfo(c)\n if (!WH) return\n const P = function (w: any) {\n return w.userData.gpos || w.position\n } /* a wheel that went inside a pivot (broken gear) keeps its original position */\n const xs = WH.list.map(function (w: any) {\n return P(w).x\n })\n const zs2 = WH.list.map(function (w: any) {\n return P(w).z\n })\n const dAt = function (w: any) {\n const q = D.filter(function (e: any) {\n return Math.abs(e.x - P(w).x) < 0.01 && Math.abs(e.z - P(w).z) < 0.01\n })\n return q.length\n ? Math.max.apply(\n null,\n q.map(function (e: any) {\n return e.d\n }),\n )\n : 0\n }\n const xc =\n xs.reduce(function (s: any, v: any) {\n return s + v\n }, 0) / xs.length\n const zc =\n zs2.reduce(function (s: any, v: any) {\n return s + v\n }, 0) / zs2.length\n let sxx = 0\n let sxz = 0\n let szz = 0\n let sxd = 0\n let szd = 0\n let sd = 0\n WH.list.forEach(function (w: any) {\n const x = P(w).x - xc\n const z2 = P(w).z - zc\n const d = -dAt(w)\n sxx += x * x\n sxz += x * z2\n szz += z2 * z2\n sxd += x * d\n szd += z2 * d\n sd += d\n })\n const det = sxx * szz - sxz * sxz\n let A = 0\n let Bz = 0\n if (Math.abs(det) > 1e-6) {\n A = (sxd * szz - szd * sxz) / det\n Bz = (szd * sxx - sxd * sxz) / det\n } else if (sxx > 1e-6) A = sxd / sxx\n const t = sd / WH.list.length\n /* Δy(x, z) = A·x + Bz·z + (t − A·xc − Bz·zc): rotation.z gives A·x and rotation.x gives −sin(b)·z */\n c.vehicle.rotation.z += Math.atan(A)\n c.vehicle.rotation.x += -Math.asin(clamp(Bz, -0.5, 0.5))\n c.vehicle.position.y += t - A * xc - Bz * zc\n }\n kit.applyZones = function (c: any, zs: any) {\n const Zs = I.zonesOf(c)\n zs = zs || {}\n const H = zs.health || {}\n const FL = zs.flags || {}\n c.zoneState = { health: {}, flags: Object.assign({}, FL) }\n Zs.forEach(function (z: any) {\n z.health = H[z.id] == null ? 100 : clamp(Math.round(H[z.id]), 0, 100)\n z.band = I.bandOf(z.health)\n c.zoneState.health[z.id] = z.health\n })\n const R0 = c.rand\n const dirty = new Set()\n let any = false\n c.zoneDrops = []\n c.zoneErrors = c.zoneErrors || []\n Zs.forEach(function (z: any) {\n if (z.health >= 100) return\n any = true\n c.rand = rng(strHash((c.seedKey || c.key) + '|' + legacyZoneId(z) + '|' + z.band))\n try {\n const b = z.band\n if (z.type === 'wheel' && z.fxKey === 'landing_gear' && c.meta.kind === 'plane') I.gearBand(c, z, b)\n else if (z.type === 'wheel')\n z.wheels.forEach(function (w: any) {\n I.wheelBand(c, z, w, b)\n })\n else if (z.type === 'glass')\n z.glass.forEach(function (g: any) {\n I.glassBand(c, z, g, b)\n })\n else if (z.type === 'light')\n z.lights.forEach(function (Lt: any) {\n I.lightBand(c, z, Lt, b)\n })\n else if (z.type === 'internal') I.internalBand(c, z, b)\n else if (z.type === 'hood') I.hoodBand(c, z, b, dirty)\n else if (z.type === 'bumper') I.bumperBand(c, z, b, dirty)\n else if (z.type === 'part') I.partBand(c, z, b, dirty)\n else I.panelBand(c, z, b, dirty)\n if (z.type !== 'glass')\n z.glass.forEach(function (g: any) {\n if (b === 1 && g !== z.glass[0]) return\n I.glassBand(c, z, g, b === 4 ? 4 : b)\n })\n if (z.type !== 'light')\n z.lights.forEach(function (Lt: any) {\n I.lightBand(c, z, Lt, b)\n })\n if (z.type !== 'wheel' && !z.track)\n z.wheels.forEach(function (w: any) {\n I.wheelBand(c, z, w, b)\n })\n if (z.sub && z.type !== 'internal' && b >= 2)\n I.internalBand(c, Object.assign({}, z, { pos: z.pos || I.boxCenter(z.box) }), Math.min(b, 3))\n if (typeof z.onBand === 'function') z.onBand(c, b, z, kit)\n } catch (e: any) {\n c.zoneErrors.push(z.id + ': ' + (e && e.message))\n }\n })\n dirty.forEach(function (msh: any) {\n const g = msh.geometry\n if (g.userData.crease || !g.index) crease(g, 42)\n else g.computeVertexNormals()\n g.computeBoundingSphere()\n g.computeBoundingBox()\n })\n try {\n settleDrops(c)\n } catch (e: any) {\n c.zoneErrors.push('settling: ' + e.message)\n }\n c.rand = rng(strHash((c.seedKey || c.key) + SEED_SALTS.scenario))\n const flagList = Object.keys(FL)\n .filter(function (k) {\n return FL[k] && kit.flagEffects[k]\n })\n .sort(function (x, y) {\n return kit.flagEffects[x].order - kit.flagEffects[y].order\n })\n flagList.forEach(function (k) {\n kit.flagEffects[k].apply(c, FL, kit)\n })\n if (\n any ||\n FL.flipped ||\n flagList.some(function (k) {\n return kit.flagEffects[k].settle\n })\n ) {\n c.rand = rng(strHash((c.seedKey || c.key) + SEED_SALTS.settle))\n kit.settle(c, 2.5)\n }\n if (FL.flipped && !c.flipped) {\n c.rand = rng(strHash((c.seedKey || c.key) + SEED_SALTS.rollover))\n if (c.hood) {\n c.hood.target = 0\n }\n if (kit.roll(c, 1)) {\n for (let i = 0; i < 150 && !c.flipped; i++) kit.tick(c, 1 / 30)\n kit.settle(c, 1.5)\n }\n }\n if (any) I.updateFluids(c, 20)\n c.rand = R0\n return c.zoneState\n }\n\n Object.assign(I, { fadePaint, abandonFx, burntFx, settleDrops })\n}\n","/** Damage scenarios and the scenario registry. */\nimport type { Kit } from './types'\nimport { clamp, rng, strHash } from './util'\n\nexport function installScenarios(kit: Kit): void {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = kit._\n\n /* ---- ready-made scenarios: registered by the game plugin ----\n kit.scenario({ id, name, init?(X), zone(z, X) }) registers a scenario. In zone(), X.set(z, health) stores the zone health and X.flags receives\n flags (flipped, burnt, abandoned or those of kit.flagEffects). X carries: c, meta, front, rear, length, width, clearance, top, rand (deterministic random),\n center (centre of the current zone), isWindshield (windshield zone), bodyTypes (bodywork types), clamp. Returns { health, flags, scenario }. */\n kit.scenarios = []\n kit.scenario = function (def: any) {\n if (!def || !def.id || typeof def.zone !== 'function') throw new Error('kit.scenario: id and zone(z, X) are required')\n const i = kit.scenarios.findIndex(function (s: any) {\n return s.id === def.id\n })\n if (i >= 0) kit.scenarios[i] = def\n else kit.scenarios.push(def)\n return def\n }\n /* visual effects of scenario flags: kit.flagEffects[name] = { order, settle, apply(c, flags, kit) } */\n kit.flagEffects = {}\n /* generic ageing: faded paint, rust */\n kit.flagEffects.abandoned = { order: 20, settle: true, apply: I.abandonFx }\n /* fire and soot */\n kit.flagEffects.burnt = { order: 40, settle: true, apply: I.burntFx }\n const BODY_TYPES = { panel: 1, door: 1, roof: 1, lid: 1, hood: 1, bumper: 1 }\n kit.zoneScenario = function (c: any, name: any) {\n const Zs = I.zonesOf(c)\n const m = c.meta\n const F = m.front\n const R = m.rear\n const L = m.length || F - R\n const W = m.width || 1.7\n const cl = m.clearance || 0.3\n const top = m.top || 1.5\n const S = kit.scenarios.find(function (s: any) {\n return s.id === name || s.name === name\n })\n const sc = S ? S.id : name\n const health: Record<string, number> = {}\n const flags: any = {}\n const rand = rng(strHash((c.seedKey || c.key || '') + '|' + ((S && S.seedId) || sc)))\n function set(z: any, v: any) {\n health[z.id] = clamp(Math.round(v), 0, 100)\n }\n const X: any = {\n c: c,\n meta: m,\n front: F,\n rear: R,\n length: L,\n width: W,\n clearance: cl,\n top: top,\n rand: rand,\n set: set,\n flags: flags,\n health: health,\n bodyTypes: BODY_TYPES,\n clamp: clamp,\n center: null,\n isWindshield: false,\n }\n if (S) {\n if (S.init) S.init(X)\n Zs.forEach(function (z: any) {\n X.center = I.boxCenter(z.box)\n X.isWindshield = z.tags.indexOf('windshield') >= 0\n S.zone(z, X)\n })\n }\n return { health: health, flags: flags, scenario: sc }\n }\n /* overall health (weighted average) */\n kit.zoneOverall = function (c: any) {\n const Zs = I.zonesOf(c)\n let s = 0\n let w = 0\n Zs.forEach(function (z: any) {\n s += z.health * z.weight\n w += z.weight\n })\n let h = w ? Math.round(s / w) : 100\n /* floor by the worst structural zone: a destroyed or torn-off zone does not leave the vehicle \"Intact\" on average */\n const st = Zs.filter(function (z: any) {\n return !z.internal && z.type !== 'glass' && z.type !== 'light'\n })\n .map(function (z: any) {\n return z.health\n })\n .sort(function (a: any, b: any) {\n return a - b\n })\n if (st.length) {\n const w3 = st.slice(0, 3)\n const m3 =\n w3.reduce(function (a: any, b: any) {\n return a + b\n }, 0) / w3.length\n h = Math.min(h, Math.round(st[0] + 30), Math.round(m3 + 22))\n }\n const gl = Zs.filter(function (z: any) {\n return z.type === 'glass' || z.type === 'light'\n }).map(function (z: any) {\n return z.health\n })\n if (gl.length) h = Math.min(h, Math.round(Math.min.apply(null, gl) + 55))\n return { health: h, band: I.bandOf(h), name: kit.bands[I.bandOf(h)].name }\n }\n /* zone of point p (c.vehicle coordinates), with the optional mesh that was hit */\n kit.zoneAt = function (c: any, p: any, obj: any) {\n const Zs = I.zonesOf(c)\n const own = obj ? I.ownerOf(c, obj) : null\n if (own) return own\n let best: any = null\n Zs.forEach(function (z: any) {\n if (z.internal) return\n if (I.boxContains(z.box, p.x, p.y, p.z, 0.03) && (!best || I.boxVolume(z.box) < I.boxVolume(best.box))) best = z\n })\n if (best) return best\n let bd = 1e9\n Zs.forEach(function (z: any) {\n if (z.internal) return\n const d = I.boxDistance(z.box, p)\n if (d < bd) {\n bd = d\n best = z\n }\n })\n return best\n }\n /* impact at a point: takes health from the zones near the point, according to the force (0.3..1.4) */\n kit.zoneDamageAt = function (c: any, p: any, dir: any, force: any, obj: any) {\n const Zs = I.zonesOf(c)\n const main = kit.zoneAt(c, p, obj)\n const Rr = 0.35 + 0.35 * force\n const out: any = []\n Zs.forEach(function (z: any) {\n const d = z === main ? 0 : I.boxDistance(z.box, p)\n let dmg = 0\n if (z === main) dmg = force * 36\n else if (z.internal) {\n if (d < Rr * 0.6) dmg = force * 22 * (1 - d / (Rr * 0.6))\n } else if (d < Rr) dmg = force * 26 * Math.pow(1 - d / Rr, 1.3)\n if (dmg >= 1) out.push({ id: z.id, name: z.name, damage: Math.round(dmg) })\n })\n return { main: main ? main.id : null, list: out }\n }\n /* point and direction of the impacts by side (Front, Rear, Left side and Right side buttons) */\n kit.zonePoint = function (c: any, zone: any) {\n const m = c.meta\n const mid = m.clearance + (m.bodyHeight || 0.6) * 0.5\n let p\n let dir\n if (zone === 'front') {\n p = new V3(m.front, mid, m.width * 0.15)\n dir = new V3(-1, 0, 0)\n } else if (zone === 'rear') {\n p = new V3(m.rear, mid, -m.width * 0.15)\n dir = new V3(1, 0, 0)\n } else {\n const sd = zone === 'left' ? -1 : 1\n p = new V3((m.front + m.rear) * 0.5 + m.length * (sd < 0 ? 0.12 : -0.1), mid + 0.1, (sd * m.width) / 2)\n dir = new V3(0, 0, -sd)\n const h = I.probe(c, new V3(p.x, p.y, sd * (m.width / 2 + 3)), dir, 3 + m.width)\n if (h) p = h.p\n }\n return { p: p, dir: dir }\n }\n\n Object.assign(I, { BODY_TYPES })\n}\n","/** Damage-map widgets (SVG top-down map, band buttons, legend, health bar, scenario buttons). Optional: nothing else depends on it. */\nimport type { Kit } from './types'\n\nconst SVGNS = 'http://www.w3.org/2000/svg'\n/** Label colour on each band tile (dark on light bands, light on dark ones). */\nconst BAND_TEXT = ['#10140f', '#1c1606', '#1f1206', '#fff3ef', '#f1f2f2']\n\nexport function installUi(kit: Kit): void {\n const document = kit.document\n\n /** UI text: `config.texts.ui[key]` wins over the locale string `ui.<key>`. */\n function T(key: string): string {\n const override = kit.config.texts.ui || {}\n if (override[key] != null) return override[key]\n return kit.t('ui.' + key)\n }\n function el(tag: string, cls?: string | null, txt?: string | null): any {\n const e = document.createElement(tag)\n if (cls) e.className = cls\n if (txt != null) e.textContent = txt\n return e\n }\n function sv(tag: string, attrs?: Record<string, any>, parent?: any): any {\n const e = document.createElementNS(SVGNS, tag)\n Object.keys(attrs || {}).forEach(function (k) {\n e.setAttribute(k, (attrs as any)[k])\n })\n if (parent) parent.appendChild(e)\n return e\n }\n /** \"Front door · Dented 38%\" */\n function zoneLabel(z: any): string {\n const B = kit.bands[kit.bandOf(z.health)]\n return z.name + ' · ' + B.name + ' ' + z.health + '%'\n }\n /** Health range of a band as text (\"76–100\"); empty for the last band. */\n function bandRange(i: number): string {\n const B = kit.bands\n if (i === B.length - 1) return ''\n return B[i].min + '–' + (i === 0 ? 100 : B[i - 1].min - 1)\n }\n\n /**\n * Top-down damage map (SVG). `host`: element; `c`: context from `kit.build`; `o`: `{ selected (zone id), onSelect(id) }`.\n * External zones are drawn on the vehicle outline, internal zones in a strip of blocks below.\n */\n function damageMap(host: any, c: any, o?: any): any {\n o = o || {}\n const sel = o.selected\n host.innerHTML = ''\n const Z = c.zones\n const ext = Z.filter(function (z: any) {\n return !z.internal\n })\n const inn = Z.filter(function (z: any) {\n return z.internal\n })\n if (!ext.length) {\n host.appendChild(el('p', 'muted', T('noZones')))\n return null\n }\n let x0 = 1e9\n let x1 = -1e9\n let z0 = 1e9\n let z1 = -1e9\n ext.forEach(function (z: any) {\n x0 = Math.min(x0, z.map[0])\n x1 = Math.max(x1, z.map[1])\n z0 = Math.min(z0, z.map[2])\n z1 = Math.max(z1, z.map[3])\n })\n const sx = x1 - x0 || 1\n const sz = z1 - z0 || 1\n const s = Math.min(230 / sz, 290 / sx)\n let kz = 1\n let kx = 1\n const w = sz * s\n const h = sx * s\n if (w < 0.45 * h) kz = (0.45 * h) / w\n if (h < 0.75 * w) kx = (0.75 * w) / h\n const pad = 10\n const top = 22\n const W = Math.max(w * kz + 2 * pad, 240)\n const offX = (W - w * kz) / 2\n const H = h * kx\n const cols = 2\n const tw = (W - 2 * pad - (cols - 1) * 6) / cols\n const rows = Math.ceil(inn.length / cols)\n const stripY = top + H + 18\n const VH = stripY + (inn.length ? 14 + rows * 32 : 0) + 4\n const svg = sv('svg', { viewBox: '0 0 ' + W.toFixed(1) + ' ' + VH.toFixed(1), role: 'group', 'aria-label': T('aria'), class: 'dmap' }, host)\n function X(zv: number) {\n return offX + (zv - z0) * s * kz\n }\n function Y(xv: number) {\n return top + (x1 - xv) * s * kx\n }\n const m = c.meta\n const F = m.front\n const R = m.rear\n const hw = (m.width || 1.7) / 2\n sv(\n 'rect',\n { x: X(-hw).toFixed(1), y: Y(F).toFixed(1), width: (X(hw) - X(-hw)).toFixed(1), height: (Y(R) - Y(F)).toFixed(1), rx: 10, class: 'dm-body' },\n svg,\n )\n const tf = sv('text', { x: (W / 2).toFixed(1), y: 13, class: 'dm-front', 'text-anchor': 'middle' }, svg)\n tf.textContent = T('front')\n function node(z: any, x: number, y: number, wd: number, ht: number, parent: any) {\n const b = kit.bandOf(z.health)\n const g = sv(\n 'g',\n {\n class: 'zn' + (z.id === sel ? ' sel' : '') + (b === 4 ? ' gone' : ''),\n tabindex: '0',\n role: 'button',\n 'data-id': z.id,\n 'aria-label': zoneLabel(z),\n 'aria-pressed': z.id === sel ? 'true' : 'false',\n },\n parent,\n )\n sv('title', {}, g).textContent = zoneLabel(z)\n sv(\n 'rect',\n {\n x: x.toFixed(1),\n y: y.toFixed(1),\n width: Math.max(3, wd).toFixed(1),\n height: Math.max(3, ht).toFixed(1),\n rx: 3,\n fill: b === 4 ? 'transparent' : kit.bands[b].color,\n },\n g,\n )\n return g\n }\n ext\n .slice()\n .sort(function (a: any, b: any) {\n return (b.map[1] - b.map[0]) * (b.map[3] - b.map[2]) - (a.map[1] - a.map[0]) * (a.map[3] - a.map[2])\n })\n .forEach(function (z: any) {\n node(z, X(z.map[2]), Y(z.map[1]), X(z.map[3]) - X(z.map[2]), Y(z.map[0]) - Y(z.map[1]), svg)\n })\n if (inn.length) {\n const tl = sv('text', { x: pad, y: stripY, class: 'dm-sub' }, svg)\n tl.textContent = T('inside')\n inn.forEach(function (z: any, i: number) {\n const col = i % cols\n const row = Math.floor(i / cols)\n const x = pad + col * (tw + 6)\n const y = stripY + 8 + row * 32\n const b = kit.bandOf(z.health)\n const g = node(z, x, y, tw, 26, svg)\n const t = sv(\n 'text',\n { x: (x + tw / 2).toFixed(1), y: (y + 17).toFixed(1), 'text-anchor': 'middle', class: 'dm-tile', fill: b === 4 ? '#c9cdd0' : BAND_TEXT[b] },\n g,\n )\n const mc = Math.floor(tw / 6.1)\n t.textContent = z.name.length > mc ? z.name.slice(0, mc - 1) + '…' : z.name\n })\n }\n svg.querySelectorAll('.zn').forEach(function (g: any) {\n function pick() {\n if (o.onSelect) o.onSelect(g.getAttribute('data-id'))\n }\n g.addEventListener('click', pick)\n g.addEventListener('keydown', function (e: any) {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n pick()\n }\n })\n })\n return svg\n }\n\n /** One button per band; `onPick(targetHealth, bandIndex)`. Returns the buttons. */\n function bandButtons(host: any, onPick?: (health: number, band: number) => void): any[] {\n host.innerHTML = ''\n return kit.bands.map(function (B: any, i: number) {\n const b = el('button', null, B.name)\n b.type = 'button'\n b.dataset.b = i\n b.style.setProperty('--band', B.color)\n b.addEventListener('click', function () {\n if (onPick) onPick(B.health, i)\n })\n host.appendChild(b)\n return b\n })\n }\n\n /** Band legend with the health ranges. */\n function legend(host: any): void {\n host.innerHTML = ''\n kit.bands.forEach(function (B: any, i: number, A: any[]) {\n const gone = i === A.length - 1\n const sp = el('span', gone ? 'gone' : null)\n const sw = el('i')\n sw.style.background = gone ? 'transparent' : B.color\n sp.appendChild(sw)\n sp.appendChild(document.createTextNode(B.name + (gone ? '' : ' ' + bandRange(i))))\n host.appendChild(sp)\n })\n }\n\n /** Overall health bar. `els`: `{ text, bar }` (elements). Returns `{ health, band, name }`. */\n function healthBar(els: { text?: any; bar?: any }, c: any): any {\n const O = kit.zoneOverall(c)\n if (els.text) els.text.textContent = T('health') + ' ' + O.health + '% · ' + O.name\n if (els.bar) {\n els.bar.style.width = O.health + '%'\n els.bar.style.background = kit.bands[O.band].color\n }\n return O\n }\n\n /** One button per registered scenario; `onRun(id)`. */\n function scenarioButtons(host: any, onRun: (id: string) => void): any[] {\n host.innerHTML = ''\n return kit.scenarios.map(function (S: any) {\n const b = el('button', null, S.name)\n b.type = 'button'\n b.dataset.sc = S.id\n b.addEventListener('click', function () {\n onRun(S.id)\n })\n host.appendChild(b)\n return b\n })\n }\n\n /** Minimal CSS for pages without their own stylesheet (the variables have defaults). */\n function css(): string {\n return (\n 'svg.dmap{width:100%;max-width:300px;height:auto;max-height:460px;display:block}svg.dmap .dm-body{fill:var(--panel-2,#1c2127);stroke:var(--line,#39414a)}' +\n 'svg.dmap .dm-front,svg.dmap .dm-sub{font:9.5px monospace;fill:var(--muted,#9aa3ab);letter-spacing:.08em}svg.dmap .dm-tile{font:600 10.5px sans-serif;pointer-events:none}' +\n 'svg.dmap .zn{cursor:pointer;outline:none}svg.dmap .zn rect{stroke:#0b0e11;stroke-width:1;fill-opacity:.9}svg.dmap .zn.gone rect{stroke:#8a9095;stroke-dasharray:3 2;fill:rgba(110,115,119,.18)}' +\n 'svg.dmap .zn:hover rect{stroke:#fff;stroke-width:1.6}svg.dmap .zn.sel rect{stroke:#e0a548;stroke-width:2.6}'\n )\n }\n /** Adds the minimal CSS to the document head once. */\n function injectStyles(): void {\n if (document.getElementById('vehicles-ui-css')) return\n const s = el('style')\n s.id = 'vehicles-ui-css'\n s.textContent = css()\n document.head.appendChild(s)\n }\n\n kit.ui = { damageMap, bandButtons, legend, healthBar, scenarioButtons, zoneLabel, bandRange, css, injectStyles }\n}\n","/**\n * Light mode (\"lite\"): the same vehicles with fewer triangles, for a whole street of them. Port of the `[LOD]` hooks of the team's Frota Leve\n * (frota-leve.js lines 21-65, 232-257, 1205-1221, 14155-14170). Every number is a setting; with `on` false nothing changes, so every golden\n * of the full-detail build stays byte for byte the same.\n */\nimport type { Kit } from './types'\n\nexport interface LodSettings {\n /** Light mode is active for the builds that run now. Set by `kit.build(key, state, zones, { lod: true })`. */\n on: boolean\n /** Fraction of the segments three's own generators keep (cylinders, spheres, tori, lathes, tubes, extrusions, circles, rings). */\n segmentFraction: number\n /** Rounding rings of a rounded box (the full build uses 3). */\n roundingRings: number\n /** Multiplier of the maximum edge length when subdividing a mesh (bigger triangles). */\n subdivisionFactor: number\n /** A box with an edge under this, or a rounding radius under 1.2 cm, is drawn as a plain 12-triangle box. */\n flatBoxEdge: number\n /** Fewest segments of a superellipse loft. */\n minLoftSegments: number\n /** Fraction of a loft's segments. */\n loftSegmentFraction: number\n /** Fewest stations of a resampled loft. */\n minStations: number\n /** Fraction of the stations of a resampled loft. */\n stationFraction: number\n /** Multiplier of the grid cell size of grilles and side grilles. */\n gridFactor: number\n /** Materials (by name in `kit.materials`) whose meshes are never seen from outside and are left out in light mode. */\n hiddenMaterials: readonly string[]\n}\n\nexport const defaultLodSettings: LodSettings = {\n on: false,\n segmentFraction: 0.5,\n roundingRings: 1,\n subdivisionFactor: 2.2,\n flatBoxEdge: 0.22,\n minLoftSegments: 14,\n loftSegmentFraction: 0.45,\n minStations: 20,\n stationFraction: 0.55,\n gridFactor: 2.6,\n hiddenMaterials: ['seat', 'carpet', 'headliner', 'gauge', 'screen', 'bay', 'hoodLiner', 'block', 'cover', 'radiator', 'coolant', 'coolantLiq', 'washer', 'hv', 'hose', 'leather'],\n}\n\n/** The settings the kit starts with: the defaults, overridden by the options. */\nexport function createLod(options?: Partial<LodSettings>): LodSettings {\n return { ...defaultLodSettings, ...(options || {}), on: false }\n}\n\n/** Fewer segments of a generator when the light mode is on, never below `min`. */\nconst fewer = (lod: LodSettings, n: number, min: number): number => Math.max(min, Math.round(n * lod.segmentFraction))\n\n/**\n * A copy of the three.js namespace whose geometry generators take fewer segments while `lod.on` is true (and whose canvas textures come out in\n * sRGB when three has colour management). With `lod.on` false every generator passes its arguments through untouched.\n */\nexport function wrapThreeForLod(TH: any, lod: LodSettings): any {\n const T: any = Object.assign({}, TH)\n if (TH.SRGBColorSpace) {\n T.CanvasTexture = class extends TH.CanvasTexture {\n constructor(a: any, b: any, c: any, d: any, e: any, f: any, g: any, h: any, i: any) {\n super(a, b, c, d, e, f, g, h, i)\n this.colorSpace = TH.SRGBColorSpace\n }\n }\n }\n T.CylinderGeometry = class extends TH.CylinderGeometry {\n constructor(rt: any, rb: any, h: any, rs: any, hs: any, open: any, ts: any, tl: any) {\n super(rt, rb, h, lod.on && rs != null ? fewer(lod, rs, 6) : rs, lod.on ? 1 : hs, open, ts, tl)\n }\n }\n T.SphereGeometry = class extends TH.SphereGeometry {\n constructor(r: any, ws: any, hs: any, ps: any, pl: any, ts: any, tl: any) {\n super(r, lod.on && ws != null ? fewer(lod, ws, 8) : ws, lod.on && hs != null ? fewer(lod, hs, 5) : hs, ps, pl, ts, tl)\n }\n }\n T.TorusGeometry = class extends TH.TorusGeometry {\n constructor(r: any, tube: any, rs: any, ts: any, arc: any) {\n super(r, tube, lod.on && rs != null ? fewer(lod, rs, 4) : rs, lod.on && ts != null ? fewer(lod, ts, 8) : ts, arc)\n }\n }\n T.LatheGeometry = class extends TH.LatheGeometry {\n constructor(pts: any, seg: any, a: any, b: any) {\n super(pts, lod.on && seg != null ? fewer(lod, seg, 10) : seg, a, b)\n }\n }\n T.TubeGeometry = class extends TH.TubeGeometry {\n constructor(path: any, ts: any, r: any, rs: any, closed: any) {\n if (lod.on) {\n let len = 1\n try {\n len = path.getLength()\n } catch (e) {\n /* a path without a length keeps the default */\n }\n ts = Math.max(6, Math.min(ts == null ? 64 : ts, Math.ceil(len / 0.14)))\n rs = r < 0.025 ? 3 : Math.max(4, fewer(lod, rs == null ? 8 : rs, 4))\n }\n super(path, ts, r, rs, closed)\n }\n }\n T.ExtrudeGeometry = class extends TH.ExtrudeGeometry {\n constructor(shape: any, o: any) {\n if (lod.on && o) {\n o = Object.assign({}, o)\n if (o.curveSegments) o.curveSegments = fewer(lod, o.curveSegments, 5)\n if (o.bevelSegments) o.bevelSegments = Math.max(1, Math.round(o.bevelSegments * 0.5))\n }\n super(shape, o)\n }\n }\n T.CircleGeometry = class extends TH.CircleGeometry {\n constructor(r: any, seg: any, a: any, b: any) {\n super(r, lod.on && seg != null ? fewer(lod, seg, 8) : seg, a, b)\n }\n }\n T.RingGeometry = class extends TH.RingGeometry {\n constructor(a: any, b: any, ts: any, ps: any, c: any, d: any) {\n super(a, b, lod.on && ts != null ? fewer(lod, ts, 8) : ts, ps, c, d)\n }\n }\n return T\n}\n\n/** Names of the kit functions that add the inside of a vehicle (seen only through the glass, left out in light mode). */\nconst INTERIOR_FUNCTIONS = ['interior', 'engineBay', 'seat', 'dashboard', 'steeringWheel', 'yoke', 'busRows'] as const\n\n/**\n * Wraps the interior builders: while the light mode is on, the meshes a call adds get `userData.skipLite`, which the lite builder of\n * `game-vehicles-three` leaves out. Also resolves `lod.hiddenMaterials` into `kit.lodHiddenMaterials`.\n */\nexport function installLod(kit: Kit): void {\n const lod: LodSettings = kit.lod\n const meshesOf = (c: any): Set<any> => {\n const set = new Set<any>()\n c.vehicle.traverse((o: any) => {\n if (o.isMesh) set.add(o)\n })\n return set\n }\n for (const name of INTERIOR_FUNCTIONS) {\n const original = kit[name]\n if (typeof original !== 'function') continue\n kit[name] = function (this: unknown, ...args: any[]) {\n const c = args[0]\n if (!lod.on || !c || !c.vehicle) return original.apply(this, args)\n const before = meshesOf(c)\n const result = original.apply(this, args)\n c.vehicle.traverse((o: any) => {\n if (o.isMesh && !before.has(o)) o.userData.skipLite = true\n })\n return result\n }\n }\n /** Materials of the parts nobody sees from outside, as a set to test by identity. */\n kit.lodHiddenMaterials = function () {\n const materials = kit.materials\n return new Set(lod.hiddenMaterials.map((name) => materials[name]).filter(Boolean))\n }\n}\n","/**\n * Damageable parts: what a bullet, a bat or a crash can hurt on a built vehicle, as boxes. Port of `coletarDanificaveis` and `tipoDaZona`\n * (frota-leve.js 14391-14405), driven by the zones the kit already derives, so it works for any vehicle of any pack.\n */\nimport type { Kit } from './types'\n\nexport type DamageableMaterial = 'metal' | 'glass' | 'rubber' | 'fuel'\nexport type DamageableSide = 'center' | 'left' | 'right'\n\n/** What a zone is, by type: the material it is made of and the part name a game shows. */\nexport interface DamageableKind {\n material: DamageableMaterial\n part: string\n}\n\n/** Zone type (and, for some, `fxKey` or `sub`) to material and part. A game replaces or adds entries with `kit.damageableKinds`. */\nexport const defaultDamageableKinds: Record<string, DamageableKind> = {\n door: { material: 'metal', part: 'door' },\n hood: { material: 'metal', part: 'hood' },\n lid: { material: 'metal', part: 'lid' },\n bumper: { material: 'metal', part: 'bumper' },\n glass: { material: 'glass', part: 'window' },\n 'glass:windshield': { material: 'glass', part: 'windshield' },\n light: { material: 'glass', part: 'headlight' },\n 'light:taillight': { material: 'glass', part: 'taillight' },\n wheel: { material: 'rubber', part: 'wheel' },\n 'internal:fuel_tank': { material: 'fuel', part: 'fuel_tank' },\n}\n\nexport function installDamageables(kit: Kit): void {\n const THREE = kit.THREE\n kit.damageableKinds = { ...defaultDamageableKinds }\n\n const kindOf = (zone: any): DamageableKind | null => {\n const kinds = kit.damageableKinds\n if (zone.type === 'internal') return zone.sub ? kinds[`internal:${zone.sub}`] || null : null\n return kinds[`${zone.type}:${zone.fxKey}`] || kinds[zone.type] || null\n }\n\n /**\n * Every damageable zone of a built vehicle: `{ material, zone, part, side, box }`. `box` is a `THREE.Box3` in the coordinates of\n * `c.vehicle`, or in the frame of `matrix` when one is given (for example the output frame of `game-vehicles-three`).\n */\n kit.damageables = function (c: any, matrix?: any) {\n const out: any[] = []\n for (const zone of c.zones || []) {\n const kind = kindOf(zone)\n if (!kind || !zone.box) continue\n const b = zone.box\n const box = new THREE.Box3(new THREE.Vector3(b.x0, b.y0, b.z0), new THREE.Vector3(b.x1, b.y1, b.z1))\n if (matrix) box.applyMatrix4(matrix)\n out.push({ material: kind.material, zone: zone.id, part: kind.part, side: zone.side === 0 ? 'center' : zone.side < 0 ? 'left' : 'right', box })\n }\n return out\n }\n}\n","/**\n * `createVehicleDestructible`: a vehicle that follows the destruction contract of `@adatechnology/game-contracts` and brings its own rules.\n * Every damage zone and mechanical part is a part with a material, hits become events (dent, hole, crack, fracture, detach, leak, ignite,\n * melt, explode), joints come apart by wear, by a wrench or by breaking, and the hidden mechanics change how the vehicle drives.\n *\n * It depends on the contracts only (types) and on the kit it is given: not on the default destruction world.\n */\nimport type {\n AnimationClipSpec,\n DamageType,\n DestructibleImpl,\n DestructibleSpec,\n DestructionEvent,\n Hit,\n JointSpec,\n ObjectState,\n PartSpec,\n PartState,\n ToolKind,\n Vec3,\n} from '@adatechnology/game-contracts'\nimport { ignitionChance, resolveIgnitionRules, sparkTargetFactor, type IgnitionRules } from '@adatechnology/game-contracts'\nimport type { VehicleContext, VehicleKit } from '../api'\nimport { clamp, rng, strHash } from '../util'\nimport { buildVehicleModel, kindOf, type JointDef, type PartDef, type PartRole, type VehicleModel } from './model'\nimport { VehicleVisuals } from './visual'\nimport { createVehicleClips } from './clips'\n\nexport interface VehicleDestructibleOptions {\n /** Object id the host gives (`DestructibleImpl.id`). Default: the vehicle key. */\n id?: string\n /** Display name. Default: the vehicle name. */\n name?: string\n /** Object whose space `describe()` answers in (the wrapper the host placed the vehicle in). Default: `c.root`. */\n frame?: any\n /** Tow hitch: the option wins over the spec flag, the spec flag over the seeded choice. */\n hitch?: boolean\n /** Do not create or move any mesh (logic only, for servers and tests that need no scene). */\n headless?: boolean\n /** Extra seed for the choices that are random in the real world (which way a broken steering pulls). */\n seed?: number\n /** How full the fuel tank starts, 0 to 1 (default 1). A nearly empty tank leaks little and lights easily (see `ignition`). */\n fuel?: number\n /**\n * What lights the fuel that leaks from a pierced tank: a plain bullet only leaks; a spark of a hard round on steel, an incendiary or tracer\n * round, a fire within `fireNear.radius` (a burning part or a burning fuel stain) or a blast lights it, and then the usual fire and explosion\n * follow. The chance of the round is in `Hit.ignition`; this is the target side (how full the tank is, what the wall is, the fire near).\n * Defaults and meaning of every number: `IgnitionRules` of `@adatechnology/game-contracts`.\n */\n ignition?: Partial<IgnitionRules>\n}\n\n/** What the vehicle can do now, from the state of its hidden mechanics. */\nexport interface VehicleStatus {\n /** Battery, alternator, engine and fuel are in order. */\n canStart: boolean\n /** Headlights and taillights are powered (battery and alternator in order). */\n lightsOn: boolean\n /** Engine runs and the gearbox transmits. */\n canDrive: boolean\n /** 1 is normal; worn or missing brakes make the stopping distance this many times longer. */\n brakeFactor: number\n /** -1..1: the sideways pull of a damaged steering or flat tyres (negative is left). */\n steerPull: number\n flatTyres: string[]\n detached: string[]\n leaking: string[]\n burning: string[]\n exploded: boolean\n fuelLiters: number\n}\n\nexport interface VehicleDestructible extends DestructibleImpl {\n readonly vehicle: VehicleContext\n readonly model: VehicleModel\n /** Display name of a part (from the kit locale). */\n partName(partId: string): string\n status(): VehicleStatus\n /** Open and close clips for the doors, the hood and the trunk lid the vehicle has. */\n animations(): AnimationClipSpec[]\n /** World position of a part's centre. */\n partWorldCenter(partId: string): Vec3\n /** Rolls the vehicle over (the roof, the glass and the fluids are hurt when it lands). */\n rollover(side?: number): void\n /** Part ids that are no longer attached to the main body. */\n detachedParts(): string[]\n}\n\ninterface PState {\n def: PartDef\n hp: number\n temp: number\n burning: boolean\n fuelKg: number\n burnRate: number\n char: number\n melt: number\n dents: PartState['dents']\n holes: PartState['holes']\n cracks: PartState['cracks']\n liters: number | undefined\n lost: boolean\n status: PartState['status']\n flat: boolean\n fireLoss: number\n}\n\ninterface JState {\n def: JointDef\n hp: number\n progress: number\n open: boolean\n by?: 'break' | 'tool' | 'part_lost'\n reported: number\n}\n\ninterface Leak {\n rate: number\n fluid: string\n pud: any\n}\n\n/** Joules a projectile needs to get through one layer of the material (before the role factor). */\nconst RESIST: Record<string, number> = { steel: 380, aluminium: 220, glass: 90, plastic: 70, rubber: 120 }\nconst ROLE_RESIST: Partial<Record<PartRole, number>> = {\n frame: 6,\n engine: 10,\n gearbox: 8,\n pillar: 4,\n fuel_tank: 0.4,\n radiator: 0.3,\n battery: 0.8,\n brakes: 5,\n steering: 4,\n shocks: 4,\n alternator: 3,\n oil_pan: 0.6,\n hitch: 5,\n rim: 4,\n}\n/** Scale of blunt damage by material. */\nconst BLUNT: Record<string, number> = { steel: 0.8, aluminium: 1, glass: 1.5, plastic: 1.2, rubber: 0.3 }\n/** Parts inside the body take a fraction of an outside blow. */\nconst SHIELDED: ReadonlySet<PartRole> = new Set<PartRole>(['engine', 'gearbox', 'frame', 'radiator', 'fuel_tank', 'oil_pan', 'battery', 'alternator', 'brakes', 'steering', 'shocks'])\nconst AMBIENT = 20\nconst FLAME = 700\n\nconst FRACTURE: Record<string, 'shatter' | 'snap' | 'tear' | 'none'> = { glass: 'shatter', plastic: 'snap', rubber: 'tear', steel: 'none', aluminium: 'none' }\n\nconst add3 = (a: Vec3, b: Vec3): Vec3 => [a[0] + b[0], a[1] + b[1], a[2] + b[2]]\nconst r3 = (v: Vec3): Vec3 => [Math.round(v[0] * 1e5) / 1e5, Math.round(v[1] * 1e5) / 1e5, Math.round(v[2] * 1e5) / 1e5]\nconst r2 = (n: number): number => Math.round(n * 1e4) / 1e4\n\nexport function createVehicleDestructible(kit: VehicleKit, vehicleCtx: VehicleContext, options: VehicleDestructibleOptions = {}): VehicleDestructible {\n const THREE = kit.THREE\n const V3 = THREE.Vector3\n const I = (kit as any)._ as Record<string, any>\n let c = vehicleCtx\n const id = options.id ?? c.key\n const headless = !!options.headless\n const seedBase = strHash(`${c.key}|${id}|${options.seed ?? 0}`)\n let rand = rng(seedBase)\n const ignitionRules = resolveIgnitionRules(options.ignition)\n const fuelFraction = clamp(options.fuel ?? 1, 0, 1)\n // the rolls of ignition have their own stream so that a spark never changes what the other random choices of the vehicle give\n let igniteRand = rng(strHash(`${c.key}|${id}|ignition|${options.seed ?? 0}`))\n let clock = 0\n\n let model: VehicleModel\n let vis: VehicleVisuals | null = null\n const ps = new Map<string, PState>()\n let js: JState[] = []\n let leaks = new Map<string, Leak>()\n let queue: DestructionEvent[] = []\n let visualDone = new Set<string>()\n let exploded = false\n let blastHandled = false\n let rolled = false\n let rollHandled = false\n let groupsCache: string[][] = []\n let groupOf = new Map<string, number>()\n let wasLit = true\n let deadEngine = false\n let steerSign = 1\n let specCache: DestructibleSpec | null = null\n\n const frame = (): any => options.frame ?? c.root\n const sync = (): void => {\n c.root.updateWorldMatrix(true, true)\n frame().updateWorldMatrix(true, false)\n }\n const toFrameMatrix = (): any => {\n sync()\n return new THREE.Matrix4().copy(frame().matrixWorld).invert().multiply(c.vehicle.matrixWorld)\n }\n const toWorld = (v: Vec3 | any): Vec3 => {\n const p = Array.isArray(v) ? new V3(v[0], v[1], v[2]) : v.clone()\n const w = c.vehicle.localToWorld(p)\n return [w.x, w.y, w.z]\n }\n const toLocal = (w: Vec3): any => c.vehicle.worldToLocal(new V3(w[0], w[1], w[2]))\n const dirToLocal = (d: Vec3): any => {\n const inv = new THREE.Matrix4().copy(c.vehicle.matrixWorld).invert()\n return new V3(d[0], d[1], d[2]).transformDirection(inv)\n }\n const dirToWorld = (v: any): Vec3 => {\n const d = v.clone().transformDirection(c.vehicle.matrixWorld)\n return [d.x, d.y, d.z]\n }\n const ev = <T extends DestructionEvent['type']>(e: { type: T } & Record<string, unknown>): DestructionEvent => ({ ...e, object: id, time: r2(clock) }) as unknown as DestructionEvent\n\n // ---- setup ---------------------------------------------------------------------------------------------------------------------------\n const burnKg = (d: PartDef): number => {\n if (d.role === 'tyre') return d.mass * 0.6\n if (d.material === 'plastic') return d.mass * 0.8\n if (d.role === 'engine') return 4\n if (d.role === 'battery') return 1.5\n if (d.role === 'fuel_tank') return 0\n return d.ignitionC ? 1 : 0\n }\n const setup = (): void => {\n model = buildVehicleModel(kit, c, { hitch: options.hitch })\n ps.clear()\n for (const d of model.parts) {\n const kg = burnKg(d)\n ps.set(d.id, {\n def: d,\n hp: d.hp,\n temp: AMBIENT,\n burning: false,\n fuelKg: kg,\n burnRate: Math.max(0.05, kg / 25),\n char: 0,\n melt: 0,\n dents: [],\n holes: [],\n cracks: [],\n liters: d.contains ? (d.role === 'fuel_tank' ? d.contains.liters * fuelFraction : d.contains.liters) : undefined,\n lost: false,\n status: 'intact',\n flat: false,\n fireLoss: 0,\n })\n }\n js = model.joints.map((d) => ({ def: d, hp: d.strength, progress: 0, open: false, reported: 0 }))\n leaks = new Map()\n queue = []\n visualDone = new Set()\n exploded = false\n blastHandled = false\n rolled = false\n rollHandled = false\n wasLit = true\n deadEngine = false\n rand = rng(seedBase)\n igniteRand = rng(strHash(`${c.key}|${id}|ignition|${options.seed ?? 0}`))\n steerSign = rand() < 0.5 ? -1 : 1\n vis = headless ? null : new VehicleVisuals(kit, c, model)\n recomputeGroups()\n }\n\n // ---- groups and joints ---------------------------------------------------------------------------------------------------------------------\n const recomputeGroups = (): string[][] => {\n const live = model.parts.filter((p) => !ps.get(p.id)!.lost).map((p) => p.id)\n const parent = new Map<string, string>(live.map((p) => [p, p]))\n const find = (x: string): string => {\n let r = x\n while (parent.get(r) !== r) r = parent.get(r)!\n parent.set(x, r)\n return r\n }\n for (const j of js) if (!j.open && parent.has(j.def.a) && parent.has(j.def.b)) parent.set(find(j.def.a), find(j.def.b))\n const comps = new Map<string, string[]>()\n for (const p of live) {\n const r = find(p)\n if (!comps.has(r)) comps.set(r, [])\n comps.get(r)!.push(p)\n }\n const hubRoot = parent.has(model.hub) ? find(model.hub) : ''\n const list = [...comps.entries()].sort((a, b) => (a[0] === hubRoot ? -1 : b[0] === hubRoot ? 1 : 0))\n groupsCache = list.map(([, v]) => v)\n groupOf = new Map()\n groupsCache.forEach((g, i) => g.forEach((p) => groupOf.set(p, i)))\n return groupsCache\n }\n const attached = (partId: string): boolean => groupOf.get(partId) === 0\n\n const openJoint = (j: JState, by: 'break' | 'tool' | 'part_lost', out: DestructionEvent[]): void => {\n if (j.open) return\n j.open = true\n j.by = by\n j.progress = 1\n const before = new Set(groupsCache[0] ?? [])\n const groups = recomputeGroups()\n out.push(ev({ type: 'detach', joint: j.def.id, parts: [j.def.a, j.def.b], by, groups: groups.map((g) => [...g]) }))\n if (by === 'part_lost' || !vis) return\n for (const gid of before) {\n if (attached(gid) || ps.get(gid)!.lost || visualDone.has(gid)) continue\n const p = ps.get(gid)!.def\n if (!p.visual) continue\n visualDone.add(gid)\n vis.detach(p, { by: by === 'tool' ? 'tool' : 'break' })\n }\n }\n\n const wear = (p: PState, amount: number, out: DestructionEvent[]): void => {\n for (const j of js) {\n if (j.open || j.def.a !== p.def.id) continue\n j.hp -= amount * 0.25\n if (j.hp <= 0) openJoint(j, 'break', out)\n }\n }\n\n const syncZone = (p: PState): void => {\n const zid = p.def.zoneId\n if (!zid) return\n const z = (kit.zonesOf(c) as any[]).find((q) => q.id === zid)\n if (!z) return\n const h = Math.round(clamp((p.hp / p.def.hp) * 100, 0, 100))\n z.health = h\n z.band = kit.bandOf(h)\n if (c.zoneState) c.zoneState.health[zid] = h\n }\n\n const lose = (p: PState, status: 'broken' | 'melted' | 'ashes', out: DestructionEvent[], point?: Vec3): void => {\n if (p.lost) return\n p.lost = true\n p.status = status\n p.hp = 0\n const d = p.def\n const centre = toWorld(d.box.center)\n if (status === 'broken') {\n out.push(ev({ type: 'fracture', part: d.id, style: FRACTURE[d.material] ?? 'none', fragments: [], point: point ?? centre }))\n }\n syncZone(p)\n if (vis && !visualDone.has(d.id)) {\n visualDone.add(d.id)\n switch (d.role) {\n case 'glass':\n vis.glassBreak(d)\n break\n case 'light':\n vis.breakLight(d, true)\n break\n case 'tyre':\n vis.tyreFlat(d, 0.34)\n break\n case 'mirror':\n case 'bumper':\n case 'door':\n case 'hood':\n case 'lid':\n case 'fender':\n case 'battery':\n case 'hitch':\n if (!vis.detach(d, { by: 'break' }) && status !== 'melted' && d.zoneId && (d.role === 'bumper' || d.role === 'door' || d.role === 'fender')) vis.tearOff(d)\n break\n case 'rim':\n vis.detach(d, { by: 'break' })\n break\n case 'roof':\n case 'panel':\n case 'other':\n vis.tearOff(d)\n break\n default:\n break\n }\n }\n for (const j of js) if (!j.open && (j.def.a === d.id || j.def.b === d.id)) openJoint(j, 'part_lost', out)\n recomputeGroups()\n }\n\n const damage = (p: PState, amount: number, dtype: DamageType, source: string | undefined, out: DestructionEvent[], cause?: Vec3): void => {\n if (p.lost || !(amount > 0)) return\n const before = p.hp\n p.hp = Math.max(0, p.hp - amount)\n out.push(ev({ type: 'damage', part: p.def.id, amount: r2(before - p.hp), hp: r2(p.hp), damageType: dtype, ...(source ? { source } : {}) }))\n wear(p, amount, out)\n syncZone(p)\n if (p.hp <= 0) lose(p, 'broken', out, cause)\n if (p.def.role === 'tyre' && !p.flat && p.hp < p.def.hp * 0.6 && !p.lost) {\n p.flat = true\n vis?.tyreFlat(p.def, 0.24)\n }\n }\n\n // ---- geometry helpers ----------------------------------------------------------------------------------------------------------------\n const distToBox = (d: PartDef, v: any): number => {\n const dx = Math.max(Math.abs(v.x - d.box.center[0]) - d.box.size[0] / 2, 0)\n const dy = Math.max(Math.abs(v.y - d.box.center[1]) - d.box.size[1] / 2, 0)\n const dz = Math.max(Math.abs(v.z - d.box.center[2]) - d.box.size[2] / 2, 0)\n return Math.hypot(dx, dy, dz)\n }\n const vol = (d: PartDef): number => d.box.size[0] * d.box.size[1] * d.box.size[2]\n const locate = (v: any, tol: number, skip?: (p: PState) => boolean): PState | null => {\n let best: PState | null = null\n let bd = Infinity\n for (const d of model.parts) {\n const p = ps.get(d.id)!\n if (p.lost || (skip && skip(p))) continue\n const dist = distToBox(d, v)\n if (dist > tol) continue\n if (dist < bd - 1e-6 || (Math.abs(dist - bd) <= 1e-6 && best && vol(d) < vol(best.def))) {\n best = p\n bd = dist\n }\n }\n return best\n }\n const faceNormal = (d: PartDef, v: any): any => {\n const rel = [(v.x - d.box.center[0]) / (d.box.size[0] / 2), (v.y - d.box.center[1]) / (d.box.size[1] / 2), (v.z - d.box.center[2]) / (d.box.size[2] / 2)]\n const k = rel.map(Math.abs).indexOf(Math.max(...rel.map(Math.abs)))\n const n = [0, 0, 0]\n n[k] = rel[k] >= 0 ? 1 : -1\n return new V3(n[0], n[1], n[2])\n }\n const fromVehicle = (v: any, M: any): Vec3 => {\n const p = v.clone().applyMatrix4(M)\n return [p.x, p.y, p.z]\n }\n const armour = (): number => (c.meta.armored || c.meta.bullet ? 30 : 1)\n const resist = (d: PartDef, p: PState): number => {\n let base = RESIST[d.material] ?? 100\n if (d.material === 'glass' && d.hp > 1000) base = 120\n if (d.material === 'glass' && c.meta.bullet) base *= 30\n const k = ROLE_RESIST[d.role] ?? 1\n const arm = d.material === 'steel' || d.material === 'aluminium' ? armour() : 1\n return base * k * arm * (p.dents.length > 3 ? 0.9 : 1)\n }\n\n // ---- fluids --------------------------------------------------------------------------------------------------------------------------\n const fluidKind = (fluid: string): string => (fluid === 'fuel' ? ((c.spec as any).fuel === 'diesel' ? 'diesel' : 'gasoline') : fluid)\n const startLeak = (p: PState, holePoint: any, caliber: number, out: DestructionEvent[], dirLocal: any): void => {\n const d = p.def\n if (!d.contains || (p.liters ?? 0) <= 0) return\n const cap = d.contains.liters\n const level = d.box.center[1] - d.box.size[1] / 2 + d.box.size[1] * clamp((p.liters ?? 0) / cap, 0.05, 1)\n if (holePoint.y > level + 0.03) return\n const head = clamp((level - holePoint.y) / Math.max(0.05, d.box.size[1]), 0, 1)\n const rate = (d.contains.pressurized ? 0.25 : 0.04 + 0.08 * head) * Math.pow(Math.max(caliber, 3) / 9, 2)\n const cur = leaks.get(d.id)\n const fluid = d.contains.fluid\n if (cur) cur.rate += rate\n else {\n const l: Leak = { rate, fluid, pud: null }\n leaks.set(d.id, l)\n if (vis) {\n const pos = new V3(d.box.center[0], Math.max(0.2, (c.meta.clearance ?? 0.3) * 0.8), d.box.center[2])\n if (fluid === 'coolant') kit.addEmitter(c, new V3(d.box.center[0], d.box.center[1] + 0.2, d.box.center[2]), 'white', { rate: 5, s: 0.8 })\n else if ((c.meta.kind ?? 'car') !== 'boat') l.pud = I.puddle(c, fluidKind(fluid), pos, fluid === 'oil' ? 0.8 : 1.1)\n }\n }\n const out3 = dirToWorld(new V3(dirLocal.x * 0.5, dirLocal.y * 0.5 - 0.6, dirLocal.z * 0.5))\n out.push(ev({ type: 'leak', part: d.id, fluid, point: toWorld(holePoint), direction: r3(out3), rate: r2(rate), pressurized: !!d.contains.pressurized }))\n }\n\n // ---- fire ----------------------------------------------------------------------------------------------------------------------------\n const centreOf = (d: PartDef): any => new V3(d.box.center[0], d.box.center[1], d.box.center[2])\n const ignite = (p: PState, out: DestructionEvent[]): void => {\n if (p.burning || p.lost) return\n const d = p.def\n p.burning = true\n out.push(ev({ type: 'ignite', part: d.id, point: toWorld(d.box.center) }))\n if (!vis) return\n const cen = centreOf(d)\n kit.addEmitter(c, cen.clone().add(new V3(0, 0.1, 0)), 'fire', { rate: d.role === 'tyre' ? 7 : 10, s: d.role === 'tyre' ? 0.6 : 0.9 })\n kit.addEmitter(c, cen.clone().add(new V3(0, 0.6, 0)), 'black', { rate: 4, s: 1.1 })\n if (d.role === 'fuel_tank' || d.role === 'engine') {\n const l = leaks.get('fuel_tank')\n if (l?.pud && l.fluid === 'fuel') I.igniteFuel(c, l.pud)\n }\n }\n const burningBlast = (centreLocal: any, radius: number, energy: number, source: string | undefined, out: DestructionEvent[]): void => {\n for (const d of model.parts) {\n const p = ps.get(d.id)!\n if (p.lost) continue\n const dist = distToBox(d, centreLocal)\n if (dist > radius) continue\n const base = energy / (1 + dist * dist * 4)\n const shield = SHIELDED.has(d.role) ? 0.25 : 1\n damage(p, base * (BLUNT[d.material] ?? 1) * shield * 0.04, 'explosive', source, out)\n }\n }\n const explode = (tank: PState, source: string | undefined, out: DestructionEvent[]): void => {\n if (exploded) return\n exploded = true\n const d = tank.def\n const spec = d.explodes ?? { energy: 8e5, radius: 5, atC: 320 }\n out.push(ev({ type: 'explode', part: d.id, point: toWorld(d.box.center), energy: spec.energy, radius: spec.radius }))\n tank.liters = 0\n leaks.delete(d.id)\n if (vis) kit.explode(c, { delay: 0.6 })\n else (c as any).blast = (c as any).blast ?? { phase: 'fire', t: 0, T: 0.6 }\n lose(tank, 'broken', out)\n burningBlast(centreOf(d), spec.radius, spec.energy, source, out)\n for (const q of ps.values()) if (!q.lost && q.def.ignitionC && q.def.role !== 'fuel_tank') q.temp = Math.max(q.temp, q.def.ignitionC)\n }\n const heat = (centreLocal: any, radius: number, temp: number, dur: number, out: DestructionEvent[], falloff = 0.05): void => {\n for (const d of model.parts) {\n const p = ps.get(d.id)!\n if (p.lost) continue\n const dist = distToBox(d, centreLocal)\n if (dist > radius + falloff) continue\n const f = 1 - dist / (radius + falloff)\n const k = 1.2 / (1 + d.mass / 10)\n p.temp += (temp - p.temp) * Math.min(1, k * dur * f * 2)\n }\n void out\n }\n const thermal = (out: DestructionEvent[]): void => {\n for (const p of ps.values()) {\n const d = p.def\n if (p.lost) continue\n const fuelTank = d.role === 'fuel_tank'\n const flammable = !!d.ignitionC && (fuelTank ? (p.liters ?? 0) > 0.5 : p.fuelKg > 0)\n if (!p.burning && flammable && p.temp >= (d.ignitionC as number)) ignite(p, out)\n if (fuelTank && d.explodes && p.temp >= d.explodes.atC && (p.liters ?? 0) > 1) explode(p, undefined, out)\n }\n }\n const stepFire = (dt: number, out: DestructionEvent[]): void => {\n const flames: PState[] = []\n for (const p of ps.values()) {\n if (p.lost) continue\n const d = p.def\n if (p.burning) {\n flames.push(p)\n p.temp += (FLAME - p.temp) * Math.min(1, dt * 0.4)\n p.char = Math.min(1, p.char + dt * 0.02)\n if (d.role === 'fuel_tank') {\n if ((p.liters ?? 0) > 0) p.liters = Math.max(0, (p.liters ?? 0) - dt * 0.6)\n if ((p.liters ?? 0) <= 0.01) p.burning = false\n } else {\n p.fuelKg = Math.max(0, p.fuelKg - p.burnRate * dt)\n if (p.fuelKg <= 0) {\n p.burning = false\n out.push(ev({ type: 'burnout', part: d.id, point: toWorld(d.box.center) }))\n }\n }\n p.fireLoss += dt\n if (p.fireLoss >= 0.5) {\n const amount = p.def.hp * 0.012 * p.fireLoss\n p.fireLoss = 0\n damage(p, amount, 'fire', undefined, out)\n }\n // rubber and plastic sag as they burn\n if (!p.lost && (d.material === 'rubber' || d.material === 'plastic')) {\n const before = Math.floor(p.melt * 4)\n p.melt = Math.min(1, p.melt + dt / 12)\n if (Math.floor(p.melt * 4) > before || p.melt >= 1) {\n out.push(ev({ type: 'melt', part: d.id, melt: r2(p.melt) }))\n if (d.role === 'tyre') vis?.tyreMelt(d, p.melt)\n }\n if (p.melt >= 1) lose(p, 'melted', out)\n }\n } else if (d.material === 'plastic' && p.temp > 200) {\n const before = Math.floor(p.melt * 4)\n p.melt = Math.min(1, p.melt + (dt * (p.temp - 200)) / 4000)\n if (Math.floor(p.melt * 4) > before) out.push(ev({ type: 'melt', part: d.id, melt: r2(p.melt) }))\n if (p.melt >= 1) lose(p, 'melted', out)\n }\n if (!p.burning && p.temp > AMBIENT) p.temp = Math.max(AMBIENT, p.temp - dt * 6)\n }\n for (const f of flames) heat(centreOf(f.def), 0.8, 500, dt * 0.5, out, 0)\n fireNearLeak(flames, dt, out)\n thermal(out)\n }\n /** A leaking tank with a burning part (or its own fuel stain on fire) within reach lights: the vapour of the leak meets the flame. */\n const fireNearLeak = (flames: PState[], dt: number, out: DestructionEvent[]): void => {\n const tank = tankPart()\n const leak = tank ? leaks.get(tank.def.id) : undefined\n if (!tank || !leak || tank.lost || tank.burning || exploded || (leak.fluid !== 'fuel' && leak.fluid !== 'diesel')) return\n if (leak.pud?.fire) return light(tank, out)\n const { radius, chancePerSecond } = ignitionRules.fireNear\n if (chancePerSecond <= 0) return\n const near = flames.some((f) => f !== tank && distToBox(tank.def, centreOf(f.def)) - Math.max(...f.def.box.size) / 2 <= radius)\n if (near && igniteRand() < 1 - Math.exp(-chancePerSecond * dt)) light(tank, out)\n }\n\n // ---- hits ----------------------------------------------------------------------------------------------------------------------------\n const normalOf = (d: PartDef, v: any): any => faceNormal(d, v)\n const ballistic = (h: Hit, out: DestructionEvent[]): void => {\n sync()\n const M = toFrameMatrix()\n const v = toLocal(h.point)\n const p = locate(v, 0.2)\n if (!p) return\n const d = p.def\n const E = h.energy ?? 0\n const cal = h.caliber ?? 9\n const dir = dirToLocal(h.direction ?? [0, 0, -1]).normalize()\n const n = normalOf(d, v)\n const res = resist(d, p)\n const through = E >= res\n const cosInc = Math.abs(dir.dot(n))\n const metal = d.material === 'steel' || d.material === 'aluminium'\n const worldPoint = toWorld(v)\n if (metal && !through && cosInc < 0.3 && E > 40) {\n const refl = dir.clone().addScaledVector(n, -2 * dir.dot(n))\n out.push(ev({ type: 'ricochet', part: d.id, point: worldPoint, direction: r3(dirToWorld(refl)), energy: r2(E * 0.4) }))\n damage(p, E * 0.05, 'ballistic', h.source, out, worldPoint)\n vis?.spark([v.x, v.y, v.z], [refl.x, refl.y, refl.z], 6)\n return\n }\n const holeDiam = Math.max(0.006, (cal / 1000) * (d.material === 'glass' ? 1.4 : 1))\n const push = (hole: boolean): void => {\n if (!hole) return\n const hp: PartState['holes'][number] = { point: r3(fromVehicle(v, M)), normal: r3(fromVehicle(n, new THREE.Matrix4().extractRotation(M))), diameter: r2(holeDiam), through }\n p.holes.push(hp)\n out.push(ev({ type: 'hole', part: d.id, hole: hp, worldPoint, ...(through ? { exitPoint: add3(worldPoint, r3(dirToWorld(dir.clone().multiplyScalar(Math.max(0.02, Math.min(d.box.size[0], d.box.size[1], d.box.size[2])))))) } : {}) }))\n vis?.holeDecal([v.x, v.y, v.z], [n.x, n.y, n.z], holeDiam)\n startLeak(p, v, cal, out, dir)\n }\n switch (d.material) {\n case 'glass': {\n const laminated = d.hp > 1000\n const force = clamp(E / 800, 0.3, 1.2)\n const broke = vis ? vis.hitGlass(d, [v.x, v.y, v.z], [dir.x, dir.y, dir.z], force) : !laminated\n if (through || !laminated) push(true)\n if (laminated && !broke) {\n const crack = { point: r3(fromVehicle(v, M)), normal: r3(fromVehicle(n, new THREE.Matrix4().extractRotation(M))), length: r2(0.15 + force * 0.35), rays: 6 + Math.round(force * 6) }\n p.cracks.push(crack)\n out.push(ev({ type: 'crack', part: d.id, crack, worldPoint }))\n damage(p, E * 0.5, 'ballistic', h.source, out, worldPoint)\n } else damage(p, laminated ? E * 0.5 : p.hp, 'ballistic', h.source, out, worldPoint)\n break\n }\n case 'rubber': {\n push(through)\n damage(p, E * 0.4, 'ballistic', h.source, out, worldPoint)\n if (through && !p.lost && !p.flat) {\n p.flat = true\n vis?.tyreFlat(d, 0.24)\n }\n break\n }\n default: {\n push(through)\n if (!through && E > 50) {\n const dent: PartState['dents'][number] = { point: r3(fromVehicle(v, M)), normal: r3(fromVehicle(n, new THREE.Matrix4().extractRotation(M))), radius: r2(Math.max(0.02, holeDiam * 2)), depth: r2(Math.min(0.03, E / 60000 + 0.002)) }\n p.dents.push(dent)\n out.push(ev({ type: 'dent', part: d.id, dent, worldPoint }))\n }\n vis?.spark([v.x, v.y, v.z], [dir.x, dir.y, dir.z], through ? 4 : 8)\n let amount = through ? E * 0.6 : E * 0.25\n // a pierced battery or alternator is finished\n if (through && (d.role === 'battery' || d.role === 'alternator')) amount = Math.max(amount, p.hp * 0.65)\n damage(p, amount, 'ballistic', h.source, out, worldPoint)\n if (through && d.role === 'fuel_tank') rollIgnition(p, h, metal, out)\n }\n }\n }\n\n /** The tank is lit: it burns now, and the usual fire (the flames heat it to its explosion point, then the blast of a petrol tank) takes over. */\n const light = (tank: PState, out: DestructionEvent[]): void => {\n tank.temp = Math.max(tank.temp, (tank.def.ignitionC ?? 260) + 1)\n if ((tank.liters ?? 0) > 0.5) ignite(tank, out)\n }\n /**\n * A round went through the wall of the tank: does the fuel that leaks catch? Only if the round carries a spark that works on this wall or a flame,\n * weighed by how full the tank is (a full tank leaks, a nearly empty one lights). A plain bullet only leaks.\n */\n const rollIgnition = (tank: PState, h: Hit, metal: boolean, out: DestructionEvent[]): void => {\n const d = tank.def\n if (!d.contains || tank.burning || (tank.liters ?? 0) <= 0.05) return\n const fill = d.contains.liters > 0 ? (tank.liters ?? 0) / d.contains.liters : 0\n const chance = ignitionChance(h, { sparkTarget: sparkTargetFactor(d.material, metal, ignitionRules), fill, fluid: d.contains.fluid }, ignitionRules)\n if (chance > 0 && igniteRand() < chance) light(tank, out)\n }\n\n const blunt = (h: Hit, out: DestructionEvent[]): void => {\n sync()\n const M = toFrameMatrix()\n const v = toLocal(h.point)\n const E = h.energy ?? 0\n const first = locate(v, 0.3)\n if (!first) return\n const big = E >= 4000\n const dirv = h.direction ? dirToLocal(h.direction).normalize() : new V3(((c.meta.front ?? 1) + (c.meta.rear ?? -1)) / 2 - v.x, 0, -v.z).normalize()\n const force = clamp(0.3 + E / 70000, 0.3, 1.4)\n if (big && vis) kit.impact(c, v, dirv, force)\n const reach = big ? 0.55 + 0.45 * force : Math.max(h.radius ?? 0.03, 0.05) + 0.08\n const rot = new THREE.Matrix4().extractRotation(M)\n for (const d of model.parts) {\n const p = ps.get(d.id)!\n if (p.lost) continue\n const dist = distToBox(d, v)\n if (dist > reach) continue\n const w = (1 - dist / reach) ** 2\n const shield = SHIELDED.has(d.role) && !big ? 0 : SHIELDED.has(d.role) ? 0.3 : 1\n const amount = E * w * (BLUNT[d.material] ?? 1) * shield\n if (amount <= 0.5) continue\n const n = normalOf(d, v)\n const worldPoint = toWorld(v)\n if (d.material === 'glass') {\n if (amount < d.hp) {\n const crack = { point: r3(fromVehicle(v, M)), normal: r3(fromVehicle(n, rot)), length: r2(0.2 + Math.min(0.8, amount / d.hp)), rays: 8 }\n p.cracks.push(crack)\n out.push(ev({ type: 'crack', part: d.id, crack, worldPoint }))\n }\n if (vis && amount >= d.hp * 0.5) vis.hitGlass(d, [v.x, v.y, v.z], [dirv.x, dirv.y, dirv.z], clamp(amount / d.hp, 0.3, 1.2))\n } else if (d.material !== 'rubber' && amount > d.hp * 0.01) {\n const dent: PartState['dents'][number] = { point: r3(fromVehicle(v, M)), normal: r3(fromVehicle(n, rot)), radius: r2(reach * 0.6), depth: r2(clamp((0.35 * amount) / d.hp, 0.003, 0.28)) }\n p.dents.push(dent)\n out.push(ev({ type: 'dent', part: d.id, dent, worldPoint }))\n }\n damage(p, amount, 'blunt', h.source, out, worldPoint)\n }\n if (big && !exploded) {\n const tank = [...ps.values()].find((q) => q.def.role === 'fuel_tank' && !q.lost)\n if (tank && distToBox(tank.def, v) <= reach && E > 30000) startLeak(tank, centreOf(tank.def).setY(tank.def.box.center[1] - tank.def.box.size[1] / 2 + 0.05), 12, out, dirv)\n }\n }\n\n const explosive = (h: Hit, out: DestructionEvent[]): void => {\n sync()\n const v = toLocal(h.point)\n const E = h.energy ?? 0\n const radius = h.radius ?? 3\n const centre = new V3(((c.meta.front ?? 1) + (c.meta.rear ?? -1)) / 2, 0.6, 0)\n const away = centre.clone().sub(v)\n away.y = Math.max(away.y, 0)\n const dir = away.lengthSq() > 1e-6 ? away.normalize() : new V3(0, 1, 0)\n const nearest = Math.min(...model.parts.map((d) => distToBox(d, v)))\n if (nearest > radius) return\n if (vis && E >= 3000) kit.impact(c, v.clone().addScaledVector(dir, -0.1).setY(clamp(v.y, 0.3, 1.2)), dir, clamp(0.4 + E / 60000, 0.4, 1.4), { noStain: true })\n burningBlast(v, radius, E, h.source, out)\n const tank = [...ps.values()].find((q) => q.def.role === 'fuel_tank' && !q.lost)\n if (tank && !exploded) {\n const dist = distToBox(tank.def, v)\n if (dist <= radius) {\n const verdict = kit.blastDamage(c, E / (1 + dist * dist * 4) / 50)\n if (verdict === 'explosion') explode(tank, h.source, out)\n else if (verdict === 'fire') {\n light(tank, out)\n startLeak(tank, centreOf(tank.def).setY(tank.def.box.center[1] - tank.def.box.size[1] / 2 + 0.05), 12, out, dir)\n }\n }\n }\n // heat of the blast ignites tyres and plastics nearby\n heat(v, radius * 0.5, 450, 1, out)\n }\n\n const fireHit = (h: Hit, out: DestructionEvent[]): void => {\n sync()\n const v = toLocal(h.point)\n heat(v, h.radius ?? 0.4, h.temperature ?? FLAME, h.duration ?? 0.016, out)\n thermal(out)\n }\n\n // ---- mechanical status ---------------------------------------------------------------------------------------------------------------\n const sound = (role: PartRole): boolean => {\n const list = [...ps.values()].filter((p) => p.def.role === role)\n if (!list.length) return true\n return list.every((p) => !p.lost && attached(p.def.id) && p.hp >= p.def.hp * 0.5)\n }\n const tankPart = (): PState | undefined => [...ps.values()].find((p) => p.def.role === 'fuel_tank' && p.def.contains)\n const computeStatus = (): VehicleStatus => {\n const electric = (c.spec as any).fuel === 'electric'\n const tank = tankPart()\n const fuel = tank ? (tank.liters ?? 0) : electric ? 1 : 1\n const engineOk = sound('engine') && !exploded && fuel > 0.05\n const powered = sound('battery') && sound('alternator')\n const gearOk = sound('gearbox')\n const brakes = [...ps.values()].find((p) => p.def.role === 'brakes')\n const flat = [...ps.values()].filter((p) => p.def.role === 'tyre' && (p.flat || p.lost) && !p.burning).map((p) => p.def.id)\n const brakeLost = brakes ? brakes.lost || !attached(brakes.def.id) : false\n const brakeWorn = brakes ? brakes.hp < brakes.def.hp * 0.5 : false\n const brakeFactor = (brakeLost ? 3.5 : brakeWorn ? 1.8 : 1) * (1 + 0.15 * flat.length)\n const st = [...ps.values()].find((p) => p.def.role === 'steering')\n const stBad = st ? st.lost || !attached(st.def.id) : false\n const stWorn = st ? st.hp < st.def.hp * 0.5 : false\n const flatSide = flat.reduce((s, tid) => s + (ps.get(tid)!.def.box.center[2] < 0 ? -1 : 1), 0)\n const pull = clamp((stBad ? 0.6 : stWorn ? 0.25 : 0) * steerSign + flatSide * 0.12, -1, 1)\n const canStart = powered && engineOk\n return {\n canStart,\n lightsOn: powered,\n canDrive: canStart && gearOk,\n brakeFactor: r2(brakeFactor),\n steerPull: r2(pull),\n flatTyres: flat,\n detached: [...ps.values()].filter((p) => !p.lost && !attached(p.def.id)).map((p) => p.def.id),\n leaking: [...leaks.keys()],\n burning: [...ps.values()].filter((p) => p.burning).map((p) => p.def.id),\n exploded,\n fuelLiters: r2(tank ? (tank.liters ?? 0) : 0),\n } as VehicleStatus\n }\n const applyEffects = (): void => {\n const s = computeStatus()\n if (s.lightsOn !== wasLit) {\n wasLit = s.lightsOn\n vis?.setLights(s.lightsOn)\n }\n if (!s.canStart && !deadEngine) {\n deadEngine = true\n ;(c as any).engineHealth = 0\n } else if (s.canStart && deadEngine) {\n deadEngine = false\n ;(c as any).engineHealth = 1\n }\n }\n\n // ---- blast and rollover sync -----------------------------------------------------------------------------------------------------------\n const afterBlast = (out: DestructionEvent[]): void => {\n if (blastHandled || !(c as any).exploded) return\n blastHandled = true\n // the kit threw the hood, the doors, the rear bumper and one wheel\n const hood = ps.get(vis?.hood?.id ?? '')\n if (hood && !hood.lost) hood.status = 'damaged'\n for (const p of ps.values()) {\n if (p.lost) continue\n const d = p.def\n if (d.role === 'hood' || d.role === 'door' || (d.role === 'bumper' && d.box.center[0] < 0)) {\n visualDone.add(d.id)\n for (const j of js) if (!j.open && j.def.a === d.id) openJoint(j, 'break', out)\n }\n }\n const left = new Set((c.wheels as any[]).filter((w) => w.parent))\n for (const p of ps.values()) {\n if (p.def.role !== 'rim' || p.lost) continue\n const z = (kit.zonesOf(c) as any[]).find((q) => q.id === p.def.zoneId)\n const ws = (z?.wheels ?? []) as any[]\n if (ws.length && ws.every((w) => !left.has(w))) {\n visualDone.add(p.def.id)\n for (const j of js) if (!j.open && j.def.a === p.def.id) openJoint(j, 'break', out)\n }\n }\n for (const p of ps.values()) {\n if (p.lost) continue\n if (p.def.role === 'tyre' || p.def.material === 'plastic') p.temp = Math.max(p.temp, p.def.ignitionC ?? 0)\n if (p.def.role === 'glass' || p.def.role === 'light') lose(p, 'broken', out)\n }\n }\n const afterRoll = (out: DestructionEvent[]): void => {\n if (rollHandled || !(c as any).flipped) return\n rollHandled = true\n const M = toFrameMatrix()\n const rot = new THREE.Matrix4().extractRotation(M)\n for (const p of ps.values()) {\n if (p.lost) continue\n const d = p.def\n if (d.role === 'roof') {\n const dent: PartState['dents'][number] = { point: r3(fromVehicle(centreOf(d), M)), normal: r3(fromVehicle(new V3(0, 1, 0), rot)), radius: r2(Math.max(d.box.size[0], d.box.size[2]) * 0.4), depth: 0.14 }\n p.dents.push(dent)\n out.push(ev({ type: 'dent', part: d.id, dent, worldPoint: toWorld(d.box.center) }))\n damage(p, d.hp * 0.6, 'blunt', 'rollover', out)\n } else if (d.role === 'pillar') damage(p, d.hp * 0.5, 'blunt', 'rollover', out)\n else if (d.role === 'glass') damage(p, d.material === 'glass' && d.hp > 1000 ? d.hp * 0.55 : d.hp, 'blunt', 'rollover', out)\n else if (d.role === 'mirror') damage(p, d.hp, 'blunt', 'rollover', out)\n }\n for (const tid of ['oil_pan', 'fuel_tank']) {\n const p = ps.get(tid)\n if (p && !p.lost && p.def.contains) {\n damage(p, p.def.hp * 0.2, 'blunt', 'rollover', out)\n startLeak(p, centreOf(p.def).setY(p.def.box.center[1] - p.def.box.size[1] / 2), 16, out, new V3(0, -1, 0))\n }\n }\n }\n\n // ---- the contract --------------------------------------------------------------------------------------------------------------------\n const describe = (): DestructibleSpec => {\n if (specCache) return specCache\n const M = toFrameMatrix()\n const parts: PartSpec[] = model.parts.map((d) => {\n const bb = new THREE.Box3(new V3(d.box.center[0] - d.box.size[0] / 2, d.box.center[1] - d.box.size[1] / 2, d.box.center[2] - d.box.size[2] / 2), new V3(d.box.center[0] + d.box.size[0] / 2, d.box.center[1] + d.box.size[1] / 2, d.box.center[2] + d.box.size[2] / 2)).applyMatrix4(M)\n const size = bb.getSize(new V3())\n const cen = bb.getCenter(new V3())\n return {\n id: d.id,\n material: d.material,\n shape: { kind: 'box', size: r3([Math.max(0.02, size.x), Math.max(0.02, size.y), Math.max(0.02, size.z)]) },\n position: r3([cen.x, cen.y, cen.z]),\n mass: r2(d.mass),\n hp: d.hp,\n ...(d.contains ? { contains: { fluid: d.contains.fluid, liters: d.contains.liters, ...(d.contains.pressurized ? { pressurized: true } : {}) } } : {}),\n ...(d.explodes ? { explodes: { ...d.explodes } } : {}),\n tags: [...d.tags, d.role],\n }\n })\n const joints: JointSpec[] = model.joints.map((j) => ({ id: j.id, a: j.a, b: j.b, kind: j.kind, strength: j.strength, tools: [...j.tools], seconds: j.seconds }))\n specCache = { name: options.name ?? (c.spec as any).name ?? c.key, parts, joints, tags: ['vehicle', kindOf(c)] }\n return specCache\n }\n\n const state = (): ObjectState => {\n const parts: PartState[] = model.parts.map((d) => {\n const p = ps.get(d.id)!\n const marked = p.dents.length > 0 || p.holes.length > 0 || p.cracks.length > 0\n const status = p.lost ? p.status : p.hp < p.def.hp || marked ? 'damaged' : 'intact'\n return {\n id: d.id,\n material: d.material,\n status,\n hp: r2(p.hp),\n maxHp: d.hp,\n mass: r2(d.mass * (1 - p.char * 0.2 * (p.def.material === 'plastic' || p.def.role === 'tyre' ? 1 : 0))),\n temperature: r2(p.temp),\n burning: p.burning,\n fuel: r2(p.fuelKg),\n char: r2(p.char),\n melt: r2(p.melt),\n dents: p.dents.map((x) => ({ ...x })),\n holes: p.holes.map((x) => ({ ...x })),\n cracks: p.cracks.map((x) => ({ ...x })),\n ...(p.liters !== undefined ? { liters: r2(p.liters) } : {}),\n group: p.lost ? -1 : (groupOf.get(d.id) ?? -1),\n }\n })\n const joints = js.map((j) => ({\n id: j.def.id,\n a: j.def.a,\n b: j.def.b,\n kind: j.def.kind,\n hp: r2(Math.max(0, j.hp)),\n maxHp: j.def.strength,\n progress: r2(j.progress),\n open: j.open,\n ...(j.open && j.by ? { openedBy: j.by } : {}),\n }))\n return { id, name: options.name ?? (c.spec as any).name ?? c.key, position: [0, 0, 0], rotation: [0, 0, 0, 1], parts, joints, groups: groupsCache.map((g) => [...g]), destroyed: parts.every((p) => p.status === 'broken' || p.status === 'melted' || p.status === 'ashes') }\n }\n\n const hit = (h: Hit): DestructionEvent[] => {\n const out: DestructionEvent[] = []\n const hh: Hit = h.space === 'local' ? { ...h, space: 'world', point: toWorld(h.point as Vec3) } : h\n if (hh.space === 'local' || !hh.point) return out\n switch (hh.type) {\n case 'ballistic':\n ballistic(hh, out)\n break\n case 'blunt':\n case 'slash':\n blunt(hh, out)\n break\n case 'explosive':\n explosive(hh, out)\n break\n case 'fire':\n case 'heat':\n fireHit(hh, out)\n break\n }\n applyEffects()\n return out\n }\n\n const update = (dt: number): DestructionEvent[] => {\n clock += dt\n const out: DestructionEvent[] = queue\n queue = []\n // a clip that turns the hood drives it: the kit keeps what it is told\n const hood = (c as any).hood\n if (hood) {\n const sign = hood.sign || 1\n const cur = hood.piv.rotation.z / sign\n if (Math.abs(cur - hood.ang) > 1e-4) {\n hood.ang = cur\n hood.target = cur\n }\n }\n if (vis) kit.tick(c, dt)\n else if ((c as any).blast) I.tickBoom?.(c, dt)\n stepFire(dt, out)\n for (const [pid, l] of leaks) {\n const p = ps.get(pid)!\n p.liters = Math.max(0, (p.liters ?? 0) - l.rate * dt)\n if ((p.liters ?? 0) <= 0) leaks.delete(pid)\n }\n afterBlast(out)\n afterRoll(out)\n applyEffects()\n return out\n }\n\n const disassemble = (jointId: string, tool: ToolKind, dt: number): number => {\n const j = js.find((x) => x.def.id === jointId)\n if (!j || !j.def.tools.includes(tool)) return -1\n if (j.open) return 1\n j.progress = Math.min(1, j.progress + dt / j.def.seconds)\n const step = Math.floor(j.progress * 4) / 4\n if (step > j.reported && j.progress < 1) {\n j.reported = step\n queue.push(ev({ type: 'disassemble_progress', joint: j.def.id, tool, progress: r2(j.progress) }))\n }\n if (j.progress >= 1) {\n const out: DestructionEvent[] = []\n openJoint(j, 'tool', out)\n queue.push(...out)\n applyEffects()\n }\n return j.progress\n }\n\n const extinguish = (partId?: string): void => {\n for (const p of ps.values()) {\n if (partId && p.def.id !== partId) continue\n if (p.burning) {\n p.burning = false\n queue.push(ev({ type: 'extinguish', part: p.def.id }))\n }\n p.temp = Math.min(p.temp, 120)\n }\n if (!partId) {\n c.emitters = (c.emitters as any[]).filter((e) => e.kind !== 'fire' && e.kind !== 'black')\n }\n }\n\n const reset = (): void => {\n const old = c\n const parent = old.root.parent\n const next = kit.build(old.key, old.state, old.scenario != null ? { scenario: old.scenario } : undefined)\n if (parent) {\n next.root.position.copy(old.root.position)\n next.root.quaternion.copy(old.root.quaternion)\n next.root.scale.copy(old.root.scale)\n parent.add(next.root)\n parent.remove(old.root)\n }\n kit.dispose(old)\n c = next\n ;(c.root as any).userData = { ...(c.root as any).userData, ...(old.root as any).userData }\n clock = 0\n setup()\n }\n\n const rollover = (side = 1): void => {\n if (kit.roll(c, side)) rolled = true\n void rolled\n }\n\n setup()\n\n const impl: VehicleDestructible = {\n id,\n name: options.name ?? (c.spec as any).name,\n get vehicle() {\n return c\n },\n get model() {\n return model\n },\n describe,\n hit,\n update,\n state,\n reset,\n disassemble,\n extinguish,\n serialize: () => ({\n clock,\n parts: [...ps.entries()].map(([k, p]) => [k, p.hp, p.liters, p.lost, p.status, p.flat]),\n joints: js.map((j) => [j.def.id, j.hp, j.progress, j.open, j.by ?? null]),\n }),\n partName: (pid) => ps.get(pid)?.def.name ?? pid,\n status: computeStatus,\n animations: () => createVehicleClips(model, vis, kit, c),\n partWorldCenter: (pid) => {\n sync()\n const d = ps.get(pid)?.def\n return d ? toWorld(d.box.center) : [0, 0, 0]\n },\n rollover,\n detachedParts: () =>\n [...ps.values()]\n .filter((p) => (!p.lost && !attached(p.def.id)) || (p.lost && p.def.visual && js.some((j) => j.open && j.def.a === p.def.id)))\n .map((p) => p.def.id),\n }\n return impl\n}\n","/**\n * Part and joint model of a vehicle for the destruction contract: every damage zone becomes a part with a material, the mechanical parts the\n * zones do not cover (battery, alternator, gearbox, brakes, steering, shock absorbers, tow hitch, tyres, mirrors, pillars...) are added from the\n * vehicle meta, and the joints (hinge, bolt, weld, glue, clip) say how each one is held.\n *\n * Everything here is pure data derived from the built vehicle: no meshes are created or touched.\n */\nimport type { JointKind, MaterialId, ToolKind, Vec3 } from '@adatechnology/game-contracts'\nimport type { VehicleContext, VehicleKit } from '../api'\nimport { clamp, strHash } from '../util'\n\n/** What a part is, which decides its material, its joint and what happens when it comes off. */\nexport type PartRole =\n | 'frame'\n | 'panel'\n | 'fender'\n | 'door'\n | 'hood'\n | 'lid'\n | 'roof'\n | 'bumper'\n | 'glass'\n | 'light'\n | 'rim'\n | 'tyre'\n | 'mirror'\n | 'pillar'\n | 'engine'\n | 'radiator'\n | 'fuel_tank'\n | 'oil_pan'\n | 'battery'\n | 'alternator'\n | 'gearbox'\n | 'brakes'\n | 'steering'\n | 'shocks'\n | 'hitch'\n | 'other'\n\n/** An axis-aligned box in `c.vehicle` coordinates (+x front, +y up, +z right). */\nexport interface LocalBox {\n center: Vec3\n size: Vec3\n}\n\nexport interface PartDef {\n id: string\n role: PartRole\n /** Display name from the locale. */\n name: string\n material: MaterialId\n box: LocalBox\n mass: number\n /** Energy in joules that wrecks the part. */\n hp: number\n /** The damage zone this part is, when it is one. */\n zoneId?: string\n /** Fluid held, in litres. */\n contains?: { fluid: string; liters: number; pressurized?: boolean }\n explodes?: { energy: number; radius: number; atC: number }\n /** Temperature in Celsius at which the part catches fire (none: it does not burn). */\n ignitionC?: number\n /** Parts that can be seen coming off the vehicle (the others are logical: they keep state and effects only). */\n visual: boolean\n /** The part is one of the new mechanical parts (the ones the damage zones do not cover). */\n mechanical: boolean\n tags: string[]\n}\n\nexport interface JointDef {\n id: string\n a: string\n b: string\n kind: JointKind\n strength: number\n tools: ToolKind[]\n seconds: number\n}\n\nexport interface VehicleModel {\n parts: PartDef[]\n joints: JointDef[]\n /** The part every other part hangs from. */\n hub: string\n hitch: boolean\n}\n\nexport interface ModelOptions {\n /** Fit a tow hitch. Default: the spec flag `hitch`, else a seeded choice by vehicle kind. */\n hitch?: boolean\n}\n\n/** Joint kinds as the vehicle uses them: strength in joules of wear, the tools that undo them and the seconds of work. */\nexport const JOINT_RULES: Record<'hinge' | 'bolt' | 'weld' | 'glue' | 'clip', { strength: number; tools: ToolKind[]; seconds: number }> = {\n hinge: { strength: 5000, tools: ['wrench', 'screwdriver'], seconds: 3 },\n bolt: { strength: 3000, tools: ['wrench'], seconds: 4 },\n weld: { strength: 30000, tools: ['cutting_torch', 'saw'], seconds: 10 },\n glue: { strength: 800, tools: ['pry_bar', 'knife'], seconds: 3 },\n clip: { strength: 500, tools: ['pry_bar', 'hand'], seconds: 1.5 },\n}\n\ntype Kind = 'car' | 'bike' | 'quad' | 'tractor' | 'truck' | 'bus' | 'tank' | 'boat' | 'plane' | 'heli'\n\n/** Which mechanical parts each vehicle kind has. */\nconst MECHANICS: Record<Kind, Array<'battery' | 'alternator' | 'gearbox' | 'brakes' | 'steering' | 'shocks' | 'oil_pan' | 'mirrors'>> = {\n car: ['battery', 'alternator', 'gearbox', 'brakes', 'steering', 'shocks', 'oil_pan', 'mirrors'],\n truck: ['battery', 'alternator', 'gearbox', 'brakes', 'steering', 'shocks', 'oil_pan', 'mirrors'],\n bus: ['battery', 'alternator', 'gearbox', 'brakes', 'steering', 'shocks', 'oil_pan', 'mirrors'],\n tractor: ['battery', 'alternator', 'gearbox', 'brakes', 'steering', 'shocks', 'oil_pan', 'mirrors'],\n quad: ['battery', 'alternator', 'gearbox', 'brakes', 'steering', 'shocks', 'oil_pan'],\n bike: ['battery', 'alternator', 'gearbox', 'brakes', 'steering', 'shocks', 'oil_pan', 'mirrors'],\n tank: ['battery', 'alternator', 'gearbox', 'brakes', 'steering', 'oil_pan'],\n boat: ['battery', 'alternator', 'gearbox', 'steering'],\n plane: ['battery', 'alternator', 'brakes', 'steering', 'shocks'],\n heli: ['battery', 'alternator', 'gearbox'],\n}\n\n/** Chance (percent) that a vehicle of the kind has a tow hitch when neither the spec nor the options say. */\nconst HITCH_CHANCE: Record<Kind, number> = { car: 30, truck: 60, bus: 0, tractor: 100, quad: 40, bike: 0, tank: 0, boat: 0, plane: 0, heli: 0 }\n\nconst STEEL_KG_M2 = 7\nconst ALU_KG_M2 = 3.2\n\nexport const kindOf = (c: VehicleContext): Kind => {\n const k = c.meta.kind\n return (k && k in MECHANICS ? k : 'car') as Kind\n}\n\nconst side = (v: number): 'left' | 'right' => (v < 0 ? 'left' : 'right')\n\n/** Rough mass of the vehicle in kilograms from its size. */\nexport const vehicleMass = (c: VehicleContext): number => {\n const m = c.meta\n const L = m.length ?? 4\n const W = m.width ?? 1.7\n const H = m.bodyHeight ?? 0.7\n return clamp(L * W * H * 320, 90, 60000)\n}\n\nconst areaOf = (size: Vec3): number => {\n const s = [...size].sort((a, b) => b - a)\n return s[0] * s[1]\n}\n\nconst boxOf = (z: { box: { x0: number; x1: number; y0: number; y1: number; z0: number; z1: number } }): LocalBox => ({\n center: [(z.box.x0 + z.box.x1) / 2, (z.box.y0 + z.box.y1) / 2, (z.box.z0 + z.box.z1) / 2],\n size: [Math.max(0.02, z.box.x1 - z.box.x0), Math.max(0.02, z.box.y1 - z.box.y0), Math.max(0.02, z.box.z1 - z.box.z0)],\n})\n\n/** Panel material by vehicle kind: aircraft and boats are aluminium, the rest steel. */\nconst skinOf = (kind: Kind): MaterialId => (kind === 'plane' || kind === 'heli' || kind === 'boat' ? 'aluminium' : 'steel')\n\n/** The zone is a fender (a front or rear wing, not a door or a side panel). */\nconst isFender = (id: string): boolean => /^fender/.test(id)\n\nconst roleOfZone = (z: { id: string; type: string; sub?: string; fxKey?: string }): PartRole => {\n const sub = String(z.sub ?? z.id)\n if (z.type === 'part' || z.type === 'internal') {\n if (/^engine/.test(sub)) return 'engine'\n if (sub === 'radiator') return 'radiator'\n if (/fuel_tank/.test(sub)) return 'fuel_tank'\n if (sub === 'battery') return 'battery'\n }\n switch (z.type) {\n case 'door':\n return 'door'\n case 'hood':\n return 'hood'\n case 'lid':\n return 'lid'\n case 'roof':\n return 'roof'\n case 'bumper':\n return 'bumper'\n case 'glass':\n return 'glass'\n case 'light':\n return 'light'\n case 'wheel':\n return 'rim'\n case 'internal':\n if (/^engine/.test(sub)) return 'engine'\n if (sub === 'radiator') return 'radiator'\n if (/fuel_tank/.test(sub) || sub === 'tank') return 'fuel_tank'\n if (sub === 'battery') return 'battery'\n return 'frame'\n case 'panel':\n return isFender(z.id) ? 'fender' : 'panel'\n default:\n return 'other'\n }\n}\n\n/**\n * The frame hub is a thin floor pan under the cabin: wide enough to touch the wheels (so a wrench finds the wheel bolts), but low and short so\n * a bullet aimed at the tank or the engine does not hit it first.\n */\nconst floorPan = (b: LocalBox): LocalBox => ({\n center: [b.center[0], b.center[1] - b.size[1] / 2 + Math.min(0.14, b.size[1]) / 2 + 0.04, b.center[2]],\n size: [b.size[0] * 0.5, Math.min(0.14, b.size[1]), b.size[2] * 0.95],\n})\n\n/** Builds the part and joint model of a built vehicle. */\nexport function buildVehicleModel(kit: VehicleKit, c: VehicleContext, options: ModelOptions = {}): VehicleModel {\n const kind = kindOf(c)\n const m = c.meta\n const spec = c.spec as { fuel?: string; hitch?: boolean }\n const t = kit.t\n const skin = skinOf(kind)\n const armour = m.armored || m.bullet ? 12 : 1\n const mass = vehicleMass(c)\n const W = m.width ?? 1.7\n const F = m.front ?? 2\n const R = m.rear ?? -2\n const L = m.length ?? F - R\n const clearance = m.clearance ?? 0.3\n const belt = m.belt ?? clearance + (m.bodyHeight ?? 0.6)\n const electric = spec.fuel === 'electric'\n const fuelless = electric || spec.fuel === 'none'\n const parts: PartDef[] = []\n const joints: JointDef[] = []\n const ids = new Set<string>()\n\n const add = (p: Omit<PartDef, 'tags' | 'mechanical'> & { tags?: string[]; mechanical?: boolean }): PartDef => {\n let id = p.id\n for (let n = 2; ids.has(id); n++) id = `${p.id}_${n}`\n ids.add(id)\n const part: PartDef = { ...p, id, tags: p.tags ?? [], mechanical: p.mechanical ?? false }\n parts.push(part)\n return part\n }\n const join = (a: string, b: string, jk: keyof typeof JOINT_RULES, scale = 1): void => {\n const rule = JOINT_RULES[jk]\n joints.push({ id: `${a}~${b}`, a, b, kind: jk, strength: rule.strength * scale, tools: [...rule.tools], seconds: rule.seconds })\n }\n\n // ---- zones ------------------------------------------------------------------------------------------------------------------------------\n const zones = kit.zonesOf(c) as Array<any>\n const zoneOf = new Map<string, any>()\n for (const z of zones) zoneOf.set(z.id, z)\n\n const hasTankZone = zones.some((z) => roleOfZone(z) === 'fuel_tank')\n const hasRadiatorZone = zones.some((z) => roleOfZone(z) === 'radiator')\n const hubZone = zones.find((z) => z.id === 'underbody') ?? zones.find((z) => z.id === 'chassis')\n\n // the hub every joint hangs from: the underbody or chassis zone, else a frame part spanning the body\n const hubId = hubZone ? hubZone.id : 'chassis'\n\n for (const z of zones) {\n let role = roleOfZone(z)\n if (z === hubZone) role = 'frame'\n const box = boxOf(z)\n const area = areaOf(box.size)\n const id = z.id as string\n const label = String(z.name ?? id)\n const tags: string[] = [...(z.tags ?? [])]\n if (role === 'rim') {\n const wheels = (z.wheels ?? []) as any[]\n const r = Math.max(0.2, ...wheels.map((w) => w.userData?.r ?? 0.3))\n // the rim is the inner, smaller part of the wheel box: the tyre wraps it and the bolts are on the body side\n const sz = Math.sign(box.center[2]) || 1\n const rimBox: LocalBox = { center: [box.center[0], box.center[1], box.center[2] - sz * box.size[2] * 0.25], size: [box.size[0] * 0.7, box.size[1] * 0.7, box.size[2] * 0.5] }\n add({ id, role, name: label, material: kind === 'plane' || kind === 'heli' ? 'aluminium' : 'steel', box: rimBox, mass: 22 * r * Math.max(1, wheels.length), hp: 12000 * armour, zoneId: id, visual: kind !== 'plane' && !/landing/.test(id), tags: ['wheel', ...tags] })\n const tyreId = id.replace(/^wheels?/, 'tyre').replace(/^(?!tyre)/, 'tyre_')\n const tyreBox: LocalBox = { center: box.center, size: [box.size[0] * 0.98, box.size[1] * 0.98, box.size[2]] }\n add({\n id: tyreId,\n role: 'tyre',\n name: t('mechanics.tyre', { zone: label }),\n material: 'rubber',\n box: tyreBox,\n mass: 38 * r * Math.max(1, wheels.length),\n hp: 6000,\n ignitionC: 350,\n visual: wheels.length > 0 && !/landing/.test(id),\n mechanical: true,\n tags: ['tyre', 'wheel'],\n zoneId: id,\n })\n continue\n }\n if (role === 'glass') {\n const glass = (z.glass ?? [])[0]\n const laminated = glass?.userData?.glass?.type === 'laminated' || m.bullet\n add({ id, role, name: label, material: 'glass', box, mass: 10 * area, hp: laminated ? 4000 : 450, zoneId: id, visual: false, tags: ['glass', ...tags] })\n continue\n }\n if (role === 'light') {\n add({ id, role, name: label, material: 'glass', box, mass: 1.2 + 4 * area, hp: 320, zoneId: id, visual: true, tags: ['light', ...tags] })\n continue\n }\n if (role === 'bumper') {\n add({ id, role, name: label, material: 'plastic', box, mass: 6 + 5 * area, hp: 9000, ignitionC: 400, zoneId: id, visual: true, tags: ['bumper', ...tags] })\n continue\n }\n if (role === 'engine') {\n const kg = { bike: 55, quad: 90, car: 150, tractor: 450, truck: 600, bus: 450, tank: 900, boat: 90, plane: 160, heli: 150 }[kind]\n add({ id, role, name: label, material: kind === 'plane' || kind === 'heli' ? 'aluminium' : 'steel', box, mass: kg, hp: 60000 * armour, ignitionC: 260, zoneId: id, visual: false, tags: ['engine', ...tags] })\n continue\n }\n if (role === 'radiator') {\n add({ id, role, name: label, material: 'aluminium', box, mass: 8, hp: 3000, zoneId: id, visual: false, contains: { fluid: 'coolant', liters: kind === 'truck' || kind === 'bus' ? 18 : 7, pressurized: true }, tags: ['radiator', ...tags] })\n continue\n }\n if (role === 'fuel_tank') {\n if (fuelless) {\n add({ id, role: 'other', name: label, material: 'steel', box, mass: 20, hp: 25000, zoneId: id, visual: false, tags })\n continue\n }\n const liters = { bike: 14, quad: 16, car: 55, tractor: 150, truck: 300, bus: 200, tank: 600, boat: 90, plane: 120, heli: 300 }[kind]\n const diesel = spec.fuel === 'diesel'\n add({\n id,\n role,\n name: label,\n material: 'steel',\n box,\n mass: 14 + liters * 0.8,\n hp: 25000 * armour,\n zoneId: id,\n visual: false,\n contains: { fluid: diesel ? 'diesel' : 'fuel', liters },\n explodes: diesel ? undefined : { energy: 1.2e6 * (liters / 55), radius: 5 + liters / 30, atC: 320 },\n ignitionC: diesel ? 330 : 260,\n tags: ['fuel_tank', ...tags],\n })\n continue\n }\n if (role === 'battery') {\n add({ id, role, name: label, material: 'plastic', box, mass: 14, hp: 1500, zoneId: id, visual: true, ignitionC: 200, tags: ['battery', ...tags] })\n continue\n }\n if (role === 'frame') {\n add({ id, role, name: label, material: 'steel', box: floorPan(box), mass: mass * 0.25, hp: 150000 * armour, zoneId: id, visual: false, tags: ['frame', ...tags] })\n continue\n }\n const roofLike = role === 'roof'\n const kg = (skin === 'steel' ? STEEL_KG_M2 : ALU_KG_M2) * area * (role === 'door' ? 1.6 : 1)\n add({\n id,\n role,\n name: label,\n material: skin,\n box,\n mass: Math.max(2, kg),\n hp: (roofLike ? 30000 : 20000) * armour,\n zoneId: id,\n visual: role === 'door' || role === 'hood' || role === 'lid' || role === 'fender',\n tags: [role, ...tags],\n })\n }\n\n // the hub is a synthetic frame part when the vehicle has no underbody or chassis zone\n if (!hubZone) {\n const h = Math.max(0.15, belt - clearance)\n add({\n id: hubId,\n role: 'frame',\n name: t('mechanics.chassis'),\n material: 'steel',\n box: floorPan({ center: [(F + R) / 2, clearance + h * 0.45, 0], size: [Math.max(0.4, L * 0.8), h * 0.7, Math.max(0.2, W * 0.9)] }),\n mass: mass * 0.25,\n hp: 150000 * armour,\n visual: false,\n mechanical: true,\n tags: ['frame'],\n })\n }\n\n // ---- mechanical parts the zones do not cover ---------------------------------------------------------------------------------------------\n const mech = new Set(MECHANICS[kind])\n const wheelParts = parts.filter((p) => p.role === 'rim')\n const frontX = wheelParts.length ? Math.max(...wheelParts.map((p) => p.box.center[0])) : F - L * 0.2\n const rearX = wheelParts.length ? Math.min(...wheelParts.map((p) => p.box.center[0])) : R + L * 0.2\n const wheelR = wheelParts.length ? Math.max(...wheelParts.map((p) => p.box.size[1] / 2)) : 0.3\n const heightCenter = (F + R) / 2\n\n // engine (some vehicles have no engine zone: bus, tank)\n let engine = parts.find((p) => p.role === 'engine')\n if (!engine && !electric && kind !== 'bike') {\n const ex = kind === 'bus' ? frontX + 0.4 : kind === 'tank' ? R + L * 0.15 : F - L * 0.2\n engine = add({\n id: 'engine',\n role: 'engine',\n name: t('mechanics.engine'),\n material: skin,\n box: { center: [ex, clearance + 0.4, 0], size: [Math.min(1.1, L * 0.2), 0.6, Math.min(0.9, W * 0.45)] },\n mass: 300,\n hp: 60000 * armour,\n ignitionC: 260,\n visual: false,\n mechanical: true,\n tags: ['engine'],\n })\n }\n const ec = engine ? engine.box.center : ([F - L * 0.2, clearance + 0.4, 0] as Vec3)\n const es = engine ? engine.box.size : ([0.8, 0.5, 0.6] as Vec3)\n\n if (!hasTankZone && !fuelless && kind !== 'bike') {\n const liters = { bike: 14, quad: 16, car: 55, tractor: 150, truck: 300, bus: 200, tank: 600, boat: 90, plane: 120, heli: 300 }[kind]\n const diesel = spec.fuel === 'diesel'\n add({\n id: 'fuel_tank',\n role: 'fuel_tank',\n name: t('mechanics.fuel_tank'),\n material: 'steel',\n box: { center: [R + L * 0.25, clearance + 0.12, W * 0.15], size: [Math.min(1, L * 0.2), 0.3, Math.min(0.6, W * 0.35)] },\n mass: 14 + liters * 0.8,\n hp: 25000 * armour,\n visual: false,\n mechanical: true,\n contains: { fluid: diesel ? 'diesel' : 'fuel', liters },\n explodes: diesel ? undefined : { energy: 1.2e6 * (liters / 55), radius: 5 + liters / 30, atC: 320 },\n ignitionC: diesel ? 330 : 260,\n tags: ['fuel_tank'],\n })\n }\n if (!hasRadiatorZone && engine && (kind === 'car' || kind === 'truck' || kind === 'bus' || kind === 'tractor' || kind === 'tank')) {\n add({\n id: 'radiator',\n role: 'radiator',\n name: t('mechanics.radiator'),\n material: 'aluminium',\n box: { center: [ec[0] + es[0] / 2 + 0.06, ec[1], 0], size: [0.1, Math.max(0.2, es[1] * 0.8), Math.max(0.3, es[2] * 1.1)] },\n mass: 8,\n hp: 3000,\n visual: false,\n mechanical: true,\n contains: { fluid: 'coolant', liters: 7, pressurized: true },\n tags: ['radiator'],\n })\n }\n if (mech.has('oil_pan') && !fuelless && kind !== 'bike' && engine) {\n add({\n id: 'oil_pan',\n role: 'oil_pan',\n name: t('mechanics.oil_pan'),\n material: 'aluminium',\n box: { center: [ec[0], Math.max(clearance * 0.5, ec[1] - es[1] / 2 - 0.02), ec[2]], size: [es[0] * 0.8, 0.1, es[2] * 0.8] },\n mass: 5,\n hp: 3000,\n visual: false,\n mechanical: true,\n contains: { fluid: 'oil', liters: kind === 'truck' || kind === 'bus' || kind === 'tank' ? 30 : 4.5 },\n tags: ['oil_pan'],\n })\n } else if (mech.has('oil_pan') && !fuelless && kind === 'bike') {\n add({\n id: 'oil_pan',\n role: 'oil_pan',\n name: t('mechanics.oil_pan'),\n material: 'aluminium',\n box: { center: [ec[0], Math.max(0.12, clearance * 0.5), 0], size: [0.3, 0.08, 0.2] },\n mass: 2,\n hp: 2000,\n visual: false,\n mechanical: true,\n contains: { fluid: 'oil', liters: 1.8 },\n tags: ['oil_pan'],\n })\n }\n const hasBatteryZone = parts.some((p) => p.role === 'battery')\n if (mech.has('battery') && !hasBatteryZone) {\n // under the hood at the corner of the engine bay; vehicles without a hood carry it on the frame\n const big = electric ? 1 : 0\n add({\n id: 'battery',\n role: 'battery',\n name: t('mechanics.battery'),\n material: 'plastic',\n box: { center: [ec[0] + es[0] * 0.3, ec[1] + es[1] * 0.3, Math.min(W * 0.28, ec[2] + es[2] * 0.6)], size: big ? [1.2, 0.18, 0.7] : [0.26, 0.2, 0.17] },\n mass: big ? 300 : 14,\n hp: big ? 6000 : 1500,\n ignitionC: 200,\n visual: !big,\n mechanical: true,\n tags: ['battery'],\n })\n }\n if (mech.has('alternator')) {\n add({\n id: 'alternator',\n role: 'alternator',\n name: t('mechanics.alternator'),\n material: 'aluminium',\n box: { center: [ec[0] + es[0] * 0.3, ec[1] - es[1] * 0.2, ec[2] - es[2] * 0.55], size: [0.16, 0.16, 0.16] },\n mass: 6,\n hp: 3000,\n visual: false,\n mechanical: true,\n tags: ['alternator'],\n })\n }\n if (mech.has('gearbox')) {\n add({\n id: 'gearbox',\n role: 'gearbox',\n name: t('mechanics.gearbox'),\n material: skin,\n box: { center: [ec[0] - es[0] / 2 - 0.3, ec[1] - es[1] * 0.2, ec[2]], size: [kind === 'bike' ? 0.3 : 0.6, 0.32, kind === 'bike' ? 0.22 : 0.36] },\n mass: kind === 'bike' ? 18 : 60,\n hp: 20000 * armour,\n visual: false,\n mechanical: true,\n tags: ['gearbox'],\n })\n }\n if (mech.has('brakes')) {\n add({\n id: 'brakes',\n role: 'brakes',\n name: t('mechanics.brakes'),\n material: 'steel',\n box: { center: [frontX, wheelR * 0.9, 0], size: [0.22, 0.2, Math.max(0.2, W * 0.78)] },\n mass: 14,\n hp: 8000,\n visual: false,\n mechanical: true,\n tags: ['brakes'],\n })\n }\n if (mech.has('steering')) {\n add({\n id: 'steering',\n role: 'steering',\n name: t('mechanics.steering'),\n material: 'steel',\n box: { center: [frontX - 0.2, wheelR * 1.15, 0], size: [0.14, 0.14, Math.max(0.2, W * 0.5)] },\n mass: 12,\n hp: 8000,\n visual: false,\n mechanical: true,\n tags: ['steering'],\n })\n }\n if (mech.has('shocks')) {\n add({\n id: 'shock_absorbers',\n role: 'shocks',\n name: t('mechanics.shock_absorbers'),\n material: 'steel',\n box: { center: [rearX + 0.1, wheelR * 1.1, 0], size: [0.18, 0.3, Math.max(0.2, W * 0.8)] },\n mass: 14,\n hp: 8000,\n visual: false,\n mechanical: true,\n tags: ['suspension'],\n })\n }\n // tow hitch: the spec flag, else the option, else a seeded choice by kind\n const chance = HITCH_CHANCE[kind]\n const seeded = strHash(`${c.seedKey ?? c.key}|hitch`) % 100 < chance\n const hitch = options.hitch ?? (typeof spec.hitch === 'boolean' ? spec.hitch : seeded)\n if (hitch && chance > 0) {\n add({\n id: 'tow_hitch',\n role: 'hitch',\n name: t('mechanics.tow_hitch'),\n material: 'steel',\n box: { center: [R - 0.14, clearance + 0.16, 0], size: [0.34, 0.12, 0.16] },\n mass: 9,\n hp: 6000,\n visual: true,\n mechanical: true,\n tags: ['hitch'],\n })\n }\n // mirrors: the housing and the arm seen on the front door, or generated on the glasshouse\n if (mech.has('mirrors')) {\n const gh = m.glasshouse as { fb?: number } | undefined\n const mx = gh?.fb != null ? gh.fb - 0.3 : kind === 'bike' ? F - L * 0.3 : F - L * 0.28\n const half = kind === 'bike' || kind === 'quad' ? 0.28 : W / 2 + 0.1\n const my = kind === 'bike' || kind === 'quad' ? (m.top ?? belt + 0.25) - 0.1 : belt + 0.12\n for (const s of [-1, 1] as const) {\n const door = zones.find((z) => z.type === 'door' && z.side === s && (z.mirrors ?? []).length)\n let box: LocalBox = { center: [mx, my, s * half], size: [0.14, 0.12, 0.2] }\n if (door) {\n // the objects of the vehicle: use the box that wraps them\n const bb = (door.mirrors as any[]).reduce(\n (acc: [number, number, number, number, number, number] | null, o: any) => {\n const w = new (kit.THREE.Box3 as any)().setFromObject(o)\n const inv = new (kit.THREE.Matrix4 as any)().copy(c.vehicle.matrixWorld).invert()\n w.applyMatrix4(inv)\n const cur: [number, number, number, number, number, number] = [w.min.x, w.max.x, w.min.y, w.max.y, w.min.z, w.max.z]\n if (!acc) return cur\n return [Math.min(acc[0], cur[0]), Math.max(acc[1], cur[1]), Math.min(acc[2], cur[2]), Math.max(acc[3], cur[3]), Math.min(acc[4], cur[4]), Math.max(acc[5], cur[5])]\n },\n null,\n )\n if (bb) box = { center: [(bb[0] + bb[1]) / 2, (bb[2] + bb[3]) / 2, (bb[4] + bb[5]) / 2], size: [Math.max(0.06, bb[1] - bb[0]), Math.max(0.06, bb[3] - bb[2]), Math.max(0.06, bb[5] - bb[4])] }\n }\n add({\n id: `mirror_${side(s)}`,\n role: 'mirror',\n name: t('mechanics.mirror', { side: t(`sides.${side(s)}`), sideM: t(`sides.${side(s)}M`) }),\n material: 'plastic',\n box,\n mass: 1.1,\n hp: 1500,\n ignitionC: 400,\n visual: true,\n mechanical: true,\n tags: ['mirror', side(s)],\n })\n }\n }\n // pillars of a car: welded to the frame and to the roof\n const gh = m.glasshouse as { fb?: number; rb?: number; roof?: number; belt?: number; Wg?: number } | undefined\n if (kind === 'car' && gh && gh.fb != null && gh.rb != null && gh.roof != null && zones.some((z) => z.type === 'roof')) {\n const b0 = gh.belt ?? belt\n const hw = (gh.Wg ?? W * 0.9) / 2\n for (const [name, x] of [\n ['pillar_a', gh.fb - 0.12],\n ['pillar_c', gh.rb + 0.12],\n ] as const) {\n for (const s of [-1, 1] as const) {\n add({\n id: `${name}_${side(s)}`,\n role: 'pillar',\n name: t(`mechanics.${name}`, { side: t(`sides.${side(s)}`), sideM: t(`sides.${side(s)}M`) }),\n material: 'steel',\n box: { center: [x, (b0 + gh.roof) / 2, s * (hw - 0.04)], size: [0.07, Math.max(0.2, gh.roof - b0), 0.07] },\n mass: 7,\n hp: 40000 * armour,\n visual: false,\n mechanical: true,\n tags: ['pillar', side(s)],\n })\n }\n }\n }\n void heightCenter\n\n // ---- joints --------------------------------------------------------------------------------------------------------------------------------\n const has = (id: string): boolean => ids.has(id)\n const roofPart = parts.find((p) => p.role === 'roof')\n for (const p of parts) {\n if (p.id === hubId) continue\n switch (p.role) {\n case 'door':\n case 'hood':\n case 'lid':\n join(p.id, hubId, 'hinge')\n break\n case 'fender':\n join(p.id, hubId, 'bolt')\n break\n case 'bumper':\n case 'light':\n case 'battery':\n case 'hitch':\n case 'steering':\n case 'shocks':\n case 'engine':\n case 'radiator':\n case 'fuel_tank':\n case 'brakes':\n join(p.id, hubId, 'bolt')\n break\n case 'rim':\n join(p.id, hubId, 'bolt')\n break\n case 'glass':\n join(p.id, hubId, 'glue')\n break\n case 'tyre': {\n const rim = parts.find((q) => q.role === 'rim' && q.zoneId === p.zoneId)\n if (rim) join(p.id, rim.id, 'clip')\n break\n }\n case 'mirror': {\n const door = parts.find((q) => q.role === 'door' && q.tags.includes(p.tags[1] ?? ''))\n join(p.id, door ? door.id : hubId, 'bolt', 0.4)\n break\n }\n case 'alternator':\n case 'gearbox':\n case 'oil_pan':\n join(p.id, engine ? engine.id : hubId, 'bolt')\n break\n case 'pillar':\n join(p.id, hubId, 'weld')\n if (roofPart) join(roofPart.id, p.id, 'weld')\n break\n case 'roof':\n if (!parts.some((q) => q.role === 'pillar')) join(p.id, hubId, 'weld')\n break\n case 'panel':\n case 'other':\n join(p.id, hubId, p.tags.includes('left') || p.tags.includes('right') ? 'weld' : 'bolt')\n break\n default:\n break\n }\n }\n void has\n return { parts, joints, hub: hubId, hitch }\n}\n","/**\n * What the player sees of the destruction model: hinged door and lid panels, the battery, tow hitch and mirrors that the zones do not draw,\n * bullet holes, lights out, tyres that melt and the parts that come off and fall.\n *\n * It only uses the kit (`kit._` helpers such as `fling`, `cutPanel`, `pivotOf`), so a part that comes off is flung with the same ballistic\n * animation the explosion uses, and a vehicle that is rebuilt (`reset`) gets a fresh set of meshes.\n */\nimport type { VehicleContext, VehicleKit } from '../api'\nimport type { PartDef, VehicleModel } from './model'\n\ntype Obj = any\n\nexport interface DetachOptions {\n /** `tool` drops the part gently, `break` throws it. */\n by: 'tool' | 'break'\n /** Impulse direction in `c.vehicle` coordinates (default: away from the vehicle centre). */\n away?: [number, number, number]\n}\n\nexport class VehicleVisuals {\n readonly kit: VehicleKit\n readonly c: VehicleContext\n readonly model: VehicleModel\n private readonly I: Record<string, any>\n private readonly THREE: any\n private readonly byId = new Map<string, PartDef>()\n /** Meshes created for parts the vehicle does not draw (battery, hitch, generated mirrors). */\n private readonly extra = new Map<string, Obj[]>()\n /** Hinged panels created for the doors and the lid, by part id. */\n readonly plates = new Map<string, Obj>()\n private readonly gone = new Set<string>()\n private lightsOn = true\n readonly hood: { id: string; open: number; sign: number } | null\n\n constructor(kit: VehicleKit, c: VehicleContext, model: VehicleModel) {\n this.kit = kit\n this.c = c\n this.model = model\n this.I = (kit as any)._\n this.THREE = kit.THREE\n for (const p of model.parts) this.byId.set(p.id, p)\n c.root.updateMatrixWorld(true)\n this.hood = this.nameHood()\n for (const p of model.parts) {\n if (p.role === 'door' || p.role === 'lid') this.makePlate(p)\n else if (p.role === 'mirror' && !this.mirrorObjects(p).length) this.makeMirror(p)\n else if (p.role === 'battery' && p.mechanical) this.makeBattery(p)\n else if (p.role === 'hitch') this.makeHitch(p)\n }\n }\n\n // ---- lookups -----------------------------------------------------------------------------------------------------------------------------\n private zone(p: PartDef): any {\n return p.zoneId ? (this.kit.zonesOf(this.c) as any[]).find((z) => z.id === p.zoneId) : undefined\n }\n private nameHood() {\n const c: any = this.c\n if (!c.hood) return null\n const z = (this.kit.zonesOf(this.c) as any[]).find((q) => q.type === 'hood')\n const id = z ? z.id : this.model.parts.find((p) => p.role === 'hood')?.id\n if (!id) return null\n c.hood.piv.name = id\n return { id, open: c.hood.open as number, sign: (c.hood.sign || 1) as number }\n }\n private mirrorObjects(p: PartDef): Obj[] {\n const own = this.extra.get(p.id)\n if (own) return own\n const door = (this.kit.zonesOf(this.c) as any[]).find((z) => z.type === 'door' && p.tags.includes(z.side < 0 ? 'left' : 'right') && (z.mirrors ?? []).length)\n return door ? (door.mirrors as Obj[]).filter((o) => o.parent) : []\n }\n\n /** The objects that make a part, as they are now (empty when the part has no visible mesh or it has already come off). */\n objectsOf(partId: string): Obj[] {\n const p = this.byId.get(partId)\n if (!p || this.gone.has(partId)) return []\n const z = this.zone(p)\n switch (p.role) {\n case 'door':\n case 'lid': {\n const g = this.plates.get(p.id)\n return g && g.parent ? [g] : []\n }\n case 'hood':\n return (this.c as any).hood && this.hood?.id === p.id ? [(this.c as any).hood.piv] : []\n case 'bumper':\n return z ? (z.owned as Obj[]).filter((o) => o.parent) : []\n case 'light':\n return z ? (z.lights as any[]).map((L) => L.group).filter((g) => g && g.parent) : []\n case 'rim':\n return z ? (z.wheels as Obj[]).filter((o) => o.parent) : []\n case 'tyre': {\n const zz = this.zone(p)\n return zz ? (zz.wheels as Obj[]).flatMap((w) => (this.I.tireMeshes(w) as Obj[]).filter((m) => m.parent)) : []\n }\n case 'mirror':\n return this.mirrorObjects(p)\n default:\n return (this.extra.get(p.id) ?? []).filter((o) => o.parent)\n }\n }\n\n // ---- generated meshes --------------------------------------------------------------------------------------------------------------------\n private paint(): any {\n return this.c.paint(this.c.meta.color || '#777777')\n }\n private box(w: number, h: number, d: number, mat: any, x: number, y: number, z: number, parent?: Obj): Obj {\n const m = new this.THREE.Mesh(new this.THREE.BoxGeometry(w, h, d), mat)\n m.position.set(x, y, z)\n m.castShadow = true\n ;(parent ?? this.c.vehicle).add(m)\n return m\n }\n private surface(axis: 'x' | 'z', sign: number, B: any, samples: Array<[number, number]>): number | null {\n // ray from outside towards the vehicle at a few points of the panel; the median hit is the skin\n const V3 = this.THREE.Vector3\n const hits: number[] = []\n const far = 3\n for (const [u, v] of samples) {\n const o = axis === 'z' ? new V3(u, v, sign * (Math.max(Math.abs(B.z0), Math.abs(B.z1)) + 1)) : new V3(sign * (Math.max(Math.abs(B.x0), Math.abs(B.x1)) + 1), u, v)\n const d = axis === 'z' ? new V3(0, 0, -sign) : new V3(-sign, 0, 0)\n const h = this.I.probe(this.c, o, d, far)\n if (h) hits.push(axis === 'z' ? h.p.z : h.p.x)\n }\n if (!hits.length) return null\n hits.sort((a, b) => a - b)\n return hits[Math.floor(hits.length / 2)]\n }\n /** A thin panel hinged on the door (front edge) or the lid (top edge), over a dark recess so the opening shows when it swings. */\n private makePlate(p: PartDef): void {\n const z = this.zone(p)\n if (!z) return\n const B = z.box\n const THREE = this.THREE\n const mats = this.I.MATERIALS\n const grid = (a0: number, a1: number, b0: number, b1: number): Array<[number, number]> => {\n const out: Array<[number, number]> = []\n for (const fa of [0.25, 0.5, 0.75]) for (const fb of [0.3, 0.7]) out.push([a0 + (a1 - a0) * fa, b0 + (b1 - b0) * fb])\n return out\n }\n if (p.role === 'door') {\n const s = z.side < 0 ? -1 : 1\n const sk = this.surface('z', s, B, grid(B.x0, B.x1, B.y0, B.y1))\n if (sk == null) return\n const len = B.x1 - B.x0 - 0.06\n const hgt = B.y1 - B.y0 - 0.1\n const hingeFront = z.hinge !== 'rear'\n const hx = hingeFront ? B.x1 - 0.03 : B.x0 + 0.03\n const cy = (B.y0 + B.y1) / 2\n const recess = this.box(len - 0.04, hgt - 0.04, 0.01, mats.dark, (B.x0 + B.x1) / 2, cy, sk + s * 0.004)\n recess.userData.noFollow = true\n const piv = new THREE.Group()\n piv.name = p.id\n piv.position.set(hx, cy, sk + s * 0.016)\n piv.userData.rigid = true\n this.c.vehicle.add(piv)\n this.box(len, hgt, 0.022, this.paint(), hingeFront ? -len / 2 : len / 2, 0, 0, piv)\n this.plates.set(p.id, piv)\n this.extra.set(`recess_${p.id}`, [recess])\n } else {\n // the lid is the rear panel: it hinges on its top edge and lifts away from the body\n const sk = this.surface('x', -1, B, grid(B.y0, B.y1, B.z0, B.z1))\n if (sk == null) return\n const wy = B.y1 - B.y0 - 0.1\n const wz = B.z1 - B.z0 - 0.1\n const recess = this.box(0.01, wy - 0.04, wz - 0.04, mats.dark, sk + 0.004, (B.y0 + B.y1) / 2, 0)\n recess.userData.noFollow = true\n const piv = new THREE.Group()\n piv.name = p.id\n piv.position.set(sk - 0.016, B.y1 - 0.05, 0)\n piv.userData.rigid = true\n this.c.vehicle.add(piv)\n this.box(0.022, wy, wz, this.paint(), 0, -wy / 2, 0, piv)\n this.plates.set(p.id, piv)\n this.extra.set(`recess_${p.id}`, [recess])\n }\n }\n private makeMirror(p: PartDef): void {\n const [cx, cy, cz] = p.box.center\n const s = cz < 0 ? -1 : 1\n const mats = this.I.MATERIALS\n const g = new this.THREE.Group()\n g.name = `obj_${p.id}`\n g.position.set(cx, cy, cz)\n this.c.vehicle.add(g)\n this.box(0.05, 0.04, 0.1, mats.dark, 0, -0.04, -s * 0.07, g)\n const housing = this.box(0.1, 0.12, 0.05, mats.plastic ?? mats.dark, 0, 0, s * 0.02, g)\n housing.userData.mirrorHousing = true\n const glass = this.box(0.095, 0.1, 0.006, mats.chrome ?? mats.dark, 0, 0, s * 0.048, g)\n glass.userData.mirrorGlass = true\n g.userData.rigid = true\n this.extra.set(p.id, [g])\n }\n private makeBattery(p: PartDef): void {\n const mats = this.I.MATERIALS\n const g = new this.THREE.Group()\n g.position.set(...p.box.center)\n this.c.vehicle.add(g)\n this.box(p.box.size[0], p.box.size[1] * 0.85, p.box.size[2], this.I.makeMaterial('#2b2f33', { roughness: 0.6 }), 0, 0, 0, g)\n this.box(0.035, 0.04, 0.035, mats.chrome ?? mats.dark, -p.box.size[0] * 0.3, p.box.size[1] * 0.5, 0, g)\n this.box(0.035, 0.04, 0.035, this.I.makeMaterial('#b3261e', { roughness: 0.5 }), p.box.size[0] * 0.3, p.box.size[1] * 0.5, 0, g)\n g.userData.noFollow = true\n this.extra.set(p.id, [g])\n }\n private makeHitch(p: PartDef): void {\n const mats = this.I.MATERIALS\n const g = new this.THREE.Group()\n g.position.set(...p.box.center)\n this.c.vehicle.add(g)\n this.box(0.3, 0.05, 0.08, mats.steel, 0, 0, 0, g)\n const ball = new this.THREE.Mesh(new this.THREE.SphereGeometry(0.035, 12, 8), mats.chrome ?? mats.steel)\n ball.position.set(-0.12, 0.06, 0)\n g.add(ball)\n g.userData.noFollow = true\n this.extra.set(p.id, [g])\n }\n\n // ---- marks -------------------------------------------------------------------------------------------------------------------------------\n /** A bullet hole: a dark disc lying on the surface at `point` (`c.vehicle` coordinates). */\n holeDecal(point: [number, number, number], normal: [number, number, number], diameter: number): void {\n const THREE = this.THREE\n const m = new THREE.Mesh(new THREE.CircleGeometry(Math.max(0.006, diameter / 2), 10), this.I.MATERIALS.dark)\n const n = new THREE.Vector3(...normal)\n m.position.set(...point).addScaledVector(n, 0.004)\n m.lookAt(m.position.clone().add(n))\n m.userData.decal = true\n m.userData.noFollow = true\n m.raycast = () => {}\n this.c.vehicle.add(m)\n }\n spark(point: [number, number, number], dir: [number, number, number], count = 8): void {\n const V3 = this.THREE.Vector3\n this.I.burst(this.c, 'spark', this.c.toEffects(new V3(...point)), count, { dir: this.c.dirToEffects(new V3(...dir).negate()), speed: 2.5, spread: 1.4 })\n }\n\n // ---- states ------------------------------------------------------------------------------------------------------------------------------\n /** Headlights and taillights on or off (a dead battery or a missing alternator). */\n setLights(on: boolean): void {\n if (on === this.lightsOn) return\n this.lightsOn = on\n const dark = this.I.MATERIALS.bulbBroken\n for (const L of this.c.lights as any[]) {\n if (L.broken) continue\n for (const h of L.halo ?? []) h.visible = on\n for (const m of L.inner ?? []) {\n if (on) {\n if (m.userData.litMat) m.material = m.userData.litMat\n } else {\n if (!m.userData.litMat) m.userData.litMat = m.material\n m.material = dark\n }\n }\n }\n }\n /** The lens of a light breaks and its unit stays (damaged) or goes (destroyed). */\n breakLight(p: PartDef, gone: boolean): void {\n const z = this.zone(p)\n if (!z) return\n for (const L of z.lights as any[]) {\n this.kit.breakLight(this.c, L, new this.THREE.Vector3(p.box.center[0] > 0 ? -1 : 1, 0, 0))\n if (gone) {\n if (L.group) L.group.visible = false\n L.broken = 'gone'\n }\n }\n if (gone) this.gone.add(p.id)\n }\n /** Glass: cracks (laminated) or shatters (tempered); returns whether it broke. */\n hitGlass(p: PartDef, point: [number, number, number], dir: [number, number, number], force: number): boolean {\n const z = this.zone(p)\n if (!z) return false\n const V3 = this.THREE.Vector3\n const list = (z.glass as Obj[]).filter((g) => g.parent && g.visible)\n if (!list.length) return false\n const pt = new V3(...point)\n let best = list[0]\n let bd = Infinity\n for (const g of list) {\n g.geometry.computeBoundingBox()\n const bb = g.geometry.boundingBox.clone().applyMatrix4(g.matrix)\n const d = bb.distanceToPoint(pt)\n if (d < bd) {\n bd = d\n best = g\n }\n }\n this.kit.hitGlass(this.c, best, pt, new V3(...dir), force)\n return !!best.userData.glass?.broken\n }\n glassBreak(p: PartDef): void {\n const z = this.zone(p)\n if (!z) return\n for (const g of z.glass as Obj[]) if (g.parent && g.visible) this.I.glassBand(this.c, z, g, 4)\n this.gone.add(p.id)\n }\n tyreFlat(p: PartDef, k: number): void {\n const z = this.zone(p)\n if (!z) return\n for (const w of z.wheels as Obj[]) if (w.parent) this.I.flattenTire(w, k)\n }\n /** Burning rubber: the tyre sags and goes black as it melts. */\n tyreMelt(p: PartDef, melt: number): void {\n const z = this.zone(p)\n if (!z) return\n for (const w of z.wheels as Obj[]) {\n if (!w.parent) continue\n for (const m of this.I.tireMeshes(w) as Obj[]) {\n if (!m.userData.charred) {\n m.userData.charred = true\n m.material = this.I.BURNT_RUB\n }\n }\n this.I.flattenTire(w, Math.min(0.5, 0.12 + 0.38 * melt))\n }\n }\n /** Moves the panel of a lost zone out of the body (the kit's torn-off look). */\n tearOff(p: PartDef): void {\n const z = this.zone(p)\n if (!z) return\n const dirty = new Set<Obj>()\n try {\n if (z.type === 'hood') this.I.hoodBand(this.c, z, 4, dirty)\n else this.I.panelBand(this.c, z, 4, dirty)\n } catch {\n // a zone with nothing to cut\n }\n dirty.forEach((msh) => {\n const g = msh.geometry\n if (g.userData.crease || !g.index) this.I.crease(g, 42)\n else g.computeVertexNormals()\n g.computeBoundingSphere()\n g.computeBoundingBox()\n })\n this.gone.add(p.id)\n }\n\n // ---- parts coming off --------------------------------------------------------------------------------------------------------------------\n private outward(p: PartDef, away?: [number, number, number]): any {\n const V3 = this.THREE.Vector3\n if (away) return new V3(...away).normalize()\n const m = this.c.meta\n const cx = ((m.front ?? 1) + (m.rear ?? -1)) / 2\n const v = new V3(p.box.center[0] - cx, 0, p.box.center[2])\n if (v.lengthSq() < 1e-4) v.set(0, 0, 1)\n return v.normalize()\n }\n private fling(obj: Obj, v: any, w: any, trail: number): void {\n const piece = this.I.fling(this.c, obj, v, w)\n if (piece) piece.trail = trail\n }\n /** Brings a part off the vehicle and throws it. Returns whether something visible moved. */\n detach(p: PartDef, o: DetachOptions): boolean {\n if (this.gone.has(p.id)) return false\n const V3 = this.THREE.Vector3\n const c: any = this.c\n const out = this.outward(p, o.away)\n const gentle = o.by === 'tool'\n const speed = gentle ? 0.7 : 3.2\n const up = gentle ? 0.4 : 3.5\n const vel = (k = 1) => c.dirToEffects(new V3(out.x * speed * k, up * k, out.z * speed * k))\n const spin = () => new V3((gentle ? 0.3 : 4) * (out.z || 1), (gentle ? 0.2 : 2) * (out.x || 1), (gentle ? 0.3 : 5) * (out.x || -1))\n const trail = 0\n let moved = false\n this.gone.add(p.id)\n switch (p.role) {\n case 'door':\n case 'lid':\n case 'mirror':\n case 'battery':\n case 'hitch':\n case 'light': {\n if (p.role === 'battery') {\n // out of the engine bay: the hood pops a little so it is seen leaving\n if (c.hood) c.hood.latch = Math.max(c.hood.latch, 0.35)\n }\n for (const obj of this.objectsOfGone(p)) {\n this.fling(obj, p.role === 'battery' ? c.dirToEffects(new V3(0.6, 4.2, out.z * 1.2)) : vel(), spin(), trail)\n moved = true\n }\n if (p.role === 'light') {\n const z = this.zone(p)\n for (const L of (z?.lights ?? []) as any[]) {\n L.broken = L.broken || true\n for (const h of L.halo ?? []) h.visible = false\n }\n }\n break\n }\n case 'hood':\n if (c.hood && this.hood?.id === p.id) {\n this.fling(c.hood.piv, c.dirToEffects(new V3(1.2, 6.5, 0)), new V3(0, 0.5, 3), trail)\n c.hood = null\n c.parts.forEach((q: any) => {\n if (q.kind === 'hood') q.done = true\n })\n moved = true\n }\n break\n case 'bumper': {\n const z = this.zone(p)\n const objs = this.objectsOfGone(p)\n const todo = new Set<Obj>()\n for (const obj of objs) todo.add(obj.parent && obj.parent !== c.vehicle && obj.parent.userData.rigid ? obj.parent : obj)\n if (!todo.size && z) for (const q of this.cutZone(z)) todo.add(q)\n for (const obj of todo) {\n const di = c.deform.indexOf(obj)\n if (di >= 0) c.deform.splice(di, 1)\n this.fling(obj, vel(), spin(), trail)\n moved = true\n }\n break\n }\n case 'fender': {\n const z = this.zone(p)\n if (z) for (const q of this.cutZone(z)) {\n this.fling(q, vel(), spin(), trail)\n moved = true\n }\n break\n }\n case 'rim': {\n const z = this.zone(p)\n for (const w of this.objectsOfGone(p)) {\n const i = c.wheels.indexOf(w)\n if (i >= 0) c.wheels.splice(i, 1)\n c.parts.forEach((q: any) => {\n if (q.obj === w) q.done = true\n })\n c.spin = c.spin.filter((s: any) => s.o !== w)\n this.fling(w, c.dirToEffects(new V3(out.x * speed, up * 0.6, out.z * speed * 1.3)), new V3(0, 0, gentle ? 0.4 : 6 * (out.z || 1)), trail)\n this.sag(w)\n moved = true\n }\n // the tyre went with the rim unless it was already off\n const tp = this.model.parts.find((q) => q.role === 'tyre' && q.zoneId === p.zoneId)\n if (tp) this.gone.add(tp.id)\n void z\n break\n }\n case 'tyre': {\n const z = this.zone(p)\n const meshes = z ? (z.wheels as Obj[]).flatMap((w) => (this.I.tireMeshes(w) as Obj[]).filter((m) => m.parent)) : []\n if (meshes.length) {\n const w = meshes[0].parent\n const g = new this.THREE.Group()\n w.add(g)\n for (const m of meshes) g.attach(m)\n this.fling(g, vel(), new V3(0, 0, gentle ? 0.5 : 8), trail)\n moved = true\n }\n break\n }\n default:\n break\n }\n return moved\n }\n /** Objects of a part that has just been marked gone (the lookup in `objectsOf` skips them). */\n private objectsOfGone(p: PartDef): Obj[] {\n this.gone.delete(p.id)\n const r = this.objectsOf(p.id)\n this.gone.add(p.id)\n return r\n }\n private cutZone(z: any): Obj[] {\n const I = this.I\n const B = z.box\n const a = I.axisOf(z.dir)\n const ax = [0, 1, 2].filter((k) => k !== a)\n const u0 = I.boxLo(B, ax[0])\n const u1 = I.boxHi(B, ax[0])\n const v0 = I.boxLo(B, ax[1])\n const v1 = I.boxHi(B, ax[1])\n const mg = Math.min(0.05, (u1 - u0) * 0.08, (v1 - v0) * 0.08)\n const dirty = new Set<Obj>()\n let pcs: Array<{ mesh?: Obj }> = []\n try {\n pcs = I.cutPanel(this.c, z, [u0 + mg, u1 - mg, v0 + mg, v1 - mg], true, dirty)\n } catch {\n pcs = []\n }\n dirty.forEach((msh) => {\n const g = msh.geometry\n if (g.userData.crease || !g.index) I.crease(g, 42)\n else g.computeVertexNormals()\n g.computeBoundingSphere()\n g.computeBoundingBox()\n })\n return pcs.map((q) => q.mesh).filter((m): m is Obj => !!m)\n }\n /** The corner of a vehicle that lost a wheel settles on its brake: tilt and lower the body. */\n private sag(w: Obj): void {\n const c: any = this.c\n const m = c.meta\n if (m.kind === 'plane' || m.kind === 'heli' || m.kind === 'boat') return\n const r = w.userData.r || 0.3\n const cx = ((m.front ?? 1) + (m.rear ?? -1)) / 2\n const dx = w.position.x - cx\n const dz = w.position.z\n const d = r * 0.8\n const clamp = (v: number) => Math.max(-0.25, Math.min(0.25, v))\n if (Math.abs(dx) > 0.2) c.vehicle.rotation.z += clamp(-d / (2 * dx))\n if (Math.abs(dz) > 0.2) c.vehicle.rotation.x += clamp(d / (2 * dz))\n c.vehicle.position.y -= d / 4\n }\n}\n","/** Open and close clips for the doors, the hood and the trunk lid, in the `AnimationClipSpec` of the contracts. */\nimport type { AnimationClipSpec, AnimationPose } from '@adatechnology/game-contracts'\nimport type { VehicleContext, VehicleKit } from '../api'\nimport type { VehicleModel } from './model'\nimport type { VehicleVisuals } from './visual'\n\n/** Seconds an opening or closing takes. */\nconst DURATION = 1.2\n\nexport function createVehicleClips(model: VehicleModel, vis: VehicleVisuals | null, kit: VehicleKit, c: VehicleContext): AnimationClipSpec[] {\n const zones = kit.zonesOf(c) as any[]\n const doors: Record<string, AnimationPose> = {}\n const hood: Record<string, AnimationPose> = {}\n const lid: Record<string, AnimationPose> = {}\n for (const p of model.parts) {\n if (p.role === 'door') {\n const z = zones.find((q) => q.id === p.zoneId)\n if (!z || (vis && !vis.plates.has(p.id))) continue\n const sgn = z.hinge === 'rear' ? -1 : 1\n doors[p.id] = { rotation: [0, (z.side < 0 ? -1 : 1) * sgn * 1.15, 0] }\n } else if (p.role === 'lid' && (!vis || vis.plates.has(p.id))) lid[p.id] = { rotation: [0, 0, -1.15] }\n else if (p.role === 'hood' && (!vis || vis.hood?.id === p.id)) hood[p.id] = { rotation: [0, 0, (vis?.hood?.open ?? (c as any).hood?.open ?? 1) * (vis?.hood?.sign ?? (c as any).hood?.sign ?? 1)] }\n }\n const clips: AnimationClipSpec[] = []\n const pair = (name: string, poses: Record<string, AnimationPose>, latch: string): void => {\n if (!Object.keys(poses).length) return\n const closed: Record<string, AnimationPose> = {}\n for (const k of Object.keys(poses)) closed[k] = { rotation: [0, 0, 0] }\n clips.push({\n id: `open_${name}`,\n duration: DURATION,\n keys: [{ t: 0, parts: closed }, { t: DURATION, parts: poses }],\n events: [{ t: 0.1, type: 'sound', data: { key: `${latch}_latch` } }],\n })\n clips.push({\n id: `close_${name}`,\n duration: DURATION,\n keys: [{ t: 0, parts: poses }, { t: DURATION, parts: closed }],\n events: [{ t: DURATION, type: 'sound', data: { key: `${latch}_shut` } }],\n })\n }\n pair('doors', doors, 'door')\n pair('hood', hood, 'hood')\n pair('trunk', lid, 'trunk')\n return clips\n}\n","import type { VehicleContext, VehicleKit } from '../api'\nimport type { BuildState } from '../api'\n\nexport interface VehicleItemOptions {\n state?: BuildState\n /** Build in the light mode of the kit (`kit.lod`): fewer segments and no interior, for crowds and for budgets. Default off. */\n lod?: boolean\n /** A registered damage scenario (id or name, e.g. the fleet's `burnt`) built into the vehicle, through `kit.build(key, state, { scenario })`. */\n scenario?: string\n}\n\nexport interface VehicleItem {\n /** Add this to the scene: origin at the centre of the footprint on the floor, front facing +z. */\n root: any\n /** The built vehicle inside it. */\n vehicle: VehicleContext\n}\n\n/**\n * Builds vehicle `key` as an item for a viewer that expects the origin at the centre of the footprint on the floor and the front facing +z\n * (the test room). The vehicle itself keeps the kit axes (+x front) inside a turned, centred group. Pass `root` as `frame` to\n * `createVehicleDestructible` so `describe()` answers in the item's space.\n */\nexport function buildVehicleItem(kit: VehicleKit, key: string, options: VehicleItemOptions = {}): VehicleItem {\n const THREE = kit.THREE\n const zoneState = options.scenario != null ? { scenario: options.scenario } : undefined\n const vehicle = options.lod ? kit.build(key, options.state ?? 'intact', zoneState, { lod: true }) : kit.build(key, options.state ?? 'intact', zoneState)\n const m = vehicle.meta\n const root = new THREE.Group()\n root.name = key\n const turn = new THREE.Group()\n turn.rotation.y = -Math.PI / 2\n root.add(turn)\n vehicle.root.position.x = -(((m.front ?? 1) + (m.rear ?? -1)) / 2)\n turn.add(vehicle.root)\n root.userData.vehicle = vehicle\n return { root, vehicle }\n}\n"],"mappings":"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","names":["side","document","n","out","g","r2","document","side","document","a","b","e","side","document","d","q","slug","v","document","document","kindOf","options","kg","gh","clamp","side"]}