# States



# Node Is Grabbed

### ![State_Node_Grabbed.png](https://simlab-soft.com/help/uploads/images/gallery/2024-09/state-node-grabbed.png) Node Is Grabbed

![Ceiling Node.png](https://simlab-soft.com/help/uploads/images/gallery/2024-09/scaled-1680-/1itimage.png)

The **Node Is Grabbed** node enables the user to check if the assigned node is grabbed with **OnTrue/OnFalse** ports to execute responses or **Output Boolean** port that is compatible with event nodes.

#### Examples

![image.png](https://simlab-soft.com/help/uploads/images/gallery/2024-09/scaled-1680-/97Qimage.png)

In this example, a **Node Is Grabbed** node is used to check if the node assigned is grabbed. Once the object named **Activate** is triggered, the sound named Instructions will play, and the object named Key will show up and become grabbable. Once the object named **Key** is grabbed, the sequence named **Door\_Open** will play.



---

# Watch Boolean Expression

### ![State_Expression_Boolean.png](https://simlab-soft.com/help/uploads/images/gallery/2024-08/state-expression-boolean.png) Watch Boolean Expression

![Ceiling Node.png](https://simlab-soft.com/help/uploads/images/gallery/2024-08/scaled-1680-/5dMimage.png)

The **Watch Boolean Expression** node enables the user to check the value of specific variable(s) with **OnTrue/OnFalse** ports to execute responses or **Output Boolean** port that is compatible with event nodes.

#### Examples

![image.png](https://simlab-soft.com/help/uploads/images/gallery/2024-08/scaled-1680-/Of8image.png)

In this example, a **Watch Boolean Expression** node is used to check the value of **a string variable** to determine if it is true or false, depending on the result, the object named Activate can be triggered. Once the event is triggered, the object named Table will be shown during the VR Experience.


![image.png](https://simlab-soft.com/help/uploads/images/gallery/2024-08/scaled-1680-/1PWimage.png)

In this example, a **Watch Boolean Expression** node is used to check the value of **a number variable** to determine if it is true or false, depending on the result, the object named Activate can be triggered. Once the event is triggered, the object named Table will be shown during the VR Experience.


---

# Boolean

These nodes work with **true/false** values — the yes/no answers your scene produces, such as whether a door is open, a switch is on, or a trainee is standing in the right place. An operator takes one or two of these true/false values and works out a new one, so you can combine several conditions into a single answer and react to it.

## What's on this page

- **And Operation** — the answer is true only when *both* values are true.
- **Or Operation** — the answer is true when *at least one* value is true.
- **Not Operation** — flips a single value to its opposite.

The **And** and **Or** nodes hand you the answer in two ways at once: a true/false **Result** you can read whenever you like, and two triggers — **OnTrue** and **OnFalse** — that fire at the moment the answer changes. Use whichever suits your scene.

---

## True / false logic

### And Operation

Checks two true/false values and tells you whether *both* of them are true.

#### What it does

This node looks at two true/false values you feed in and combines them: the result is true only when **both** are true. If either one is false — or both are — the result is false. Think of it as the word “and” in everyday speech: the door is unlocked *and* the trainee is wearing a helmet.

The node keeps watching both inputs and updates as they change. The **Result** output always holds the current answer, ready to read at any time. The two trigger outputs fire only at the moment the answer flips: **OnTrue** fires the instant the combined answer becomes true, and **OnFalse** fires the instant it becomes false. If an input changes but the overall answer stays the same, neither trigger fires.

#### Inputs

<table id="bkmrk-port-type-what-to-co"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What to connect</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**Boolean A**</td><td style="white-space: nowrap;">True / false</td><td>The first true/false value you want to check — for example, whether a switch is on.</td></tr><tr><td style="white-space: nowrap;">**Boolean B**</td><td style="white-space: nowrap;">True / false</td><td>The second true/false value to check alongside the first — for example, whether a safety guard is closed. Both must be true for the result to be true.</td></tr></tbody></table>

#### Outputs

<table id="bkmrk-port-type-what-you-g"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What you get</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**OnTrue**</td><td style="white-space: nowrap;">Trigger</td><td>Fires once at the moment both values become true. Wire this to whatever should happen when the combined answer turns true.</td></tr><tr><td style="white-space: nowrap;">**OnFalse**</td><td style="white-space: nowrap;">Trigger</td><td>Fires once at the moment the answer turns false — that is, when at least one of the two values stops being true. Wire this to whatever should happen when the combined answer turns false.</td></tr><tr><td style="white-space: nowrap;">**Result**</td><td style="white-space: nowrap;">True / false</td><td>The current combined answer: true when both values are true, otherwise false. You can read this at any time.</td></tr></tbody></table>

#### Example

<table id="bkmrk-boolean-a-input-mach"><tbody><tr><td style="white-space: nowrap;">**Boolean A** input</td><td>Machine power is on — `true`</td></tr><tr><td style="white-space: nowrap;">**Boolean B** input</td><td>Safety guard starts open (`false`), then the trainee closes it (`true`)</td></tr><tr><td style="white-space: nowrap;">**OnTrue** output</td><td>Fires the instant the guard closes — now both are true, so the answer flips to true and this trigger fires once (you could use it to start the machine)</td></tr><tr><td style="white-space: nowrap;">**Result** output</td><td>`true`</td></tr></tbody></table>

#### Tips

- Use the **Result** output when you just need the current answer somewhere else; use **OnTrue** / **OnFalse** when you want something to happen the moment the answer changes.
- The triggers fire only on a change. If both values are already true when your scene starts, **OnTrue** won’t fire until the answer leaves and returns to true.
- Need to check that *either* value is true instead of both? Use the **Or Operation** node. Need to flip a single true/false value? Use the **Not Operation** node.

### Or Operation

Checks two true/false values and tells you whether at least one of them is true.

#### What it does

This node looks at its two true/false inputs and works out a single combined answer. The combined answer is **true** whenever at least one of the inputs is true, and only becomes **false** when both inputs are false. You can read this answer at any time from the Result output.

The node keeps watching both inputs and re-checks the answer whenever either one changes. The moment the combined answer flips to true, the **OnTrue** trigger fires once; the moment it flips back to false, the **OnFalse** trigger fires once. If an input changes but the overall answer stays the same, neither trigger fires.

#### Inputs

<table id="bkmrk-port-type-what-to-co-0"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What to connect</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**Boolean A**</td><td style="white-space: nowrap;">True / false</td><td>The first true/false value to check — for example whether a door is open.</td></tr><tr><td style="white-space: nowrap;">**Boolean B**</td><td style="white-space: nowrap;">True / false</td><td>The second true/false value to check — for example whether a window is open.</td></tr></tbody></table>

#### Outputs

<table id="bkmrk-port-type-what-you-g-0"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What you get</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**OnTrue**</td><td style="white-space: nowrap;">Trigger</td><td>Fires once at the moment the combined answer becomes true — that is, when at least one input has just turned true. Connect this to whatever should happen when that switch-on moment occurs.</td></tr><tr><td style="white-space: nowrap;">**OnFalse**</td><td style="white-space: nowrap;">Trigger</td><td>Fires once at the moment the combined answer becomes false — that is, when both inputs have just become false. Connect this to whatever should happen when that switch-off moment occurs.</td></tr><tr><td style="white-space: nowrap;">**Result**</td><td style="white-space: nowrap;">True / false</td><td>The current combined answer: true if at least one input is true, false only when both are false. You can read this at any time.</td></tr></tbody></table>

#### Example

<table id="bkmrk-boolean-a-input-door"><tbody><tr><td style="white-space: nowrap;">**Boolean A** input</td><td>Door is open — `false`</td></tr><tr><td style="white-space: nowrap;">**Boolean B** input</td><td>Window is open — changes from `false` to `true`</td></tr><tr><td style="white-space: nowrap;">**Result** output</td><td>`true` (at least one is now open)</td></tr><tr><td style="white-space: nowrap;">**OnTrue** output</td><td>Fires once, because the combined answer just flipped from false to true — you could use it to start a “something is open” warning.</td></tr></tbody></table>

#### Tips

- Use **Result** when you just want the current answer to feed into another node, and use **OnTrue** / **OnFalse** when you want something to happen the moment the answer changes.
- The triggers fire only on a change. If the answer is already true and an input change keeps it true, **OnTrue** will not fire again.
- If you need the answer to be true only when *both* inputs are true, use the **And Operation** node instead.

### Not Operation

Flips a true/false value to its opposite.

#### What it does

This node takes a single true/false value and gives you back the reverse. If the value coming in is true, the result is false. If it comes in as false, the result is true.

It’s handy when you want to react to the opposite of something — for example, doing something only when a door is *not* open, or when a switch is *not* turned on. The value you connect is not changed; you simply get a new, flipped result out.

#### Inputs

<table id="bkmrk-port-type-what-to-co-1"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What to connect</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**Input**</td><td style="white-space: nowrap;">True / false</td><td>The true/false value you want to flip — for example, whether a light is on or whether an object is visible.</td></tr></tbody></table>

#### Outputs

<table id="bkmrk-port-type-what-you-g-1"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What you get</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**Output**</td><td style="white-space: nowrap;">True / false</td><td>The opposite of what you connected: `false` when the input is true, and `true` when the input is false.</td></tr></tbody></table>

#### Example

<table id="bkmrk-input-true-%28the-door"><tbody><tr><td style="white-space: nowrap;">**Input**</td><td>`true` (the door is open)</td></tr><tr><td style="white-space: nowrap;">**Output**</td><td>`false` — so “the door is not open” is false</td></tr></tbody></table>

#### Tips

- Use this when you want to act on the opposite of a condition without setting up a separate check — for example, to know when something is *not* happening.

---

## Related

- **Branch** — use the **Result** from any of these nodes to send your scene down one path or another.
- Chain these three together to build a bigger check — for example, flip a value with **Not Operation** before feeding it into **And Operation** or **Or Operation**.

# Assembly

The nodes on this page report on SimLab’s **VR assembly** system. They are **states**: each one keeps an eye on a single part and continuously reports a simple true/false answer about where that part is in the assembly — for example “is it this part’s turn to be put on?” or “is this part fully assembled?” A state is not an action you run once and finish; it is a live condition the scene keeps checking the whole time it is playing.

In a VR assembly, parts go together in a set order, and each part has a state of its own — think of a screw: all the way *out* (taken apart), *seated in place but not tightened* (partway together), or *tightened* (fully together). The nodes below let your scene react to where a part is in that process — whether it is this part’s turn to be added or removed, and whether a part is completely assembled or completely apart.

Every one of these nodes gives you the same three things to work with:

- **OnTrue** — a trigger that fires the moment the answer becomes true.
- **OnFalse** — a trigger that fires the moment the answer becomes false.
- **Output Boolean** — the current true/false value, ready to read at any time or to send into a **Branch** node.

The two triggers fire only when the answer *changes* — not over and over while it stays the same. These nodes only watch and report; they never move, assemble, or change anything in your scene.

## What's on this page

- **Node Can Assemble** — is it this part’s turn to be put on next?
- **Node Can Disassemble** — is it this part’s turn to be taken off next?
- **Node Fully Assembled** — is this part completely assembled (in place and secured)?
- **Node Fully Disassembled** — is this part completely taken apart (all the way out)?

Looking for other state nodes — checking whether two objects overlap, or whether the viewer is overlapping an object? See the **States** page.

---

### Node Can Assemble

Reports whether a part in a VR assembly is currently allowed to be put on next — that is, whether it is this part’s turn in the assembly order.

#### What it does

In a VR assembly, every part has to go on in a set order, and some parts can only be added once the parts before them are already in place. This node watches one part and keeps answering a simple yes/no question: is it this part’s turn yet? The answer is `true` as long as everything that must come before this part has already been assembled, so it is now ready to be put on. While some earlier part is still missing, the answer is `false`.

It only watches and reports — it never assembles the part or changes anything in the scene. You connect what should happen on the “ready” side and the “not yet” side, and read the current answer whenever you like.

#### Inputs

<table id="bkmrk-port-type-what-to-co"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What to connect</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**SceneNode**</td><td style="white-space: nowrap;">Scene node</td><td>The part you want to check — for example a `Bolt_01` object from your assembly. The node reports whether this part is currently allowed to be assembled next.</td></tr></tbody></table>

#### Outputs

<table id="bkmrk-port-type-what-you-g"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What you get</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**OnTrue**</td><td style="white-space: nowrap;">Trigger</td><td>Fires once at the moment the part becomes ready to assemble — that is, when the last part that had to come before it is finally in place. Wire this to whatever should happen when it is this part’s turn, such as highlighting it or showing a hint.</td></tr><tr><td style="white-space: nowrap;">**OnFalse**</td><td style="white-space: nowrap;">Trigger</td><td>Fires once at the moment the part is no longer ready — for example if an earlier part is removed again, so it stops being this part’s turn. Wire this to whatever should happen when the part is not yet ready.</td></tr><tr><td style="white-space: nowrap;">**Output Boolean**</td><td style="white-space: nowrap;">True / false</td><td>The current answer, ready to read at any time: `true` while the part is allowed to be assembled next, `false` while it is not yet its turn. Send this into a Branch node, or use it anywhere you need the current yes/no value.</td></tr></tbody></table>

#### Example

<table id="bkmrk-scenenode-input-bolt"><tbody><tr><td style="white-space: nowrap;">**SceneNode** input</td><td>`Bolt_01`</td></tr><tr><td style="white-space: nowrap;">**Output Boolean** output</td><td>`true` — the `Housing` and `Gear` that come before `Bolt_01` are already assembled, so it is now the bolt’s turn</td></tr><tr><td style="white-space: nowrap;">**OnTrue** output</td><td>Fires the instant `Gear` is seated — the bolt is now ready, so you could highlight it to guide the trainee to fit it next</td></tr></tbody></table>

#### Tips

- Use the **Output Boolean** when you just need the current answer somewhere else (for example in a Branch); use **OnTrue** / **OnFalse** when you want something to happen the moment a part becomes ready or stops being ready.
- The triggers fire only on a change. If the part is already ready when your scene starts, **OnTrue** won’t fire until the answer leaves and returns to true.
- This node only reports readiness — it never assembles the part. Combine it with your assembly steps to guide the trainee through the parts in the right order.

### Node Can Disassemble

Reports whether a part is currently allowed to be taken off next in a VR assembly — that is, whether every part that has to come off before it has already been removed, so it’s now this part’s turn.

#### What it does

In a VR assembly, parts come apart in a set order — the pieces on top have to be removed before the ones underneath. This node watches one part and answers a simple live question: “Is it this part’s turn to be taken off?” The answer is true when all the parts that must be removed ahead of it are already off, and false while something on top of it is still attached.

This node only watches and reports — it never takes the part off or changes anything in the scene. The answer updates on its own as the assembly is taken apart, so you can use it to know exactly when a part becomes ready to remove.

#### Inputs

<table id="bkmrk-port-type-what-to-co-0"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What to connect</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**SceneNode**</td><td style="white-space: nowrap;">Scene node</td><td>The part you want to watch — for example a bolt or a panel. The node reports whether this part is currently allowed to be taken off next.</td></tr></tbody></table>

#### Outputs

<table id="bkmrk-port-type-what-you-g-0"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What you get</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**OnTrue**</td><td style="white-space: nowrap;">Trigger</td><td>Fires the moment the part becomes ready to be taken off — the instant it becomes this part’s turn. Wire it to whatever should happen then, such as highlighting the part or showing a “remove this” hint. It fires once at that moment, not continuously.</td></tr><tr><td style="white-space: nowrap;">**OnFalse**</td><td style="white-space: nowrap;">Trigger</td><td>Fires the moment the part is no longer the one allowed to come off next. Wire it to whatever should happen then, such as turning off a highlight. It fires once at that moment.</td></tr><tr><td style="white-space: nowrap;">**Output Boolean**</td><td style="white-space: nowrap;">True / false</td><td>The current answer as a true/false value — true while it’s this part’s turn to be removed, false otherwise. You can read it at any time or send it into a Branch node.</td></tr></tbody></table>

#### Example

<table id="bkmrk-scenenode-input-bolt-0"><tbody><tr><td style="white-space: nowrap;">**SceneNode** input</td><td>`Bolt_01`</td></tr><tr><td style="white-space: nowrap;">**OnTrue** output</td><td>fires when the cover above `Bolt_01` has been removed and it’s now the bolt’s turn to come off</td></tr><tr><td style="white-space: nowrap;">**OnFalse** output</td><td>fires if `Bolt_01` is no longer the next part allowed to be removed</td></tr><tr><td style="white-space: nowrap;">**Output Boolean** output</td><td>`true` once the bolt is ready to be taken off</td></tr></tbody></table>

#### Tips

- Use **OnTrue** to guide the user — for example, light up the next part the moment it becomes removable so they always know what to take off next.
- This node reports readiness only; it does not take the part off. Pair it with your normal grab-and-remove interaction to act on the part itself.
- Send the **Output Boolean** into a Branch node when you want a check elsewhere in your logic to react to whether a part is ready to be removed.

### Node Fully Assembled

Watches one object and reports whether it is completely assembled — fully in place *and* secured.

#### What it does

This node keeps an eye on the object you connect and answers a simple yes/no question while your scene runs: is this object fully assembled? In SimLab’s assembly system a part moves through three stages — think of a screw. With the screw all the way out, the part is disassembled. Once it is dropped into place but not yet tightened, it is only partially assembled. When it is finally tightened down, it is fully assembled. This node reports **true** only at that last stage, when the object is completely in place and secured. As long as the object is still loose, only seated, or not yet positioned, the answer stays **false**.

It only watches and reports — it never moves, tightens, or changes the object in any way. You use its answer to drive the rest of your scene: play a confirmation sound when a part is fully assembled, show a warning while it still isn’t, or feed the current answer into a Branch node.

#### Inputs

<table id="bkmrk-port-type-what-to-co-1"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What to connect</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**SceneNode**</td><td style="white-space: nowrap;">Scene node</td><td>The object you want to watch — the part whose assembly you care about, such as `Bolt_01`. The node reports on this object’s own assembly state.</td></tr></tbody></table>

#### Outputs

<table id="bkmrk-port-type-what-you-g-1"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What you get</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**OnTrue**</td><td style="white-space: nowrap;">Trigger</td><td>Fires once the moment the object becomes fully assembled. Wire it to whatever should happen when the part is finished — a success chime, a checkmark, the next step in your guide.</td></tr><tr><td style="white-space: nowrap;">**OnFalse**</td><td style="white-space: nowrap;">Trigger</td><td>Fires once the moment the object stops being fully assembled — for example if it is loosened or taken back apart. Wire it to whatever should happen when the part is no longer complete.</td></tr><tr><td style="white-space: nowrap;">**Output Boolean**</td><td style="white-space: nowrap;">True / false</td><td>The current answer — `true` while the object is fully assembled, `false` otherwise. You can read it at any time or send it straight into a Branch node.</td></tr></tbody></table>

#### Example

<table id="bkmrk-scenenode-input-bolt-1"><tbody><tr><td style="white-space: nowrap;">**SceneNode** input</td><td>`Bolt_01`</td></tr><tr><td style="white-space: nowrap;">**OnTrue** output</td><td>Fires when `Bolt_01` is tightened all the way down — play a confirmation sound and mark the step complete.</td></tr><tr><td style="white-space: nowrap;">**OnFalse** output</td><td>Fires if `Bolt_01` is later loosened or removed.</td></tr><tr><td style="white-space: nowrap;">**Output Boolean** output</td><td>`true` once the bolt is fully assembled, `false` while it is still loose or only seated.</td></tr></tbody></table>

#### Tips

- A part that is only dropped into place but not tightened still counts as **false** here — this node reports true only when the part is both in place and secured.
- **OnTrue** and **OnFalse** each fire just once, right at the moment the answer changes. If you instead need to react to the answer continuously, read **Output Boolean** — it always holds the current value.

### Node Fully Disassembled

Reports whether the object you connect is completely taken apart — all the way out of place, not just loosened.

#### What it does

Connect one object and this node keeps a live yes/no answer to the question “is this part fully disassembled?” In an assembly scene a part can be in three states — think of a screw: all the way out (**fully disassembled**), dropped into place but not tightened (**partially assembled**), or tightened down (**fully assembled**). The answer here is **true** only when the object is all the way out, and **false** while it is partially assembled or fully assembled.

The node only watches and reports — it never moves the object or changes anything in the scene. The answer can flip at any time as the user works: each time it flips, one of the two triggers fires, and a true/false value is always available to read.

#### Inputs

<table id="bkmrk-port-type-what-to-co-2"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What to connect</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**SceneNode**</td><td style="white-space: nowrap;">Scene node</td><td>The object you want to watch — the part whose assembly state you care about, for example a `Bolt_01`. The node reports on this object’s own state.</td></tr></tbody></table>

#### Outputs

<table id="bkmrk-port-type-what-you-g-2"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What you get</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**OnTrue**</td><td style="white-space: nowrap;">Trigger</td><td>Fires once at the moment the object becomes fully disassembled — the instant it comes all the way out of place. Wire this to whatever should happen when the part is completely removed.</td></tr><tr><td style="white-space: nowrap;">**OnFalse**</td><td style="white-space: nowrap;">Trigger</td><td>Fires once at the moment the answer turns false — that is, the instant the object is no longer fully out (it has been seated back into place, even loosely). Wire this to whatever should happen when the part is back in.</td></tr><tr><td style="white-space: nowrap;">**Output Boolean**</td><td style="white-space: nowrap;">True / false</td><td>The current answer, ready to read at any time: **true** while the object is fully disassembled, **false** otherwise. Send it into a Branch node, or use it anywhere a true/false value is needed.</td></tr></tbody></table>

#### Example

<table id="bkmrk-scenenode-input-bolt-2"><tbody><tr><td style="white-space: nowrap;">**SceneNode** input</td><td>`Bolt_01`</td></tr><tr><td style="white-space: nowrap;">**OnTrue** output</td><td>Fires the instant `Bolt_01` is backed all the way out — you could use it to mark the disassembly step complete.</td></tr><tr><td style="white-space: nowrap;">**OnFalse** output</td><td>Fires the instant `Bolt_01` is seated back into place — even just dropped in, before tightening.</td></tr><tr><td style="white-space: nowrap;">**Output Boolean** output</td><td>`true` while the bolt is fully out, `false` once it is seated or tightened.</td></tr></tbody></table>

#### Tips

- Use **Output Boolean** when you just need the current answer somewhere else; use **OnTrue** / **OnFalse** when you want something to happen the moment the part comes out or goes back in.
- The triggers fire only on a change. If the part is already fully out when your scene starts, **OnTrue** won’t fire until it is put back and then removed again.
- “Partially assembled” (in place but not tightened) still reports **false** here — this node turns true only when the part is all the way out. To react to the tightened, fully-in state instead, use the matching fully-assembled state node.

# Overlap

The nodes on this page are **states**. Each one keeps an eye on part of your scene and continuously reports a simple true/false answer about it — for example “are these two objects touching?” or “is the viewer standing inside this area?” A state is not an action you run once and finish; it is a live condition the scene keeps checking the whole time it is playing.

Every one of these nodes gives you the same three things to work with:

- **OnTrue** — a trigger that fires the moment the answer becomes true.
- **OnFalse** — a trigger that fires the moment the answer becomes false.
- **Output Boolean** — the current true/false value, ready to read at any time or to send into a **Branch** node.

The two triggers fire only when the answer *changes* — not over and over while it stays the same. These nodes only watch and report; they never move, assemble, or change anything in your scene.

This page covers the **overlap** states. For states that follow a part through a **VR assembly** — whether it can be put on or taken off, or is fully assembled — see the **Assembly** page.

---

## Overlap

These nodes report whether things are sharing the same space in your scene. **Overlap** means two volumes intersect — they are touching or passing through one another. One node compares two objects you choose; the other compares an object against the **viewer** (the person moving through the scene in VR).

### Nodes Overlap

Watches two objects in your scene and reports whether they are overlapping in space — that is, whether their 3D shapes share the same area.

#### What it does

You give this node two objects from your scene. It keeps watching them while your scene runs and answers one simple yes/no question: are these two objects overlapping right now? The answer is true whenever the two objects’ 3D volumes share the same space, and false whenever they are apart.

This node only watches and reports — it never moves, changes, or touches the objects themselves. It gives you a true/false answer plus two triggers so you can make something happen the moment the two objects start touching, or the moment they come apart.

#### Inputs

<table id="bkmrk-port-type-what-to-co"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What to connect</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**SceneNode A**</td><td style="white-space: nowrap;">Scene node</td><td>The first object to check — for example a `Gear`. It must be a different object from SceneNode B. The viewer’s start position cannot be used here; to test the viewer against an object, use the User Overlap Node instead.</td></tr><tr><td style="white-space: nowrap;">**SceneNode B**</td><td style="white-space: nowrap;">Scene node</td><td>The second object to check — for example a `Housing`. It must be a different object from SceneNode A. The viewer’s start position cannot be used here either.</td></tr></tbody></table>

#### Outputs

<table id="bkmrk-port-type-what-you-g"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What you get</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**OnTrue**</td><td style="white-space: nowrap;">Trigger</td><td>Fires once the instant the two objects start overlapping. Wire it to whatever should happen the moment they come together.</td></tr><tr><td style="white-space: nowrap;">**OnFalse**</td><td style="white-space: nowrap;">Trigger</td><td>Fires once the instant the two objects stop overlapping and move apart. Wire it to whatever should happen the moment they separate.</td></tr><tr><td style="white-space: nowrap;">**Output Boolean**</td><td style="white-space: nowrap;">True / false</td><td>The current answer: true while the two objects are overlapping, false while they are apart. You can read it at any time or feed it into a Branch node.</td></tr></tbody></table>

#### Example

<table id="bkmrk-scenenode-a-input-ge"><tbody><tr><td>**SceneNode A** input</td><td>`Gear`</td></tr><tr><td>**SceneNode B** input</td><td>`Housing`</td></tr><tr><td>**OnTrue** output</td><td>Fires the moment the `Gear` slides into the `Housing` and they begin to overlap</td></tr><tr><td>**OnFalse** output</td><td>Fires the moment the `Gear` is pulled back out and the two no longer overlap</td></tr><tr><td>**Output Boolean** output</td><td>`true` while the `Gear` is inside the `Housing`</td></tr></tbody></table>

#### Tips

- OnTrue and OnFalse each fire just once, at the moment the answer changes — they do not keep firing while the two objects stay overlapping. If you need to act on the ongoing state rather than the moment it changes, read the Output Boolean instead.
- The two objects must be different. Pick two separate scene objects for SceneNode A and SceneNode B.
- To check whether the viewer is overlapping an object, use the User Overlap Node — the viewer’s start position is not accepted here.

### User Overlap Node

This node reports whether the person viewing the scene is currently sharing the same space as a chosen object — in other words, whether the viewer is standing in or passing through it.

#### What it does

You give it one object from your scene. While the scene runs, the node keeps watching the viewer’s position and answers a single live question: is the viewer overlapping that object right now? The answer is `true` while the viewer’s space and the object’s space share the same area, and `false` the rest of the time.

This node only watches and reports — it never moves, hides, or changes the object or the viewer in any way. You decide what happens by wiring its outputs to other nodes. The two triggers fire at the moment the answer changes: one the instant the viewer steps into the object, the other the instant they step back out. The true / false output always holds the current answer, so you can read it whenever you like.

#### Inputs

<table id="bkmrk-port-type-what-to-co-0"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What to connect</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**SceneNode**</td><td style="white-space: nowrap;">Scene node</td><td>The object in your scene you want to test the viewer against — for example a doorway, a safety zone, or a part such as `Housing`. The node reports `true` while the viewer is sharing the same space as this object. (The viewer start position cannot be used here.)</td></tr></tbody></table>

#### Outputs

<table id="bkmrk-port-type-what-you-g-0"><thead><tr><th style="white-space: nowrap;">Port</th><th style="white-space: nowrap;">Type</th><th>What you get</th></tr></thead><tbody><tr><td style="white-space: nowrap;">**OnTrue**</td><td style="white-space: nowrap;">Trigger</td><td>Fires once the moment the viewer starts overlapping the object. Wire it to whatever should happen when the viewer steps in — play a sound, show a message, open a door.</td></tr><tr><td style="white-space: nowrap;">**OnFalse**</td><td style="white-space: nowrap;">Trigger</td><td>Fires once the moment the viewer stops overlapping the object. Wire it to whatever should happen when the viewer leaves — the matching “step out” reaction.</td></tr><tr><td style="white-space: nowrap;">**Output Boolean**</td><td style="white-space: nowrap;">True / false</td><td>The current answer as a `true` / `false` value: `true` while the viewer is inside the object, `false` otherwise. Read it directly or send it into a Branch node to choose between two paths.</td></tr></tbody></table>

#### Example

<table id="bkmrk-scenenode-input-rest"><tbody><tr><td style="white-space: nowrap;">**SceneNode** input</td><td>`RestrictedZone`</td></tr><tr><td style="white-space: nowrap;">**OnTrue** output</td><td>Fires when the viewer walks into `RestrictedZone` — wire it to a warning sound.</td></tr><tr><td style="white-space: nowrap;">**OnFalse** output</td><td>Fires when the viewer leaves `RestrictedZone` — wire it to stop the warning.</td></tr><tr><td style="white-space: nowrap;">**Output Boolean** output</td><td>`true` while the viewer is inside the zone, `false` when they are outside</td></tr></tbody></table>

#### Tips

- Use **OnTrue** and **OnFalse** as a matched pair when you want one reaction as the viewer enters and another as they leave — for example showing and then hiding a hint panel.
- When you only need to check the answer at a specific point (rather than react the instant it changes), feed **Output Boolean** into a Branch node instead.
- Pick an object whose space is big enough to comfortably contain the viewer, such as a room or a marked floor area, so the overlap is easy to trigger.