durss

Snap filter

Oct 29th, 2021 (edited)
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.89 KB | None | 0 0
  1. //@input float faceScale = 3.0 {"label":"Face scale", "min": 1.0, "max": 5.0, "step":0.1}
  2. //@input float easeDuration = 0.5 {"label":"Zoom duration's)", "min": 0.1, "max": 10.0, "step":0.1}
  3. //@input Component.Head head
  4. //@input Component.Camera camera
  5. //@input Component.Image image
  6.  
  7. var zoom = 0;
  8. var endZoom = 0;
  9. var startZoom = 0;
  10. var isFaceTracking = false;
  11. var startTime = 0;
  12. function onFaceFound()
  13. {
  14. isFaceTracking = true;
  15. startTime = getTime();
  16. startZoom = zoom;
  17. }
  18. function onFaceLost()
  19. {
  20. isFaceTracking = false;
  21. startTime = getTime();
  22. startZoom = zoom;
  23. }
  24.  
  25. function onUpdate()
  26. {
  27. var top;
  28. var bottom;
  29. var center;
  30. var transform = script.image.getSceneObject().getComponent("Component.ScreenTransform");
  31.  
  32. if(!isFaceTracking) {
  33. top = new vec2(0,1);
  34. right = new vec2(.5,.5);
  35. bottom = new vec2(0,-2);
  36. left = new vec2(.5,.5);
  37. center = new vec2(0.5,0.5);
  38. }else{
  39. top = script.head.getLandmark(71);
  40. right = script.head.getLandmark(16);
  41. bottom = script.head.getLandmark(8);
  42. left = script.head.getLandmark(0);
  43. center = script.head.getLandmark(29);
  44. }
  45.  
  46.  
  47. //Compute face height
  48. var faceSize = bottom.y - top.y;
  49. if(script.camera.aspect < 1) {
  50. faceSize = right.x - left.x;
  51. }
  52.  
  53. //Set zoom so the face fits the screen (times the faceScale value)
  54. var endZoom = 1/faceSize * script.faceScale;
  55.  
  56. //Reduce zoom scale on mobile vertical screens
  57. //if(script.camera.aspect < 1) endZoom /= 2;
  58.  
  59. //Ease zoom value
  60. var elapsedDuration = Math.min(script.easeDuration, getTime()-startTime);
  61. var endValue = !isFaceTracking? 0 : endZoom;
  62. var func = !isFaceTracking? easeIn : easeOut
  63. zoom = func(elapsedDuration, startZoom, endValue-startZoom, script.easeDuration);
  64.  
  65. //Compensate scale generated offset by panning
  66. var offsetX = (center.x - .5) * zoom;
  67. var offsetY = (center.y - .5) * zoom;
  68.  
  69. //Move texture opposite to face position to center it.
  70. center.x = (-center.x*2+1) - offsetX;
  71. center.y = (center.y*2-1) + offsetY;
  72.  
  73. //Avoid texture border to be visible
  74. if(center.x >= .5*zoom) center.x = .5*zoom;
  75. if(center.x <= -.5*zoom) center.x = -.5*zoom;
  76. if(center.y >= .5*zoom) center.y = .5*zoom;
  77. if(center.y <= -.5*zoom) center.y = -.5*zoom;
  78.  
  79. //Move and scale texture
  80. transform.anchors.setCenter(center);
  81. transform.anchors.setSize(new vec2(zoom, zoom));
  82.  
  83. }
  84.  
  85. script.createEvent("FaceFoundEvent").bind(onFaceFound);
  86. script.createEvent("FaceLostEvent").bind(onFaceLost);
  87. script.createEvent("UpdateEvent").bind( onUpdate );
  88.  
  89. function easeOut(t, b, c, d, s) {
  90. return c * (t /= d) * t * t * t * t * t + b;
  91. };
  92.  
  93. function easeIn(t, b, c, d, s) {
  94. return c * ((t = t / d - 1) * t * t * t * t + 1) + b;
  95. }
  96.  
Add Comment
Please, Sign In to add comment