hub/venv/lib/python3.7/site-packages/trimesh/visual/objects.py

95 lines
2.5 KiB
Python

"""
objects.py
--------------
Deal with objects which hold visual properties, like
ColorVisuals and TextureVisuals.
"""
import numpy as np
from .material import from_color, pack
from .texture import TextureVisuals
from .color import ColorVisuals
def create_visual(**kwargs):
"""
Create Visuals object from keyword arguments.
Parameters
-----------
face_colors : (n, 3|4) uint8
Face colors
vertex_colors : (n, 3|4) uint8
Vertex colors
mesh : trimesh.Trimesh
Mesh object
Returns
----------
visuals : ColorVisuals
Visual object created from arguments
"""
return ColorVisuals(**kwargs)
def concatenate(visuals, *args):
"""
Concatenate multiple visual objects.
Parameters
----------
visuals : ColorVisuals or list
Visuals to concatenate
*args : ColorVisuals or list
More visuals to concatenate
Returns
----------
concat : Visuals
If all are color
"""
# get a flat list of Visuals objects
if len(args) > 0:
visuals = np.append(visuals, args)
else:
visuals = np.array(visuals)
# if there are any texture visuals convert all to texture
if any(v.kind == 'texture' for v in visuals):
# first collect materials and UV coordinates
mats = []
uvs = []
for v in visuals:
if v.kind == 'texture':
mats.append(v.material)
if v.uv is None:
# otherwise use zeros
uvs.append(np.zeros((len(v.mesh.vertices), 2)) + 0.5)
else:
# if uvs are of correct shape use them
uvs.append(v.uv)
else:
# create a material and UV coordinates from vertex colors
color_mat, color_uv = from_color(
vertex_colors=v.vertex_colors)
mats.append(color_mat)
uvs.append(color_uv)
# pack the materials and UV coordinates into one
new_mat, new_uv = pack(materials=mats, uvs=uvs)
return TextureVisuals(material=new_mat, uv=new_uv)
# convert all visuals to the kind of the first
kind = visuals[0].kind
if kind == 'face':
colors = np.vstack([
v.face_colors for v in visuals])
return ColorVisuals(face_colors=colors)
elif kind == 'vertex':
colors = np.vstack([
v.vertex_colors for v in visuals])
return ColorVisuals(vertex_colors=colors)
return ColorVisuals()