# Optibeam Octax 6.0 Ambient — FS25-prefab

NorthernLight Modding · 1.0.0.1

Byggdel för fordonsmoddare, inte en separat köpbar mod.

1. Säkerhetskopiera fordonet. Kopiera hela `assets/optibeamOctax60` till samma sökväg i fordonsmodden, bredvid modDesc.xml. Modell, shapes, XML och texturer behövs tillsammans.
2. Skapa en tom TransformGroup `nlmLampMount01` under rätt karossdel i GIANTS Editor. Placera dess origo på monteringsytan. Skala 1, +Y upp, +Z framåt. Bakåtriktad montering använder Y-rotation 180°. Kontrollera hela fästfotens kontakt.
3. Kopiera gruppens verkliga **Index Path** och använd den i en unik i3dMapping i fordonsfilens befintliga i3dMappings. Exempelindexet nedan måste bytas.
4. Lägg sharedLight-raden i befintlig lights-sektion och välj önskad XML ur tabellen. SharedLight laddar modellen; importera inte samtidigt en extra synlig kopia.
5. lampPivot vrider hus, optik och ljuskägla kring sidobulten medan fästet står stilla. Exemplet lutar 12° nedåt. Kontrollera frigång. Fotens undersida ligger vid Y=0 i neutralläge.
6. Ladda fordonet i FS25. Första F tänder position, typ 0. Arbetsljus fram använder typ 2, bak typ 1. Värdfordonet behöver motsvarande ljuslägen. Ingen Lua eller extra modDesc-/fordonstypregistrering behövs.

```xml
<!-- Add inside the vehicle's EXISTING <lights> section -->
<sharedLight linkNode="nlmLampMount01" filename="assets/optibeamOctax60/optibeamOctax60_amber_front.xml">
    <rotationNode name="lampPivot" rotation="12 0 0"/>
</sharedLight>

<!-- Add inside the EXISTING <i3dMappings> section.
     0>0|14|0 IS AN EXAMPLE. Replace it with your actual mount Index Path. -->
<i3dMapping id="nlmLampMount01" node="0>0|14|0"/>
```

Om arbetsljuslägen saknas, komplettera befintliga lights/states. Bevara övriga grupper. Skapa inte dubbla eller nästlade lights/states. Komplett exempel för ett enkelt värdfordon:

```xml
<!-- Only for a vehicle without working work-light states:
     extend its EXISTING <lights><states> to include these groups. -->
<states>
    <state lightTypes="0"/>
    <state lightTypes="0 2"/>
    <state lightTypes="0 1 2"/>
</states>
```

Alla filer ligger i `assets/optibeamOctax60/`. Amber = orange, white = vit, red = röd; front = fram, rear = bak. Lumary full använder båda optikdelarna, noGlare använder den övre och en smalare nedåtriktad ljuskägla. Välj en fil per lampa; ljusbilden är en speltolkning.

| Färg | Riktning | Läge | XML-fil |
|---|---|---|---|
| amber | front | full | `optibeamOctax60_amber_front.xml` |
| amber | rear | full | `optibeamOctax60_amber_rear.xml` |
| white | front | full | `optibeamOctax60_white_front.xml` |
| white | rear | full | `optibeamOctax60_white_rear.xml` |
| red | front | full | `optibeamOctax60_red_front.xml` |
| red | rear | full | `optibeamOctax60_red_rear.xml` |

Flera lampor kräver varsin monteringsgrupp, unik mapping-ID och sharedLight-rad. Ändra både linkNode och mapping-ID, exempelvis till nlmLampMount02. Sätt inte lightTypes på hela sharedLight-raden eftersom position och arbetsljus ska styras separat.

## Interna noder

Modellens egna nodvägar är redan kopplade i medföljande ljus-XML. Byt inte dessa mot fordonets monteringsindex.

| Nod | Modellväg |
|---|---|
| lampPivot | `0|0` |
| ambientOn | `0|0|0` |
| ambientBounce | `0|0|0|0` |
| drlReflection | `0|0|1|0|3` |
| position | `0|0|1|0|8` |
| workLED | `0|0|1|0|10` |
| workReflector | `0|0|1|0|11` |
| drlReflection_LOD1 | `0|0|1|1|3` |
| position_LOD1 | `0|0|1|1|8` |
| workLED_LOD1 | `0|0|1|1|10` |
| workReflector_LOD1 | `0|0|1|1|11` |
| workOn | `0|0|2` |
| workBeam | `0|0|2|0` |

