{
  "name": "HandTrackBase",
  "id": "ide:af2276bf-7857-4d5c-b8fd-2d961f864ca5",
  "module": {
    "kind": "javascript",
    "id": "ide:af2276bf-7857-4d5c-b8fd-2d961f864ca5",
    "name": "HandTrackBase",
    "inputs": [
      {
        "id": "image",
        "label": "image",
        "type": "frame"
      }
    ],
    "outputs": [
      {
        "id": "hands",
        "label": "hands",
        "type": "object"
      }
    ],
    "setup": "async function setup(_inputs, state) {\n    state.ready = false;\n    const mod = await import ('https://esm.sh/@mediapipe/tasks-vision')\n    const {FilesetResolver, GestureRecognizer} = mod.default ?? mod;\n    state.vision = await FilesetResolver.forVisionTasks(\n      \"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm\"\n    )\n    state.gestureRecognizer = await GestureRecognizer.createFromOptions(state.vision, {\n      baseOptions: {\n        modelAssetPath: \"https://storage.googleapis.com/mediapipe-tasks/gesture_recognizer/gesture_recognizer.task\"\n      },\n      numHands: 2\n    }) \n  \n     //state.model = new Handsfree({hands: true});\n    //state.model.start()\n   state.recognize = (image)=> {\n     return new Promise(resolve => {\n       setTimeout(() => {\n         resolve(state.gestureRecognizer.recognize(image));\n       }, 0)\n     })\n   }\n  \n     state.ready = true\n\n  state.looking = false\n  console.log(\"ready\")\n  \n\n  }",
    "update": "function update(inputs, state) {\n  //console.log(state)\n  //console.log(inputs)\n  const DEF_FINGERS = {\n    thumb: 4,\n    middle: 12,\n    ring: 16,\n    index: 8\n  }\n  if(inputs.image && state.ready){\n    if(!state.looking){\n      state.looking = true\n      state.recognize(inputs.image).then((res) => {\n        state.looking = false\n        if(res.landmarks.length > 0){\n          const leftIndex = res.handednesses.findIndex((h) => h[0].categoryName == \"Left\")\n          const rightIndex = leftIndex == -1 ? 0 : 1 - leftIndex;\n          const landMarkIndex = 4;\n          const hands = {}\n          const result = {}\n          if(leftIndex != -1){\n            hands['left'] = res.landmarks[leftIndex]\n          }\n          if(rightIndex < res.landmarks.length){\n            hands['right'] = res.landmarks[rightIndex]\n          }\n          for (const side in hands){\n            result[side] = {}\n            const hand = hands[side]\n              for (const finger in DEF_FINGERS){\n                result[side][finger] = {}\n                for (const comp of ['x','y']){\n                  result[side][finger][comp] = hand[DEF_FINGERS[finger]][comp]\n                \n              }\n            }\n          }\n          state.hands = result\n        }\n     })\n    }\n  }\n  return state\n  }",
    "teardown": "function teardown(state) {\n\n  }",
    "enableFrameReadback": true
  }
}
