The forum on this site is closed for new comments and posts. Continue the conversation in the new forum, and learn more here.

Depth sorting touch components

  • Also just to clarify, my issue specifically involves the touch component on a face mesh triggering when a UI button is pressed if the face mesh is overlapping with the UI:

    Comment actions Permalink
  • Hello
    I need your help explaining the lens

    https://www.youtube.com/watch?v=ETRYKDAWwpQ

    I did not find any explanation for the functioning of the lens

    Comment actions Permalink
  • Hi, sava nozin!

    Sorry for the delay!

    Your question is so interesting but I couldn't find a time to answer it 

    Here is my solution (Works only for the case with different cameras like in your second example but can be extended)

    I created two scripts : DepthHelper and DepthController

    Depth Helper creates touch component for it's sceneObject with specified camera and tells DepthController what touch events were called and DepthController decides which one to call

    //@input Component.Camera camera

    var touchComponent = script.getSceneObject().createComponent("Component.TouchComponent");
    var meshVisual = script.getSceneObject().getComponent("Component.BaseMeshVisual");
    touchComponent.addMeshVisual(meshVisual);
    touchComponent.setCamera(script.camera);

    //get Camera renderOrder to know what's on the top
    var camRenderOrder = script.camera.renderOrder;

    //do same for other touch events

    // on Tap function that will be called if this object is on the top
    function realOnTapFunction(){
    print("Taped on " + script.getSceneObject().name);
    }

    var onTapFunction = global.depthController.getTouchCallback("TapEvent", meshVisual, camRenderOrder, realOnTapFunction);
    script.createEvent("TapEvent").bind(onTapFunction);


    /// Touch Move Event example
    function realOnTouchMoveFunction(){
    print("Moving on " + script.getSceneObject().name);
    }

    var onTouchMoveFunction = global.depthController.getTouchCallback("TouchMoveEvent", meshVisual, camRenderOrder, realOnTouchMoveFunction);
    script.createEvent("TouchMoveEvent").bind(onTouchMoveFunction);

    I added two examples here for tap and touch move

    ( Basically what you need - instead of binding function to touch event, register it to the Depth Controller, that will give you new function, which you would bind to event)

    And DepthController (put it above all helper scripts) collects all triggered events of some type and selects the one with highest render order

    //@input bool debug = true
    var eventPool = {}

    var getTouchCallback = function(eName, meshVisual, camRenderOrder, callBack){

    if(script.debug){
    print("Registered " + eName + " on " + meshVisual.getSceneObject().name + " with render Order " + camRenderOrder);
    }
    var setting = {
    renderOrder : camRenderOrder,
    callBack : callBack
    }
    var func = function (s, e) {
    return function () {
    if(eventPool[e] == undefined){
    eventPool[e] = new Array();
    }
    eventPool[e].push(s)
    }
    } (setting, eName);
    return func;
    }

    script.createEvent("LateUpdateEvent").bind(onLateUpdate);

    function onLateUpdate() {
    for( eventName in eventPool) {
    print(eventPool[eventName].length)
    eventPool[eventName].sort(compare);
    eventPool[eventName][0].callBack();
    }
    eventPool = {};
    }

    if (global.depthController == undefined){
    global.depthController = {
    getTouchCallback : getTouchCallback
    }

    }
    //comparator function. We can add distance to camera or render order here too
    //now it sorts only taking into account camera render order
    //sorts descending
    function compare(a, b) {
    if (a.renderOrder > b.renderOrder) {
    return -1;
    }
    if (a.renderOrder < b.renderOrder) {
    return 1;
    }
    return 0;
    }

    If you are interested I can extend this example on render order of ScreenImages or distance to 3D objects . This probably will not be so precise

    I will definitely push this feature request to our engineers and hopefully we can have it built in studio soon

    Let me know if this is helpful/works for your case or if you need help with integrating this to your project

    Project 

    Best

    Olha

    Comment actions Permalink
  • Hi Olha,

    I ended up solving the issue with touch rejection regions that mask which areas of the screen allow which touch component to activate. It would be nice for the touch components to have this built-in. Like you said there are cases where this method or the render order might not be applicable.

    Thanks,

    Sava

    Comment actions Permalink
  • Just saw the Face Paint lens - it's amazing!

    Comment actions Permalink

We're here to help! We just need a little bit of information...

What system are you using?

Have you downloaded the latest version of Lens Studio?

Please download the latest version of Lens Studio. If you still run into this issue, please come back and report it!

Is this issue causing Lens Studio to crash?

What system do you run Lens Studio on?

Version

Graphics

Follow the next steps to help us solve your issue:

  • Copy and paste this text into your TerminalCommand Window
    open ~/Library/Preferences/Snap/Lens\ Studio/ %LOCALAPPDATA%\Snap\Lens Studio Copy Text
  • Press ReturnEnter to run the command. The Lens Studio folder will automatically open
  • Prepare to upload your files: zip the "Log" Folder by right-clicking and choosing "compress."
    Locate the Log.txt file right above it.

    Attach a screenshot of the issue:

Name:

Email:

What is this most relevant to?

Please enter a brief description of your issue:

Thanks for submitting this issue.

Unfortunately, it's likely due to the operating system or hardware you're using – since they don't meet the system requirements for Lens Studio.

Still, we hear you loud and clear, and are logging the issue in case there's ever a workaround we can provide!

Minimum Requirements

Operating System: Windows 10 (64 bit); MacOS 10.11+

Hardware: Minimum of Intel Core i3 2.5Ghz or AMD Phenom II 2.6Ghz with 4 GB RAM; Intel HD Graphics 4000 / Nvidia GeForce 710 / AMD Radeon HD 6450 or better; screen resolution of 1280x768 or higher

We'll try to resolve this issue as soon as possible. Thanks for letting us know about it!

Keep an eye out for a followup email from us. We may have a couple more questions for you, or we might already have a solution to offer.

Happy creating!