Direktimport som alternativ: importera en färgvariant av I3D-filen under fordonet. Använd integration/embedded_example.xml och byt inledande exempel `0>` i varje mapping mot lamprotens verkliga Index Path följt av `|`. Behåll resterande suffix. Lägg defaultLights i befintliga lights/defaultLights och mappings i befintliga i3dMappings. Ge ID och motsvarande node-referens samma unika prefix per lampa. Använd antingen direktimport eller SharedLight för samma exemplar. Inbakad geometri uppdateras inte när externa prefabfiler byts.

Mått: 114.5 × 114.5 × 80.5 mm; 134 mm with bracket. Fotorekonstruktion med dokumenterade yttermått; invändig optik och ej måttsatta smådelar är tolkade. Två detaljnivåer, Blender-källor och egna texturer med varierande smutsmasker ingår. Studiobilderna är Blender-renderingar, inte FS25-bilder. XP Heat simulerar inte värme eller avisning. Positionsljusen lyser fast.

Felsökning: Saknas modellen, kontrollera hela assets-mappen och filnamnen i loggen. Fungerar endast position, kontrollera ljusgrupp 1/2 och states. Dubbla modeller betyder att både direktimport och SharedLight används. Flytande/nedsänkta fästen rättas genom verklig monteringskontakt. Flera positionsfärger samtidigt betyder överlappande färgvarianter. Efter export måste både I3D/shapes och samtliga berörda nodvägar kontrolleras.

Varumärkena tillhör respektive ägare. Inofficiell modell av NorthernLight Modding. Produktkälla: https://optibeamlights.com/work-lights/octax-60-ambient
Utförda kontroller och återstående granskning finns i VALIDATION.txt.

## Reflekterat positionsljus — 1.0.0.1

Amber, vitt och rött har ett svagt, ojämnt sken över den böjda reflektorn. `drlReflection` och `drlReflection_LOD1` följer positionsljusets grupp 0 genom synlighetsstyrning; båda ska vara dolda från start. Materialets `lightIds0="0.4 0 0 0"` är konstant medan synligheten tänder och släcker effekten. Bevara detta vid import eller ny export. De två reflektionsytorna är avsiktligt öppna och ligger 0,28 mm framför den slutna reflektorn. De är visuella ytor, inte kollisionskroppar. Färgens reflektionstextur och inkoppling för båda detaljnivåerna måste följa med.


# Optibeam Octax 6.0 Ambient — FS25-prefab

NorthernLight Modding · 1.0.0.1

Dette er en byggedel for kjøretøymoddere, ikke en egen kjøpbar mod.

## Montering og tilkobling

1. Ta sikkerhetskopi av kjøretøyet. Kopier hele `assets/optibeamOctax60` til samme mappe i kjøretøymodden, ved siden av `modDesc.xml`. Alle I3D-, shapes-, XML- og teksturfiler må følge med.
2. Åpne kjøretøyet i GIANTS Editor for FS25. Lag en tom TransformGroup kalt `nlmLampMount01` under riktig karosseri-/rammedel. Legg origo på festeflaten, med skala 1. Lokal +Y er opp og +Z er lysets retning. For bakovervendt lys: roter monteringsgruppen 180° rundt Y. Kontroller hele brakettens kontaktflate.
3. Marker gruppen og kopier dens faktiske **Index Path**. Legg til tilhørende mapping i kjøretøy-XML-filens eksisterende `<i3dMappings>`. `0>0|14|0` nedenfor er bare et eksempel og må erstattes.
4. Legg sharedLight-raden i den eksisterende `<lights>`-seksjonen. Velg riktig farge/retning i tabellen. Modellen lastes automatisk; ikke importer en synlig kopi oppå den.
5. `lampPivot` vipper lampehuset, optikken og lyskjeglen sammen. Braketten står fast. Eksemplet vipper 12° ned; kontroller klaring på ditt kjøretøy. Festefoten ligger ved Y=0 i nøytral stilling.
6. Last inn kjøretøyet i FS25. Posisjonslyset følger første F-trinn (`lightTypes="0"`). Arbeidslys foran bruker gruppe 2, bak bruker gruppe 1. Disse må finnes i kjøretøyets lysoppsett. Ingen Lua, ekstra modDesc-registrering eller ny kjøretøytype kreves.

