Search code examples
prototyperoutesvrml

VRML: ROUTE as a parameter in PROTO


I have a PROTO of some object with TouchSensor and I'd like to link different ROUTEs to it when creating objects

e.g. I have

PROTO plate[]
{
  Shape {..something..}
  DEF TS TouchSensor {} 
}

I want to call

plate{ROUTE ...}
plate{ROUTE ...}

with different ROUTEs, but having one PROTO

How to implement this?

Thanks


Solution

  • You would use IS to expose the event from the TouchSensor in the prototype.

    For example:

    #VRML V2.0 utf8
    
    # First, define the prototype "plate".
    PROTO plate [
        eventOut SFTime touched
        exposedField SFVec3f translation 0 0 0
    ]{
    
        Transform {
            translation IS translation
            children Shape{
                appearance Appearance {material Material {}}
                geometry Sphere{}
            }
        }
        TouchSensor{touchTime IS touched}
    }
    
    
    # Then create one or several instances of the object
    DEF plate1 plate{translation -2 0 0}
    DEF plate2 plate{translation 2 0 0}
    
    
    
    DEF myscript Script{
        eventIn SFTime receive_event
        url "javascript:
        function receive_event(){
            trace('A sphere was clicked');
        }
        "
    }
    
    # Each instance had a different DEF name, so you can choose where to send the event independently from each other
    # but for the example, I send them both to a script that says in the console when it was clicked
    ROUTE plate1.touched TO myscript.receive_event
    ROUTE plate2.touched TO myscript.receive_event