diff --git a/panda/src/pgraph/lightAttrib.cxx b/panda/src/pgraph/lightAttrib.cxx index 15b010336e..40014c53ee 100644 --- a/panda/src/pgraph/lightAttrib.cxx +++ b/panda/src/pgraph/lightAttrib.cxx @@ -841,6 +841,9 @@ compose_impl(const RenderAttrib *other) const { lobj->attrib_ref(); } + // This is needed since _sorted_on_lights is not yet populated. + new_attrib->_sort_seq = UpdateSeq::old(); + return return_new(new_attrib); } diff --git a/tests/pgraph/test_lightattrib.py b/tests/pgraph/test_lightattrib.py new file mode 100644 index 0000000000..752f4c2717 --- /dev/null +++ b/tests/pgraph/test_lightattrib.py @@ -0,0 +1,74 @@ +from panda3d import core + +# Some dummy lights we can use for our light attributes. +spot = core.NodePath(core.Spotlight("spot")) +point = core.NodePath(core.PointLight("point")) +ambient = core.NodePath(core.AmbientLight("ambient")) + + +def test_lightattrib_compose_add(): + # Tests a case in which a child node adds another light. + lattr1 = core.LightAttrib.make() + lattr1 = lattr1.add_on_light(spot) + + lattr2 = core.LightAttrib.make() + lattr2 = lattr2.add_on_light(point) + + lattr3 = lattr1.compose(lattr2) + assert lattr3.get_num_on_lights() == 2 + + assert spot in lattr3.on_lights + assert point in lattr3.on_lights + + +def test_lightattrib_compose_subtract(): + # Tests a case in which a child node disables a light. + lattr1 = core.LightAttrib.make() + lattr1 = lattr1.add_on_light(spot) + lattr1 = lattr1.add_on_light(point) + + lattr2 = core.LightAttrib.make() + lattr2 = lattr2.add_off_light(ambient) + lattr2 = lattr2.add_off_light(point) + + lattr3 = lattr1.compose(lattr2) + assert lattr3.get_num_on_lights() == 1 + + assert spot in lattr3.on_lights + assert point not in lattr3.on_lights + assert ambient not in lattr3.on_lights + + +def test_lightattrib_compose_both(): + # Tests a case in which a child node both enables and disables a light. + lattr1 = core.LightAttrib.make() + lattr1 = lattr1.add_on_light(spot) + lattr1 = lattr1.add_on_light(point) + + lattr2 = core.LightAttrib.make() + lattr2 = lattr2.add_on_light(ambient) + lattr2 = lattr2.add_on_light(spot) + lattr2 = lattr2.add_off_light(point) + + lattr3 = lattr1.compose(lattr2) + assert lattr3.get_num_on_lights() == 2 + + assert spot in lattr3.on_lights + assert point not in lattr3.on_lights + assert ambient in lattr3.on_lights + + +def test_lightattrib_compose_alloff(): + # Tests a case in which a child node disables all lights. + lattr1 = core.LightAttrib.make() + lattr1 = lattr1.add_on_light(spot) + lattr1 = lattr1.add_on_light(point) + assert lattr1.get_num_on_lights() == 2 + + lattr2 = core.LightAttrib.make_all_off() + assert lattr2.has_all_off() + + lattr3 = lattr1.compose(lattr2) + assert lattr3.get_num_on_lights() == 0 + assert lattr3.get_num_off_lights() == 0 + assert lattr3.has_all_off()