```xml
<!-- Add inside the vehicle's EXISTING <lights> section -->
<sharedLight linkNode="nlmLampMount01" filename="assets/optibeamOctax60/optibeamOctax60_amber_front.xml">
    <rotationNode name="lampPivot" rotation="12 0 0"/>
</sharedLight>

<!-- Add inside the EXISTING <i3dMappings> section.
     0>0|14|0 IS AN EXAMPLE. Replace it with your actual mount Index Path. -->
<i3dMapping id="nlmLampMount01" node="0>0|14|0"/>
```

På et kjøretøy uten arbeidslystrinn må de legges til i eksisterende lights/states. Behold kjøretøyets øvrige grupper og lag aldri doble/nestede lights- eller states-seksjoner. Eksempel for et enkelt kjøretøy:

```xml
<!-- Only for a vehicle without working work-light states:
     extend its EXISTING <lights><states> to include these groups. -->
<states>
    <state lightTypes="0"/>
    <state lightTypes="0 2"/>
    <state lightTypes="0 1 2"/>
</states>
```

## Velg koblingsfil

Filene ligger i `assets/optibeamOctax60/`. Amber = oransje, white = hvit, red = rød; front = foran, rear = bak. Lumary full aktiverer begge optiske deler; noGlare bruker øvre optikk og en smalere, nedoverrettet lyskjegle. Velg én fil per lampe. Lysbildet er en spilltilpasning.

| Farge | Retning | Modus | XML-fil |
|---|---|---|---|
| amber | front | full | `optibeamOctax60_amber_front.xml` |
| amber | rear | full | `optibeamOctax60_amber_rear.xml` |
| white | front | full | `optibeamOctax60_white_front.xml` |
| white | rear | full | `optibeamOctax60_white_rear.xml` |
| red | front | full | `optibeamOctax60_red_front.xml` |
| red | rear | full | `optibeamOctax60_red_rear.xml` |

For flere lamper: bruk egen monteringsgruppe, unik mapping-ID og egen sharedLight-rad for hver lampe. Oppdater både linkNode og mapping-ID, for eksempel til nlmLampMount02. Ikke sett lightTypes på hele sharedLight-raden, da posisjonslys og arbeidslys har ulike grupper.

## Modellens noder

Disse interne stiene er allerede koblet i de medfølgende XML-filene. Ikke bytt dem ut med kjøretøyets monteringsindeks.

| Node | Modellsti |
|---|---|
| lampPivot | `0|0` |
| ambientOn | `0|0|0` |
| ambientBounce | `0|0|0|0` |
| drlReflection | `0|0|1|0|3` |
| position | `0|0|1|0|8` |
| workLED | `0|0|1|0|10` |
| workReflector | `0|0|1|0|11` |
| drlReflection_LOD1 | `0|0|1|1|3` |
| position_LOD1 | `0|0|1|1|8` |
| workLED_LOD1 | `0|0|1|1|10` |
| workReflector_LOD1 | `0|0|1|1|11` |
| workOn | `0|0|2` |
| workBeam | `0|0|2|0` |

Alternativ direkteimport: importer én farge-I3D under kjøretøyet og bruk `integration/embedded_example.xml`. Erstatt eksempelprefikset `0>` i hver mapping med den importerte lamperotens faktiske Index Path etterfulgt av `|`; behold resten av stien. Slå sammen defaultLights med eksisterende lights/defaultLights og mappings med eksisterende i3dMappings. Bruk unik prefiks på ID-er og tilhørende node-referanser for flere lamper. Velg direkteimport ELLER SharedLight for samme lampe. En innbakt modell oppdateres ikke ved å erstatte den eksterne prefabfilen.

## Detaljer og feilsøking

Mål: 114.5 × 114.5 × 80.5 mm; 134 mm with bracket. Modellen er rekonstruert fra bilder med dokumenterte yttermål. Udokumentert innvendig optikk og smådeler er modellerte tolkninger. To detaljnivåer, redigerbar Blender-kilde, egne teksturer og romlig varierende smussmasker følger med. Studiobilder er Blender-renderinger, ikke bilder fra FS25. XP Heat-navnet innebærer ikke simulert oppvarming eller avising. Posisjonslysene lyser fast.

