95 lines
2.5 KiB
Python
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()
|