Search code examples
godotgdscript

Can you hide a node when not directly above a parent in Godot?


So I have an instanced scene that is supposed to be the child of a colour rect in my tree. I want to randomly generate the nodes, but I also want parts of the view to be cut off if the texture no longer is above the main section. I know you can render nodes below their parents, but I don't know if stopping part of them from rendering is physically possible.

In this image I want the bottom circle to remain the same, but the top circle to not show anything above the dark purple box

This is the node tree in the editor

Is there any way to do this directly, or am I gonna have to use a viewport of some variety?


Solution

  • I believe what you want is to set rect_clip_content to true on the ColorRect (or whatever Control). Making invisible any part of its children outside of it.

    From Godot's documentation:

    bool rect_clip_content

    Enables whether rendering of CanvasItem based children should be clipped to this control's rectangle. If true, parts of a child which would be visibly outside of this control's rectangle will not be rendered.


    If what you want is the opposite, perhaps you can use z_index to have something render on top, occluding the parts you don't want visible.


    There is also a trick you can use with lights (including 2D lights):

    • Make a light that matches the area you want things to be visible.
    • Set a custom material that will be transparent by default, but visible on the light pass. The simpler way to do this is to set the light_mode of the material to "Light Only". You could also do it with a custom shader instead.

    Making something disappear with light, in 2D, is impossible. In 3D, you can use flags_use_shadow_to_opacity. That is how you make a shadow catcher.

    But, there is one more trick: you can use a mask. This should give you full control of when to show or hide things. So, if none of the above solutions works for you, use a mask. I have an explanation in a different answer. See also: How to crop sprite in a non-rectangular form?.


    Mighty Mochi Games recently (2022-03-30) made a compilation of the different approaches in video form: Mask Methods Collection - Godot 3.x - 2D .