Factory function to create Bomb Barrel in your world.

export function createAsset(THREE, options = {}) {
  const root = new THREE.Group();
  root.name = options.name ?? "Bomb Barrel";
  root.userData = { assetRole: "item", generatedBy: "public asset batch" };
  const cache = new Map();
  function mat(def) {
    const key = [def.color, def.opacity ?? 1, def.metalness ?? 0, def.roughness ?? 0.72, def.emissive ?? '', def.emissiveIntensity ?? 0].join('|');
    if (cache.has(key)) return cache.get(key);
    const material = new THREE.MeshStandardMaterial({ color: def.color, roughness: def.roughness ?? 0.72, metalness: def.metalness ?? 0, opacity: def.opacity ?? 1, transparent: (def.opacity ?? 1) < 1, emissive: def.emissive ?? '#000000', emissiveIntensity: def.emissiveIntensity ?? 0 });
    cache.set(key, material);
    return material;
  }
  const defs = [{"id":"barrel_body","name":"Bomb Barrel Body","position":[0,0.9,0],"boxes":[{"name":"core","size":[1.15,1.35,1.15],"position":[0,0,0],"color":"#b91c1c"},{"name":"top cap","size":[1.05,0.18,1.05],"position":[0,0.76,0],"color":"#7f1d1d"},{"name":"bottom cap","size":[1.05,0.18,1.05],"position":[0,-0.76,0],"color":"#7f1d1d"},{"name":"warning mark","size":[0.42,0.42,0.08],"position":[0,0.1,0.58],"color":"#facc15","emissive":"#f59e0b","emissiveIntensity":0.15}]},{"id":"metal_bands","name":"Metal Bands","position":[0,0.9,0],"boxes":[{"name":"upper band","size":[1.28,0.16,1.24],"position":[0,0.45,0],"color":"#374151","metalness":0.3},{"name":"lower band","size":[1.28,0.16,1.24],"position":[0,-0.45,0],"color":"#374151","metalness":0.3}]},{"id":"fuse","name":"Fuse","position":[0,1.72,0],"boxes":[{"name":"cord","size":[0.18,0.48,0.18],"position":[0,0,0],"color":"#2f1f13"},{"name":"tip","size":[0.16,0.16,0.16],"position":[0,0.31,0],"color":"#111827"}]},{"id":"spark","name":"Fuse Spark","position":[0,2.1,0],"boxes":[{"name":"core","size":[0.2,0.2,0.2],"position":[0,0,0],"color":"#fef08a","emissive":"#facc15","emissiveIntensity":0.8},{"name":"flare","size":[0.42,0.08,0.08],"position":[0,0,0],"color":"#fb923c","emissive":"#f97316","emissiveIntensity":0.7},{"name":"vertical","size":[0.08,0.42,0.08],"position":[0,0,0],"color":"#fb923c","emissive":"#f97316","emissiveIntensity":0.7}]},{"id":"smoke_puffs","name":"Smoke Puffs","position":[0,1.95,0],"boxes":[{"name":"smoke A","size":[0.28,0.28,0.28],"position":[-0.28,0.08,0],"color":"#d1d5db","opacity":0.72},{"name":"smoke B","size":[0.34,0.34,0.34],"position":[0.15,0.22,0.05],"color":"#e5e7eb","opacity":0.68},{"name":"smoke C","size":[0.22,0.22,0.22],"position":[0.42,-0.02,-0.02],"color":"#cbd5e1","opacity":0.62}]},{"id":"debris_bits","name":"Debris Bits","position":[0,1,0],"boxes":[{"name":"debris L","size":[0.18,0.18,0.18],"position":[-0.72,0.1,0.2],"color":"#7f1d1d"},{"name":"debris R","size":[0.18,0.18,0.18],"position":[0.72,0.2,-0.05],"color":"#991b1b"},{"name":"debris back","size":[0.14,0.14,0.14],"position":[0.15,0.42,-0.66],"color":"#374151"}]}];
  for (const def of defs) {
    const group = new THREE.Group();
    group.name = def.name;
    group.position.set(def.position[0], def.position[1], def.position[2]);
    group.userData.partId = def.id;
    group.userData.editable = true;
    group.userData.selection = { id: def.id, kind: 'asset', label: def.name };
    for (const item of def.boxes) {
      const mesh = new THREE.Mesh(new THREE.BoxGeometry(item.size[0], item.size[1], item.size[2]), mat(item));
      mesh.name = item.name;
      mesh.position.set(item.position[0], item.position[1], item.position[2]);
      mesh.castShadow = true;
      mesh.receiveShadow = true;
      group.add(mesh);
    }
    root.add(group);
  }
  const scale = Number(options.scale ?? 1);
  root.scale.setScalar(Number.isFinite(scale) ? scale : 1);
  return root;
}