- Manglende modell: kontroller hele assets-mappen, filnavnet og spillets logg.
- Bare posisjonslys: kontroller arbeidslysgruppe 1/2 og kjøretøyets states.
- Dobbel modell: fjern den ekstra direkteimporten eller sharedLight-raden.
- Braketten flyter eller går inn i karosseriet: flytt monteringsgruppen etter faktisk kontaktflate.
- Flere farger samtidig: bruk én fargevariant per lampe.
- Etter ny eksport: oppdater I3D og shapes sammen og kontroller interne nodestier på nytt.

Merkevarene tilhører sine eiere. Uoffisiell modell av NorthernLight Modding. Kilde: https://optibeamlights.com/work-lights/octax-60-ambient
Utførte kontroller og gjenstående prøver står i `VALIDATION.txt`.

## Reflektert posisjonslys — 1.0.0.1

Amber, hvitt og rødt har et svakt, ujevnt lys over den buede reflektoren. `drlReflection` og `drlReflection_LOD1` følger posisjonslysets gruppe 0 gjennom synlighetsstyring; begge skal være skjult fra start. Materialets `lightIds0="0.4 0 0 0"` er konstant mens synligheten slår effekten av og på. Behold dette ved import eller ny eksport. De to refleksjonsflatene er bevisst åpne og ligger 0,28 mm foran den lukkede reflektoren. De er visuelle flater, ikke kollisjonskropper. Fargens refleksjonstekstur og tilkobling for begge detaljnivåer må følge med.


# Optibeam Octax 6.0 Ambient — FS25 prefab

NorthernLight Modding · Version 1.0.0.1

This is a building part for vehicle modders. Extract it and install it into a vehicle. It is not a shop-buyable standalone mod.

## Installation — recommended SharedLight method

1. Back up the receiving vehicle. Copy this package's entire `assets/optibeamOctax60` folder to the vehicle mod's `assets/optibeamOctax60` folder, beside its `modDesc.xml`. Copy models, `.i3d.shapes`, XML and textures together. No nested archive needs to be unpacked.
2. Open the vehicle I3D in GIANTS Editor 10.0.13 or a compatible FS25 editor. Create an empty TransformGroup named `nlmLampMount01` under the vehicle body or the rigid part where the lamp belongs. Place its origin on the mounting contact surface. Use scale 1. Lamp local +Y is up and +Z points forward. Rotate a rear mount 180° about Y. Check the whole bracket footprint against the real surface.
3. Select that group and copy its actual **Index Path** from GIANTS Editor. Add a mapping with the same unique name to the vehicle XML's existing `<i3dMappings>`. The example `0>0|14|0` below is not a universal vehicle index.
4. Add the sharedLight entry below inside the existing `<lights>` section. Choose a supplied file from the table. Do not import another visible lamp at the same position: SharedLight loads it automatically.
5. `lampPivot` tilts the housing, optics and beam together about the fastening axis while the bracket stays fixed. Start at 12° down and check clearance for your mounting. The prefab's neutral foot is at Y=0.
6. Reload the complete vehicle in FS25. First F should activate the position light. Front work lights use type 2; rear work lights use type 1. The vehicle must actually have those groups in its light states. Keep its original road lights and other groups. No custom Lua, modDesc source registration or vehicle-type change is needed.

```xml
<!-- Add inside the vehicle's EXISTING <lights> section -->
<sharedLight linkNode="nlmLampMount01" filename="assets/optibeamOctax60/optibeamOctax60_amber_front.xml">
    <rotationNode name="lampPivot" rotation="12 0 0"/>
</sharedLight>

<!-- Add inside the EXISTING <i3dMappings> section.
     0>0|14|0 IS AN EXAMPLE. Replace it with your actual mount Index Path. -->
<i3dMapping id="nlmLampMount01" node="0>0|14|0"/>
```

If the vehicle has only road-light states, merge suitable work states into its existing states. Do not create duplicate `<lights>` or `<states>` elements. This complete example is for a simple host; keep any existing special groups:

```xml
<!-- Only for a vehicle without working work-light states:
     extend its EXISTING <lights><states> to include these groups. -->
<states>
    <state lightTypes="0"/>
    <state lightTypes="0 2"/>
    <state lightTypes="0 1 2"/>
</states>
```

## Supplied connection files

All files are under `assets/optibeamOctax60/`. Position lights always use lightTypes 0. `full` includes the ordinary work beam; Lumary `noGlare` uses its upper optic and a narrower, downward beam. This is an FS25 approximation, not certified real-world photometry. Use only one mode per lamp instance.

