Пример #1
0
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
Пример #2
0
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)
Пример #3
0
 def scene_func(_):
     return ngl.RenderColor(color=ngl.UniformColor(c, space=space))