vumichien's picture
First commit
b4c8bc3
import numpy as np
import pytest
import trimesh
from pyrender import (Mesh, Primitive)
def test_meshes():
with pytest.raises(TypeError):
x = Mesh()
with pytest.raises(TypeError):
x = Primitive()
with pytest.raises(ValueError):
x = Primitive([], mode=10)
# Basics
x = Mesh([])
assert x.name is None
assert x.is_visible
assert x.weights is None
x.name = 'str'
# From Trimesh
x = Mesh.from_trimesh(trimesh.creation.box())
assert isinstance(x, Mesh)
assert len(x.primitives) == 1
assert x.is_visible
assert np.allclose(x.bounds, np.array([
[-0.5, -0.5, -0.5],
[0.5, 0.5, 0.5]
]))
assert np.allclose(x.centroid, np.zeros(3))
assert np.allclose(x.extents, np.ones(3))
assert np.allclose(x.scale, np.sqrt(3))
assert not x.is_transparent
# Test some primitive functions
x = x.primitives[0]
with pytest.raises(ValueError):
x.normals = np.zeros(10)
with pytest.raises(ValueError):
x.tangents = np.zeros(10)
with pytest.raises(ValueError):
x.texcoord_0 = np.zeros(10)
with pytest.raises(ValueError):
x.texcoord_1 = np.zeros(10)
with pytest.raises(TypeError):
x.material = np.zeros(10)
assert x.targets is None
assert np.allclose(x.bounds, np.array([
[-0.5, -0.5, -0.5],
[0.5, 0.5, 0.5]
]))
assert np.allclose(x.centroid, np.zeros(3))
assert np.allclose(x.extents, np.ones(3))
assert np.allclose(x.scale, np.sqrt(3))
x.material.baseColorFactor = np.array([0.0, 0.0, 0.0, 0.0])
assert x.is_transparent
# From two trimeshes
x = Mesh.from_trimesh([trimesh.creation.box(),
trimesh.creation.cylinder(radius=0.1, height=2.0)],
smooth=False)
assert isinstance(x, Mesh)
assert len(x.primitives) == 2
assert x.is_visible
assert np.allclose(x.bounds, np.array([
[-0.5, -0.5, -1.0],
[0.5, 0.5, 1.0]
]))
assert np.allclose(x.centroid, np.zeros(3))
assert np.allclose(x.extents, [1.0, 1.0, 2.0])
assert np.allclose(x.scale, np.sqrt(6))
assert not x.is_transparent
# From bad data
with pytest.raises(TypeError):
x = Mesh.from_trimesh(None)
# With instancing
poses = np.tile(np.eye(4), (5,1,1))
poses[:,0,3] = np.array([0,1,2,3,4])
x = Mesh.from_trimesh(trimesh.creation.box(), poses=poses)
assert np.allclose(x.bounds, np.array([
[-0.5, -0.5, -0.5],
[4.5, 0.5, 0.5]
]))
poses = np.eye(4)
x = Mesh.from_trimesh(trimesh.creation.box(), poses=poses)
poses = np.eye(3)
with pytest.raises(ValueError):
x = Mesh.from_trimesh(trimesh.creation.box(), poses=poses)
# From textured meshes
fm = trimesh.load('tests/data/fuze.obj')
x = Mesh.from_trimesh(fm)
assert isinstance(x, Mesh)
assert len(x.primitives) == 1
assert x.is_visible
assert not x.is_transparent
assert x.primitives[0].material.baseColorTexture is not None
x = Mesh.from_trimesh(fm, smooth=False)
fm.visual = fm.visual.to_color()
fm.visual.face_colors = np.array([1.0, 0.0, 0.0, 1.0])
x = Mesh.from_trimesh(fm, smooth=False)
with pytest.raises(ValueError):
x = Mesh.from_trimesh(fm, smooth=True)
fm.visual.vertex_colors = np.array([1.0, 0.0, 0.0, 0.5])
x = Mesh.from_trimesh(fm, smooth=False)
x = Mesh.from_trimesh(fm, smooth=True)
assert x.primitives[0].color_0 is not None
assert x.is_transparent
bm = trimesh.load('tests/data/WaterBottle.glb').dump()[0]
x = Mesh.from_trimesh(bm)
assert x.primitives[0].material.baseColorTexture is not None
assert x.primitives[0].material.emissiveTexture is not None
assert x.primitives[0].material.metallicRoughnessTexture is not None
# From point cloud
x = Mesh.from_points(fm.vertices)
# def test_duck():
# bm = trimesh.load('tests/data/Duck.glb').dump()[0]
# x = Mesh.from_trimesh(bm)
# assert x.primitives[0].material.baseColorTexture is not None
# pixel = x.primitives[0].material.baseColorTexture.source[100, 100]
# yellowish = np.array([1.0, 0.7411765, 0.0, 1.0])
# assert np.allclose(pixel, yellowish)