| import numpy as np |
| import pytest |
| import trimesh |
|
|
| from pyrender import (Mesh, PerspectiveCamera, DirectionalLight, |
| SpotLight, PointLight, Scene, Node, OrthographicCamera) |
|
|
|
|
| def test_scenes(): |
|
|
| |
| s = Scene() |
| assert np.allclose(s.bg_color, np.ones(4)) |
| assert np.allclose(s.ambient_light, np.zeros(3)) |
| assert len(s.nodes) == 0 |
| assert s.name is None |
| s.name = 'asdf' |
| s.bg_color = None |
| s.ambient_light = None |
| assert np.allclose(s.bg_color, np.ones(4)) |
| assert np.allclose(s.ambient_light, np.zeros(3)) |
|
|
| assert s.nodes == set() |
| assert s.cameras == set() |
| assert s.lights == set() |
| assert s.point_lights == set() |
| assert s.spot_lights == set() |
| assert s.directional_lights == set() |
| assert s.meshes == set() |
| assert s.camera_nodes == set() |
| assert s.light_nodes == set() |
| assert s.point_light_nodes == set() |
| assert s.spot_light_nodes == set() |
| assert s.directional_light_nodes == set() |
| assert s.mesh_nodes == set() |
| assert s.main_camera_node is None |
| assert np.all(s.bounds == 0) |
| assert np.all(s.centroid == 0) |
| assert np.all(s.extents == 0) |
| assert np.all(s.scale == 0) |
|
|
| |
| tms = trimesh.load('tests/data/WaterBottle.glb') |
| s = Scene.from_trimesh_scene(tms) |
| assert len(s.meshes) == 1 |
| assert len(s.mesh_nodes) == 1 |
|
|
| |
| s = Scene(bg_color=[0, 1.0, 0]) |
| assert np.allclose(s.bg_color, np.array([0.0, 1.0, 0.0, 1.0])) |
|
|
| |
| n1 = Node() |
| n2 = Node() |
| n3 = Node() |
| nodes = [n1, n2, n3] |
| s = Scene(nodes=nodes) |
| n1.children.append(n2) |
| s = Scene(nodes=nodes) |
| n3.children.append(n2) |
| with pytest.raises(ValueError): |
| s = Scene(nodes=nodes) |
| n3.children = [] |
| n2.children.append(n3) |
| n3.children.append(n2) |
| with pytest.raises(ValueError): |
| s = Scene(nodes=nodes) |
|
|
| |
| n1 = Node() |
| n2 = Node() |
| n3 = Node() |
| nodes = [n1, n2] |
| s = Scene(nodes=nodes) |
| assert s.has_node(n1) |
| assert s.has_node(n2) |
| assert not s.has_node(n3) |
|
|
| |
| for n in nodes: |
| assert np.allclose(s.get_pose(n), np.eye(4)) |
| with pytest.raises(ValueError): |
| s.get_pose(n3) |
| with pytest.raises(ValueError): |
| s.set_pose(n3, np.eye(4)) |
| tf = np.eye(4) |
| tf[:3,3] = np.ones(3) |
| s.set_pose(n1, tf) |
| assert np.allclose(s.get_pose(n1), tf) |
| assert np.allclose(s.get_pose(n2), np.eye(4)) |
|
|
| nodes = [n1, n2, n3] |
| tf2 = np.eye(4) |
| tf2[:3,:3] = np.diag([-1,-1,1]) |
| n1.children.append(n2) |
| n1.matrix = tf |
| n2.matrix = tf2 |
| s = Scene(nodes=nodes) |
| assert np.allclose(s.get_pose(n1), tf) |
| assert np.allclose(s.get_pose(n2), tf.dot(tf2)) |
| assert np.allclose(s.get_pose(n3), np.eye(4)) |
|
|
| n1 = Node() |
| n2 = Node() |
| n3 = Node() |
| n1.children.append(n2) |
| s = Scene() |
| s.add_node(n1) |
| with pytest.raises(ValueError): |
| s.add_node(n2) |
| s.set_pose(n1, tf) |
| assert np.allclose(s.get_pose(n1), tf) |
| assert np.allclose(s.get_pose(n2), tf) |
| s.set_pose(n2, tf2) |
| assert np.allclose(s.get_pose(n2), tf.dot(tf2)) |
|
|
| |
| n1 = Node() |
| n2 = Node() |
| n3 = Node() |
| n1.children.append(n2) |
| n2.children.append(n3) |
| s = Scene(nodes=[n1, n2, n3]) |
| s.remove_node(n2) |
| assert len(s.nodes) == 1 |
| assert n1 in s.nodes |
| assert len(n1.children) == 0 |
| assert len(n2.children) == 1 |
| s.add_node(n2, parent_node=n1) |
| assert len(n1.children) == 1 |
| n1.matrix = tf |
| n3.matrix = tf2 |
| assert np.allclose(s.get_pose(n3), tf.dot(tf2)) |
|
|
| |
| s = Scene() |
| m = Mesh([], name='m') |
| cp = PerspectiveCamera(yfov=2.0) |
| co = OrthographicCamera(xmag=1.0, ymag=1.0) |
| dl = DirectionalLight() |
| pl = PointLight() |
| sl = SpotLight() |
|
|
| n1 = s.add(m, name='mn') |
| assert n1.mesh == m |
| assert len(s.nodes) == 1 |
| assert len(s.mesh_nodes) == 1 |
| assert n1 in s.mesh_nodes |
| assert len(s.meshes) == 1 |
| assert m in s.meshes |
| assert len(s.get_nodes(node=n2)) == 0 |
| n2 = s.add(m, pose=tf) |
| assert len(s.nodes) == len(s.mesh_nodes) == 2 |
| assert len(s.meshes) == 1 |
| assert len(s.get_nodes(node=n1)) == 1 |
| assert len(s.get_nodes(node=n1, name='mn')) == 1 |
| assert len(s.get_nodes(name='mn')) == 1 |
| assert len(s.get_nodes(obj=m)) == 2 |
| assert len(s.get_nodes(obj=m, obj_name='m')) == 2 |
| assert len(s.get_nodes(obj=co)) == 0 |
| nsl = s.add(sl, name='sln') |
| npl = s.add(pl, parent_name='sln') |
| assert nsl.children[0] == npl |
| ndl = s.add(dl, parent_node=npl) |
| assert npl.children[0] == ndl |
| nco = s.add(co) |
| ncp = s.add(cp) |
|
|
| assert len(s.light_nodes) == len(s.lights) == 3 |
| assert len(s.point_light_nodes) == len(s.point_lights) == 1 |
| assert npl in s.point_light_nodes |
| assert len(s.spot_light_nodes) == len(s.spot_lights) == 1 |
| assert nsl in s.spot_light_nodes |
| assert len(s.directional_light_nodes) == len(s.directional_lights) == 1 |
| assert ndl in s.directional_light_nodes |
| assert len(s.cameras) == len(s.camera_nodes) == 2 |
| assert s.main_camera_node == nco |
| s.main_camera_node = ncp |
| s.remove_node(ncp) |
| assert len(s.cameras) == len(s.camera_nodes) == 1 |
| assert s.main_camera_node == nco |
| s.remove_node(n2) |
| assert len(s.meshes) == 1 |
| s.remove_node(n1) |
| assert len(s.meshes) == 0 |
| s.remove_node(nsl) |
| assert len(s.lights) == 0 |
| s.remove_node(nco) |
| assert s.main_camera_node is None |
|
|
| s.add_node(n1) |
| s.clear() |
| assert len(s.nodes) == 0 |
|
|
| |
| with pytest.raises(ValueError): |
| s.main_camera_node = None |
| with pytest.raises(ValueError): |
| s.main_camera_node = ncp |
| with pytest.raises(ValueError): |
| s.add(m, parent_node=n1) |
| with pytest.raises(ValueError): |
| s.add(m, name='asdf') |
| s.add(m, name='asdf') |
| s.add(m, parent_name='asdf') |
| with pytest.raises(ValueError): |
| s.add(m, parent_name='asfd') |
| with pytest.raises(TypeError): |
| s.add(None) |
|
|
| s.clear() |
| |
| m1 = Mesh.from_trimesh(trimesh.creation.box()) |
| m2 = Mesh.from_trimesh(trimesh.creation.box()) |
| m3 = Mesh.from_trimesh(trimesh.creation.box()) |
| n1 = Node(mesh=m1) |
| n2 = Node(mesh=m2, translation=[1.0, 0.0, 0.0]) |
| n3 = Node(mesh=m3, translation=[0.5, 0.0, 1.0]) |
| s.add_node(n1) |
| s.add_node(n2) |
| s.add_node(n3) |
| assert np.allclose(s.bounds, [[-0.5, -0.5, -0.5], [1.5, 0.5, 1.5]]) |
| s.clear() |
| s.add_node(n1) |
| s.add_node(n2, parent_node=n1) |
| s.add_node(n3, parent_node=n2) |
| assert np.allclose(s.bounds, [[-0.5, -0.5, -0.5], [2.0, 0.5, 1.5]]) |
| tf = np.eye(4) |
| tf[:3,3] = np.ones(3) |
| s.set_pose(n3, tf) |
| assert np.allclose(s.bounds, [[-0.5, -0.5, -0.5], [2.5, 1.5, 1.5]]) |
| s.remove_node(n2) |
| assert np.allclose(s.bounds, [[-0.5, -0.5, -0.5], [0.5, 0.5, 0.5]]) |
| s.clear() |
| assert np.allclose(s.bounds, 0.0) |
|
|