from panda3d.core import *
MainCameraBitmask = BitMask32.bit(0)
ReflectionCameraBitmask = BitMask32.bit(1)
ShadowCameraBitmask = BitMask32.bit(2)
SkyReflectionCameraBitmask = BitMask32.bit(3)
GlowCameraBitmask = BitMask32.bit(4)

def setCameraBitmask(default, node_path, camera_bitmask, tag = None, tag_function = None, context = None):
    if node_path:
        show = default
        if tag_function:
            show = tag_function(default, tag, context)
        if show:
            node_path.show(camera_bitmask)
        else:
            node_path.hide(camera_bitmask)


def renderReflection(default, node_path, tag = None, tag_function = None, context = None):
    setCameraBitmask(default, node_path, ReflectionCameraBitmask, tag, tag_function, context)


def renderShadow(default, node_path, tag = None, tag_function = None, context = None):
    setCameraBitmask(default, node_path, ShadowCameraBitmask, tag, tag_function, context)


def renderSkyReflection(default, node_path, tag = None, tag_function = None, context = None):
    setCameraBitmask(default, node_path, SkyReflectionCameraBitmask, tag, tag_function, context)


def renderGlow(default, node_path, tag = None, tag_function = None, context = None):
    setCameraBitmask(default, node_path, GlowCameraBitmask, tag, tag_function, context)


def setAdditiveEffect(node_path, tag = None, bin_name = None, lighting_on = False, reflect = False):
    if node_path:
        node_path.setTransparency(True)
        node_path.setDepthWrite(False)
        node_path.node().setAttrib(ColorBlendAttrib.make(ColorBlendAttrib.MAdd))
        if lighting_on == False:
            node_path.setLightOff()
        node_path.setAttrib(ColorWriteAttrib.make(ColorWriteAttrib.CRed | ColorWriteAttrib.CGreen | ColorWriteAttrib.CBlue))
        if reflect == False:
            renderReflection(False, node_path, tag, None)
        if bin_name:
            node_path.setBin(bin_name, 0)
    return
