from vispy import scene
from vispy.scene.visuals import Mesh
from vispy.visuals.filters import ShadingFilter, WireframeFilter
from vispy.scene import SceneCanvas
from utils.files.input import ScannedObject
import numpy as np

class Mesh3DCanvas:
    def __init__(self,obj:ScannedObject):
        vertices = np.asarray(obj.get_vertices())
        faces = np.asarray(obj.get_faces())
        self.canvas = scene.SceneCanvas(keys='interactive', bgcolor='white',size=(400, 400))
        view = self.canvas.central_widget.add_view()
        view.camera = 'arcball'
        view.camera.depth_value = 1e3
        mesh = Mesh(vertices, faces, color=(.5, .7, .5, 1))
        view.add(mesh)
        wireframe_filter = WireframeFilter(width=0)
        shading_filter = ShadingFilter(shininess=0)
        mesh.attach(wireframe_filter)
        mesh.attach(shading_filter)
        def attach_headlight(view):
            light_dir = (0, 1, 0, 0)
            shading_filter.light_dir = light_dir[:3]
            initial_light_dir = view.camera.transform.imap(light_dir)
            @view.scene.transform.changed.connect
            def on_transform_change(event):
                transform = view.camera.transform
                shading_filter.light_dir = transform.map(initial_light_dir)[:3]
        attach_headlight(view)