def _get_live_spec(): livechange_b = [[True], [False]] livechange_f = [[v] for v in gen_floats(4)[1:3]] livechange_v2 = gen_floats(2), gen_floats(2)[::-1] livechange_v3 = gen_floats(3), gen_floats(3)[::-1] livechange_v4 = gen_floats(4), gen_floats(4)[::-1] livechange_i = [[v] for v in gen_ints(4)[1:3]] livechange_mat4 = gen_floats(4 * 4), gen_floats(4 * 4)[::-1] livechange_quat = livechange_v4 # fmt: off spec = [ dict(name="b", type="bool", category="single", livechange=livechange_b), dict(name="f", type="float", category="single", livechange=livechange_f), dict(name="v2", type="vec2", category="single", livechange=livechange_v2), dict(name="v3", type="vec3", category="single", livechange=livechange_v3), dict(name="v4", type="vec4", category="single", livechange=livechange_v4), dict(name="i", type="int", category="single", livechange=livechange_i), dict(name="m4", type="mat4", category="single", livechange=livechange_mat4), dict(name="qm", type="quat_mat4", category="single", livechange=livechange_quat), dict(name="qv", type="quat_vec4", category="single", livechange=livechange_quat), ] # fmt: on spec.append( dict( name="c", type="color", func=lambda data: ngl.UniformColor(data, space="hsl"), category="single", livechange=livechange_v3, ), ) return spec
def api_livectls(): # Build a scene and extract its live controls rng = random.Random(0) scene = ngl.Group( children=( ngl.UniformBool(live_id="b"), ngl.UniformFloat(live_id="f"), ngl.UniformIVec3(live_id="iv3"), ngl.UserSwitch( ngl.Group( children=( ngl.UniformMat4(live_id="m4"), ngl.UniformColor(live_id="clr"), ngl.UniformQuat(as_mat4=True, live_id="rot"), ) ), live_id="switch", ), ngl.Text(live_id="txt"), ) ) livectls = ngl.get_livectls(scene) assert len(livectls) == 8 # Attach scene and run a dummy draw to make sure it's valid ctx = ngl.Context() ret = ctx.configure(offscreen=1, width=16, height=16, backend=_backend) assert ret == 0 assert ctx.set_scene(scene) == 0 assert ctx.draw(0) == 0 # Apply live changes on nodes previously tracked by get_livectls() values = dict( b=True, f=rng.uniform(-1, 1), iv3=[rng.randint(-100, 100) for i in range(3)], switch=False, m4=[rng.uniform(-1, 1) for i in range(16)], clr=(0.9, 0.3, 0.8), rot=(0.1, -0.2, 0.5, -0.3), txt="test string", ) for live_id, value in values.items(): node = livectls[live_id]["node"] node_type = livectls[live_id]["node_type"] assert node_type == node.__class__.__name__ if node_type == "UserSwitch": node.set_enabled(value) elif node_type == "Text": node.set_text(value) elif hasattr(value, "__iter__"): node.set_value(*value) else: node.set_value(value) # Detach scene from context and grab all live controls again assert ctx.set_scene(None) == 0 livectls = ngl.get_livectls(scene) # Inspect nodes to check if they were properly altered by the live changes for live_id, expected_value in values.items(): value = livectls[live_id]["val"] node_type = livectls[live_id]["node_type"] if node_type == "Text": assert value == expected_value, (value, expected_value) elif hasattr(value, "__iter__"): assert all(math.isclose(v, e, rel_tol=1e-6) for v, e in zip(value, expected_value)) else: assert math.isclose(value, expected_value, rel_tol=1e-6)
def scene_func(_): return ngl.RenderColor(color=ngl.UniformColor(c, space=space))