Source code for yt_idv.scene_data.mesh
import numpy as np
import traitlets
from yt.data_objects.data_containers import YTDataContainer
from yt.utilities.lib.mesh_triangulation import triangulate_mesh
from yt_idv.opengl_support import Texture3D, VertexArray, VertexAttribute
from yt_idv.scene_data.base_data import SceneData
[docs]class MeshData(SceneData):
name = "mesh"
data_source = traitlets.Instance(YTDataContainer)
texture_objects = traitlets.Dict(trait=traitlets.Instance(Texture3D))
texture_objects = traitlets.Dict(trait=traitlets.Instance(Texture3D))
blocks = traitlets.Dict(default_value=())
scale = traitlets.Bool(False)
size = traitlets.CInt(-1)
[docs] def get_mesh_data(self, data_source, field):
"""
This reads the mesh data into a form that can be fed in to OpenGL.
"""
# get mesh information
try:
ftype, fname = field
mesh_id = int(ftype[-1])
except ValueError:
mesh_id = 0
mesh = data_source.ds.index.meshes[mesh_id - 1]
offset = mesh._index_offset
vertices = mesh.connectivity_coords
if hasattr(vertices, "in_units"):
vertices = vertices.in_units("unitary")
indices = mesh.connectivity_indices - offset
data = data_source[field]
return triangulate_mesh(vertices, data, indices)
[docs] def add_data(self, field):
v, d, i = self.get_mesh_data(self.data_source, field)
v.shape = (v.size // 3, 3)
v = np.concatenate([v, np.ones((v.shape[0], 1))], axis=-1).astype("f4")
d.shape = (d.size, 1)
i.shape = (i.size, 1)
i = i.astype("uint32")
# d[:] = np.mgrid[0.0:1.0:1j*d.size].astype("f4")[:,None]
self.vertex_array.attributes.append(
VertexAttribute(name="model_vertex", data=v)
)
self.vertex_array.attributes.append(
VertexAttribute(name="vertex_data", data=d.astype("f4"))
)
self.vertex_array.indices = i
self.size = i.size
@traitlets.default("vertex_array")
def _default_vertex_array(self):
return VertexArray(name="mesh_info", each=0)