hallucinated implementation hooking the render window - seems much faster
This commit is contained in:
parent
6a05cae640
commit
997addae84
73
gpt.py
Normal file
73
gpt.py
Normal file
@ -0,0 +1,73 @@
|
||||
import pyvista as pv
|
||||
import vtk
|
||||
from vtk.util import numpy_support
|
||||
import numpy as np
|
||||
import time
|
||||
import kitty
|
||||
import asyncio
|
||||
from PIL import Image
|
||||
from io import BytesIO
|
||||
|
||||
|
||||
async def render_to(image_array):
|
||||
"""
|
||||
Dummy rendering function that receives the rendered image as a numpy array.
|
||||
Replace this with your actual rendering/display logic.
|
||||
"""
|
||||
# print(f"Received image with shape: {image_array.shape} and dtype: {image_array.dtype}")
|
||||
y, x = await kitty.get_position()
|
||||
img = Image.fromarray(image_array)
|
||||
buffer: BytesIO = BytesIO()
|
||||
img.save(buffer, format="PNG")
|
||||
await kitty.draw_to_terminal(buffer)
|
||||
kitty.set_position(y, x)
|
||||
|
||||
|
||||
async def main():
|
||||
plotter = pv.Plotter(off_screen=True, window_size=[400, 400])
|
||||
plotter.add_mesh(pv.Sphere(), color="tomato")
|
||||
plotter.add_text("Live capture example", font_size=14)
|
||||
|
||||
# plotter.show(auto_close=False) # keep window open and interactive
|
||||
|
||||
# Access the vtkRenderWindow
|
||||
vtk_render_window = plotter.ren_win
|
||||
|
||||
# Setup the window-to-image filter to capture the rendered scene
|
||||
w2i_filter = vtk.vtkWindowToImageFilter()
|
||||
w2i_filter.SetInput(vtk_render_window)
|
||||
|
||||
try:
|
||||
while True:
|
||||
# Trigger a render to make sure the content is fresh
|
||||
vtk_render_window.Render()
|
||||
|
||||
# Update the filter to grab the current buffer
|
||||
w2i_filter.Modified()
|
||||
w2i_filter.Update()
|
||||
|
||||
vtk_image = w2i_filter.GetOutput()
|
||||
|
||||
width, height, _ = vtk_image.GetDimensions()
|
||||
vtk_array = vtk_image.GetPointData().GetScalars()
|
||||
arr = numpy_support.vtk_to_numpy(vtk_array)
|
||||
|
||||
# Reshape the array to height x width x channels (probably 3 or 4)
|
||||
arr = arr.reshape(height, width, -1)
|
||||
|
||||
# Flip vertically because VTK's origin is bottom-left
|
||||
arr = np.flip(arr, axis=0)
|
||||
|
||||
# Call the dummy render_to function with captured frame
|
||||
await render_to(arr)
|
||||
|
||||
time.sleep(0.1) # adjust framerate to your needs, e.g. 10 FPS
|
||||
plotter.camera.Azimuth(1)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print("Capture stopped by user.")
|
||||
plotter.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
asyncio.run(main())
|
Loading…
Reference in New Issue
Block a user