| Colour | Direction | Mode | XML file |
|---|---|---|---|
| amber | front | full | `optibeamOctax60_amber_front.xml` |
| amber | rear | full | `optibeamOctax60_amber_rear.xml` |
| white | front | full | `optibeamOctax60_white_front.xml` |
| white | rear | full | `optibeamOctax60_white_rear.xml` |
| red | front | full | `optibeamOctax60_red_front.xml` |
| red | rear | full | `optibeamOctax60_red_rear.xml` |

For several lamps, make one mount and one sharedLight entry for each. Give every mount/mapping a unique ID (`nlmLampMount02`, etc.). Different colours or directions can coexist. Never assign `lightTypes` to the entire sharedLight entry; that would also override its separate position function.

## Internal nodes and direct import

These index paths belong to the supplied model. The XML files already resolve them. Do not replace internal paths with the vehicle mount index.

| Node | Model path |
|---|---|
| lampPivot | `0|0` |
| ambientOn | `0|0|0` |
| ambientBounce | `0|0|0|0` |
| drlReflection | `0|0|1|0|3` |
| position | `0|0|1|0|8` |
| workLED | `0|0|1|0|10` |
| workReflector | `0|0|1|0|11` |
| drlReflection_LOD1 | `0|0|1|1|3` |
| position_LOD1 | `0|0|1|1|8` |
| workLED_LOD1 | `0|0|1|1|10` |
| workReflector_LOD1 | `0|0|1|1|11` |
| workOn | `0|0|2` |
| workBeam | `0|0|2|0` |

For direct geometry import, use `integration/embedded_example.xml` as an alternative to SharedLight. Import exactly one supplied colour I3D, parent its lamp root to the vehicle, copy that root's Index Path, and replace the leading example `0>` in every mapping with the actual root path plus `|`. Preserve the suffix after `0>`. Merge defaultLights into the existing lights/defaultLights and mappings into the existing i3dMappings. Add a unique prefix to both the mapping IDs and matching node references for each lamp. SharedLight and direct import must not be used together for the same lamp. Direct import does not update when the external prefab file changes.

## Appearance and source

Measured envelope: 114.5 × 114.5 × 80.5 mm; 134 mm with bracket. Shape and internal optical details are reconstructed from product photographs, not manufacturer CAD. Housing, rear cooling details, clear lens, reflectors, hardware and pivot are separately modeled. The runtime contains near and distance geometry, original DDS textures with mipmaps, spatial dirt masks on exposed surfaces and protected internal optics. The Blender files are editable sources. Studio images are supplementary Blender renders, not FS25 screenshots.

The real XP Heat has a heated lens; this prefab does not simulate electrical heating, temperature sensing or de-icing. Position lights are steady. The work beam and tilt are game functions. Product names and marks belong to their respective owners; this unofficial recreation is authored by NorthernLight Modding. Product reference: https://optibeamlights.com/work-lights/octax-60-ambient

## Troubleshooting

- No model: verify that the entire `assets/optibeamOctax60` folder is beside the vehicle modDesc.xml and the SharedLight filename is exact. Check the game log for missing assets.
- Position works but work light does not: check the host's lightTypes 1/2 and states, then select the front/rear XML intended for that group.
- Duplicate lamp: remove the redundant directly imported model or the SharedLight entry.
- Floating or buried bracket: adjust the mount to the actual surface; changing the lamp pitch is not a substitute for mounting contact.
- Both position colours appear: load one colour I3D per lamp; do not overlay colour variants.
- Editing the source: re-export model and binary shapes together, then regenerate and verify every affected internal XML path.

Read `VALIDATION.txt` for the checks executed on this build and outstanding acceptance tests.

## Reflected position light — 1.0.0.1

The amber, white and red versions include subdued, uneven light across the curved reflector. `drlReflection` and `drlReflection_LOD1` follow position group 0 through native visibility control; both must start hidden. Their material keeps `lightIds0="0.4 0 0 0"` while visibility switches the effect on/off. Preserve this distinction when importing or re-exporting. The two optical overlay surfaces are deliberately open and offset 0.28 mm in front of the closed reflector shell. They are visual surfaces, not collision bodies. Colour-specific reflection textures and both LOD connections must accompany the model.
