@prefix : . @prefix owl: . @prefix rdf: . @prefix rdfs: . @prefix schema: . @prefix dcterms: . @prefix xsd: . @prefix x3d: . @prefix x3do: . :X3D a owl:NamedIndividual, x3do:X3D ; x3do:hasHead :head ; x3do:hasScene :Scene ; x3do:profile 'Immersive' ; x3do:version '3.0' ; x3do:noNamespaceSchemaLocation 'https://www.web3d.org/specifications/x3d-3.0.xsd' . :head a owl:NamedIndividual, x3do:head ; x3do:hasParent :X3D ; x3do:hasMeta :meta_1_1, :meta_1_2, :meta_1_3, :meta_1_4, :meta_1_5, :meta_1_6, :meta_1_7, :meta_1_8, :meta_1_9, :meta_1_10, :meta_1_11 . :meta_1_1 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content 'DoubleClickTouchSensorPrototype.x3d' ; x3do:name 'title' . :meta_1_2 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content 'Double-click TouchSensor design pattern, implemented as a reusable prototype node.' ; x3do:name 'description' . :meta_1_3 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content 'Don Brutzman' ; x3do:name 'creator' . :meta_1_4 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content '26 May 2004' ; x3do:name 'created' . :meta_1_5 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content '6 June 2020' ; x3do:name 'modified' . :meta_1_6 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content 'DoubleClickTouchSensorExample.x3d' ; x3do:name 'reference' . :meta_1_7 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content 'https://www.web3d.org/x3d/specifications/ISO-IEC-19775-FDIS-X3dAbstractSpecification/Part01/components/pointingsensor.html#TouchSensor' ; x3do:name 'reference' . :meta_1_8 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content 'DoubleClickTouchSensor' ; x3do:name 'subject' . :meta_1_9 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content 'https://savage.nps.edu/Savage/Tools/Animation/DoubleClickTouchSensorPrototype.x3d' ; x3do:name 'identifier' . :meta_1_10 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content 'X3D-Edit 3.2, https://savage.nps.edu/X3D-Edit' ; x3do:name 'generator' . :meta_1_11 a owl:NamedIndividual, x3do:meta ; x3do:hasParent :head ; x3do:content '../../license.html' ; x3do:name 'license' . :meta dcterms:title "DoubleClickTouchSensorPrototype.x3d" . :meta dcterms:description "Double-click TouchSensor design pattern, implemented as a reusable prototype node." . :meta dcterms:creator "Don Brutzman" . :meta dcterms:created "26 May 2004" . :meta dcterms:modified "6 June 2020" . :meta dcterms:reference "DoubleClickTouchSensorExample.x3d" . :meta dcterms:reference "https://www.web3d.org/x3d/specifications/ISO-IEC-19775-FDIS-X3dAbstractSpecification/Part01/components/pointingsensor.html#TouchSensor" . :meta dcterms:subject "DoubleClickTouchSensor" . :meta dcterms:identifier "https://savage.nps.edu/Savage/Tools/Animation/DoubleClickTouchSensorPrototype.x3d" . :meta dcterms:generator "X3D-Edit 3.2, https://savage.nps.edu/X3D-Edit" . :meta dcterms:license "../../license.html" . :Scene a owl:NamedIndividual, x3do:Scene ; x3do:hasParent :X3D ; x3do:hasChildren :WorldInfo_2_1, :Anchor_2_3 ; x3do:hasProtoDeclare :ProtoDeclare_2_2 . :WorldInfo_2_1 a owl:NamedIndividual, x3do:WorldInfo ; x3do:hasParent :Scene ; x3do:title 'DoubleClickTouchSensorPrototype.x3d' . :ProtoDeclare_2_2 a owl:NamedIndividual, x3do:ProtoDeclare ; x3do:hasParent :Scene ; x3do:hasProtoInterface :ProtoInterface_2_2_1 ; x3do:hasProtoBody :ProtoBody_2_2_2 ; x3do:appinfo 'DoubleClickTouchSensor functionality activates when user double clicks (or double selects) within maxDelayInterval' ; x3do:name 'DoubleClickTouchSensor' . :ProtoInterface_2_2_1 a owl:NamedIndividual, x3do:ProtoInterface ; x3do:hasParent :ProtoDeclare_2_2 ; x3do:hasField :field_2_2_1_1, :field_2_2_1_2, :field_2_2_1_3, :field_2_2_1_4, :field_2_2_1_5, :field_2_2_1_6, :field_2_2_1_7, :field_2_2_1_8, :field_2_2_1_9, :field_2_2_1_10, :field_2_2_1_11 . :field_2_2_1_1 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'inputOutput' ; x3do:appinfo 'describe the purpose of this sensor' ; x3do:name 'description' ; x3do:type 'SFString' . :field_2_2_1_2 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'initializeOnly' ; x3do:appinfo 'seconds' ; x3do:name 'maxDelayInterval' ; x3do:type 'SFTime' ; x3do:value '0.5' . :field_2_2_1_3 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'inputOutput' ; x3do:name 'enabled' ; x3do:type 'SFBool' ; x3do:value true . :field_2_2_1_4 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'outputOnly' ; x3do:name 'isActive' ; x3do:type 'SFBool' . :field_2_2_1_5 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'outputOnly' ; x3do:name 'isOver' ; x3do:type 'SFBool' . :field_2_2_1_6 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'outputOnly' ; x3do:appinfo 'seconds' ; x3do:name 'touchTime' ; x3do:type 'SFTime' . :field_2_2_1_7 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'outputOnly' ; x3do:name 'hitPoint_changed' ; x3do:type 'SFVec3f' . :field_2_2_1_8 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'outputOnly' ; x3do:name 'hitNormal_changed' ; x3do:type 'SFVec3f' . :field_2_2_1_9 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'outputOnly' ; x3do:name 'hitTexCoord_changed' ; x3do:type 'SFVec2f' . :field_2_2_1_10 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'initializeOnly' ; x3do:appinfo 'can contain one of Metadata nodes' ; x3do:name 'metadata' ; x3do:type 'SFNode' . :field_2_2_1_11 a owl:NamedIndividual, x3do:field ; x3do:hasParent :ProtoInterface_2_2_1 ; x3do:accessType 'initializeOnly' ; x3do:name 'traceEnabled' ; x3do:type 'SFBool' ; x3do:value false . :ProtoBody_2_2_2 a owl:NamedIndividual, x3do:ProtoBody ; x3do:hasParent :ProtoDeclare_2_2 ; x3do:hasChildren :TouchSensorNode, :Group_2_2_2_2 . :TouchSensorNode a owl:NamedIndividual, x3do:TouchSensor ; x3do:hasParent :ProtoBody_2_2_2 ; x3do:hasIS :IS_2_2_2_1_1 ; x3do:DEF 'TouchSensorNode' . :IS_2_2_2_1_1 a owl:NamedIndividual, x3do:IS ; x3do:hasParent :TouchSensorNode ; x3do:hasConnect :connect_2_2_2_1_1_1, :connect_2_2_2_1_1_2, :connect_2_2_2_1_1_3 . :connect_2_2_2_1_1_1 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_1_1 ; x3do:nodeField 'description' ; x3do:protoField 'description' . :connect_2_2_2_1_1_2 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_1_1 ; x3do:nodeField 'enabled' ; x3do:protoField 'enabled' . :connect_2_2_2_1_1_3 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_1_1 ; x3do:nodeField 'isOver' ; x3do:protoField 'isOver' . :Group_2_2_2_2 a owl:NamedIndividual, x3do:Group ; x3do:hasParent :ProtoBody_2_2_2 ; x3do:hasChildren :DoubleClickTouchScript, :MetadataHolder ; x3do:hasROUTE :ROUTE_2_2_2_2_2 . :DoubleClickTouchScript a owl:NamedIndividual, x3do:Script ; x3do:hasParent :Group_2_2_2_2 ; x3do:hasField :field_2_2_2_2_1_1, :field_2_2_2_2_1_2, :field_2_2_2_2_1_3, :field_2_2_2_2_1_4, :field_2_2_2_2_1_5, :field_2_2_2_2_1_6, :field_2_2_2_2_1_7, :field_2_2_2_2_1_8, :field_2_2_2_2_1_9, :field_2_2_2_2_1_10, :field_2_2_2_2_1_11, :field_2_2_2_2_1_12 ; x3do:hasIS :IS_2_2_2_2_1_13 ; x3do:DEF 'DoubleClickTouchScript' ; x3do:directOutput true ; x3do:sourceCode """ ecmascript: // inputOnly events are handled by functions, // initializeOnly fields are variable objects, // outputOnly events are sent by setting values function initialize () { tracePrint ('initialize (); enabled=' + touchSensor.enabled); } // trigger on isActive to filter touchTime events when unclicking function checkClicks (value, timestamp) // activated from TouchSensorNode.isActive { if (value == false) // doubleClick isActive=false events { if (isActive == true) // need to unclick { isActive = false; // send output events touchTime = timestamp; tracePrint ('DoubleClick isActive=false;'); } return; } priorTouchTime = currentTouchTime; currentTouchTime = timestamp; computedDelay = (currentTouchTime - priorTouchTime); if (priorTouchTime == -1) { tracePrint ('priorTouchTime == -1, return;'); return; } else if (computedDelay <= maxDelayInterval) { tracePrint ('computedDelay=' + computedDelay + ', DoubleClick isActive=true;'); isActive = true; // send output events touchTime = timestamp; hitPoint_changed = touchSensor.hitPoint_changed; hitNormal_changed = touchSensor.hitNormal_changed; hitTexCoord_changed = touchSensor.hitTexCoord_changed; } else { tracePrint ('computedDelay=' + computedDelay + ', single click'); return; } } function set_description (newDescription) { description = newDescription; } function tracePrint (outputString) { if (traceEnabled) Browser.println ('[DoubleClickTouchSensor] ' + outputString); } """ . :field_2_2_2_2_1_1 a owl:NamedIndividual, x3do:field ; x3do:hasParent :DoubleClickTouchScript ; x3do:accessType 'inputOutput' ; x3do:name 'description' ; x3do:type 'SFString' . :field_2_2_2_2_1_2 a owl:NamedIndividual, x3do:field ; x3do:hasParent :DoubleClickTouchScript ; x3do:accessType 'inputOnly' ; x3do:name 'checkClicks' ; x3do:type 'SFBool' . :field_2_2_2_2_1_3 a owl:NamedIndividual, x3do:field ; x3do:hasParent :DoubleClickTouchScript ; x3do:accessType 'initializeOnly' ; x3do:appinfo 'seconds' ; x3do:name 'maxDelayInterval' ; x3do:type 'SFTime' . :field_2_2_2_2_1_4 a owl:NamedIndividual, x3do:field ; x3do:hasParent :DoubleClickTouchScript ; x3do:accessType 'initializeOnly' ; x3do:name 'priorTouchTime' ; x3do:type 'SFTime' ; x3do:value '-1' . :field_2_2_2_2_1_5 a owl:NamedIndividual, x3do:field ; x3do:hasParent :DoubleClickTouchScript ; x3do:accessType 'initializeOnly' ; x3do:name 'currentTouchTime' ; x3do:type 'SFTime' ; x3do:value '-1' . :field_2_2_2_2_1_6 a owl:NamedIndividual, x3do:field ; x3do:hasParent :DoubleClickTouchScript ; x3do:hasChildren :TouchSensorNode-USE-1 ; x3do:accessType 'initializeOnly' ; x3do:appinfo 'permits controlled access to various TouchSensorNode fields' ; x3do:name 'touchSensor' ; x3do:type 'SFNode' . :TouchSensorNode-USE-1 a owl:NamedIndividual, x3do:TouchSensor ; x3do:hasParent :field_2_2_2_2_1_6 ; owl:sameAs :TouchSensorNode . # DEF matching this USE :field_2_2_2_2_1_7 a owl:NamedIndividual, x3do:field ; x3do:hasParent :DoubleClickTouchScript ; x3do:accessType 'outputOnly' ; x3do:name 'isActive' ; x3do:type 'SFBool' . :field_2_2_2_2_1_8 a owl:NamedIndividual, x3do:field ; x3do:hasParent :DoubleClickTouchScript ; x3do:accessType 'outputOnly' ; x3do:appinfo 'seconds' ; x3do:name 'touchTime' ; x3do:type 'SFTime' . :field_2_2_2_2_1_9 a owl:NamedIndividual, x3do:field ; x3do:hasParent :DoubleClickTouchScript ; x3do:accessType 'outputOnly' ; x3do:name 'hitPoint_changed' ; x3do:type 'SFVec3f' . :field_2_2_2_2_1_10 a owl:NamedIndividual, x3do:field ; x3do:hasParent :DoubleClickTouchScript ; x3do:accessType 'outputOnly' ; x3do:name 'hitNormal_changed' ; x3do:type 'SFVec3f' . :field_2_2_2_2_1_11 a owl:NamedIndividual, x3do:field ; x3do:hasParent :DoubleClickTouchScript ; x3do:accessType 'outputOnly' ; x3do:name 'hitTexCoord_changed' ; x3do:type 'SFVec2f' . :field_2_2_2_2_1_12 a owl:NamedIndividual, x3do:field ; x3do:hasParent :DoubleClickTouchScript ; x3do:accessType 'initializeOnly' ; x3do:name 'traceEnabled' ; x3do:type 'SFBool' . :IS_2_2_2_2_1_13 a owl:NamedIndividual, x3do:IS ; x3do:hasParent :DoubleClickTouchScript ; x3do:hasConnect :connect_2_2_2_2_1_13_1, :connect_2_2_2_2_1_13_2, :connect_2_2_2_2_1_13_3, :connect_2_2_2_2_1_13_4, :connect_2_2_2_2_1_13_5, :connect_2_2_2_2_1_13_6, :connect_2_2_2_2_1_13_7, :connect_2_2_2_2_1_13_8 . :connect_2_2_2_2_1_13_1 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_1_13 ; x3do:nodeField 'description' ; x3do:protoField 'description' . :connect_2_2_2_2_1_13_2 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_1_13 ; x3do:nodeField 'maxDelayInterval' ; x3do:protoField 'maxDelayInterval' . :connect_2_2_2_2_1_13_3 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_1_13 ; x3do:nodeField 'isActive' ; x3do:protoField 'isActive' . :connect_2_2_2_2_1_13_4 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_1_13 ; x3do:nodeField 'touchTime' ; x3do:protoField 'touchTime' . :connect_2_2_2_2_1_13_5 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_1_13 ; x3do:nodeField 'hitPoint_changed' ; x3do:protoField 'hitPoint_changed' . :connect_2_2_2_2_1_13_6 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_1_13 ; x3do:nodeField 'hitNormal_changed' ; x3do:protoField 'hitNormal_changed' . :connect_2_2_2_2_1_13_7 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_1_13 ; x3do:nodeField 'hitTexCoord_changed' ; x3do:protoField 'hitTexCoord_changed' . :connect_2_2_2_2_1_13_8 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_1_13 ; x3do:nodeField 'traceEnabled' ; x3do:protoField 'traceEnabled' . :ROUTE_2_2_2_2_2 a owl:NamedIndividual, x3do:ROUTE ; x3do:hasParent :Group_2_2_2_2 ; x3do:fromField 'isActive' ; x3do:fromNode 'TouchSensorNode' ; x3do:toField 'checkClicks' ; x3do:toNode 'DoubleClickTouchScript' . :MetadataHolder a owl:NamedIndividual, x3do:Collision ; x3do:hasParent :Group_2_2_2_2 ; x3do:hasIS :IS_2_2_2_2_3_1 ; x3do:DEF 'MetadataHolder' ; x3do:enabled false . :IS_2_2_2_2_3_1 a owl:NamedIndividual, x3do:IS ; x3do:hasParent :MetadataHolder ; x3do:hasConnect :connect_2_2_2_2_3_1_1 . :connect_2_2_2_2_3_1_1 a owl:NamedIndividual, x3do:connect ; x3do:hasParent :IS_2_2_2_2_3_1 ; x3do:nodeField 'proxy' ; x3do:protoField 'metadata' . :Anchor_2_3 a owl:NamedIndividual, x3do:Anchor ; x3do:hasParent :Scene ; x3do:hasChildren :Shape_2_3_1 ; x3do:description 'DoubleClickTouchSensor Example' ; x3do:parameter '"target=_blank"' ; x3do:url '"DoubleClickTouchSensorExample.x3d" "https://savage.nps.edu/Savage/Tools/Animation/DoubleClickTouchSensorExample.x3d" "DoubleClickTouchSensorExample.wrl" "https://savage.nps.edu/Savage/Tools/Animation/DoubleClickTouchSensorExample.wrl"' . :Shape_2_3_1 a owl:NamedIndividual, x3do:Shape ; x3do:hasParent :Anchor_2_3 ; x3do:hasGeometry :Text_2_3_1_1 ; x3do:hasAppearance :Appearance_2_3_1_2 . :Text_2_3_1_1 a owl:NamedIndividual, x3do:Text ; x3do:hasParent :Shape_2_3_1 ; x3do:hasFontStyle :FontStyle_2_3_1_1_1 ; x3do:string '"DoubleClickTouchSensorPrototype" "defines a prototype" "" "Click text to see" "DoubleClickTouchSensorExample scene"' . :FontStyle_2_3_1_1_1 a owl:NamedIndividual, x3do:FontStyle ; x3do:hasParent :Text_2_3_1_1 ; x3do:justify '"MIDDLE" "MIDDLE"' ; x3do:size 0.7 . :Appearance_2_3_1_2 a owl:NamedIndividual, x3do:Appearance ; x3do:hasParent :Shape_2_3_1 ; x3do:hasMaterial :Material_2_3_1_2_1 . :Material_2_3_1_2_1 a owl:NamedIndividual, x3do:Material ; x3do:hasParent :Appearance_2_3_1_2 ; x3do:diffuseColor ( 1 1 0.2 ) .