
# Point Cloud Animation (Upsert)

> **Warning**: This example is still under construction.

This example demonstrates how to animate point clouds using Vuer's `TimelineControls`
and the session-based `proxy.upsert` method. Unlike the global `app.update` approach,
this method targets a specific client session.

Key concepts:
- Using `proxy.upsert` (via `VuerSession`) to update a specific client
- Starting with an empty `DefaultScene` and dynamically adding components
- Handling `TIMELINE_STEP` events to synchronize animations
- Displaying multiple point clouds with different colors and positions

## Code Example

```python
import asyncio

import numpy as np
import open3d as o3d

from vuer import Vuer, VuerSession
from vuer.events import ClientEvent
from vuer.schemas import DefaultScene, PointCloud, TimelineControls

mesh = o3d.io.read_triangle_mesh("assets/suzanne.ply")
vertices = np.asarray(mesh.vertices)
faces = np.asarray(mesh.triangles)

app = Vuer()

infill = np.load("assets/suzanne_infill_good_traj.npy")
surface_infill = np.load("assets/suzanne_surface_fill_only.npy")

@app.spawn
async def main(proxy):
    proxy.set @ DefaultScene()

    while True:
        await asyncio.sleep(1.0)

async def frame_handle(e: ClientEvent, proxy: VuerSession):
    print("frame handle")

    step = e.value["step"]
    step = step % len(infill)

    proxy.upsert(
        TimelineControls(end=len(infill), step=step, speed=1.0, paused=False, key="timeline"),
        PointCloud(key="infill", vertices=infill[step], position=[0, 0, 0], color="red"),
        PointCloud(
            key="surface",
            vertices=surface_infill[step],
            position=[0.8, 0, 0],
            color="green",
        ),
    )
    print("updated the scene")


app.add_handler("TIMELINE_STEP", frame_handle)
app.start()
```
