From a82a9d1131f01793635248a7f9754027994943f1 Mon Sep 17 00:00:00 2001 From: Russell Toris Date: Wed, 5 Jun 2013 11:21:38 -0400 Subject: [PATCH 1/5] docs updated for r5 --- doc/Arrow.js.html | 4 +- doc/Axes.js.html | 4 +- doc/DepthCloud.js.html | 363 ++++++++++++++++++++++++ doc/Grid.js.html | 4 +- doc/Highlighter.js.html | 4 +- doc/InteractiveMarker.js.html | 4 +- doc/InteractiveMarkerClient.js.html | 4 +- doc/InteractiveMarkerControl.js.html | 4 +- doc/InteractiveMarkerHandle.js.html | 4 +- doc/InteractiveMarkerMenu.js.html | 4 +- doc/Marker.js.html | 4 +- doc/MarkerClient.js.html | 4 +- doc/MeshResource.js.html | 4 +- doc/MouseHandler.js.html | 4 +- doc/OccupancyGrid.js.html | 4 +- doc/OccupancyGridClient.js.html | 4 +- doc/OrbitControls.js.html | 4 +- doc/ROS3D.Arrow.html | 4 +- doc/ROS3D.Axes.html | 4 +- doc/ROS3D.DepthCloud.html | 195 +++++++++++++ doc/ROS3D.Grid.html | 4 +- doc/ROS3D.Highlighter.html | 4 +- doc/ROS3D.InteractiveMarker.html | 4 +- doc/ROS3D.InteractiveMarkerClient.html | 4 +- doc/ROS3D.InteractiveMarkerControl.html | 4 +- doc/ROS3D.InteractiveMarkerHandle.html | 4 +- doc/ROS3D.InteractiveMarkerMenu.html | 4 +- doc/ROS3D.Marker.html | 4 +- doc/ROS3D.MarkerClient.html | 4 +- doc/ROS3D.MeshResource.html | 4 +- doc/ROS3D.MouseHandler.html | 4 +- doc/ROS3D.OccupancyGrid.html | 4 +- doc/ROS3D.OccupancyGridClient.html | 4 +- doc/ROS3D.OrbitControls.html | 4 +- doc/ROS3D.SceneNode.html | 4 +- doc/ROS3D.TriangleList.html | 4 +- doc/ROS3D.Urdf.html | 4 +- doc/ROS3D.UrdfClient.html | 4 +- doc/ROS3D.Viewer.html | 6 +- doc/Ros3D.js.html | 6 +- doc/SceneNode.js.html | 4 +- doc/TriangleList.js.html | 4 +- doc/Urdf.js.html | 4 +- doc/UrdfClient.js.html | 4 +- doc/Viewer.js.html | 6 +- doc/global.html | 4 +- doc/index.html | 4 +- 47 files changed, 651 insertions(+), 93 deletions(-) create mode 100644 doc/DepthCloud.js.html create mode 100644 doc/ROS3D.DepthCloud.html diff --git a/doc/Arrow.js.html b/doc/Arrow.js.html index ae19b0ae..0845b785 100644 --- a/doc/Arrow.js.html +++ b/doc/Arrow.js.html @@ -116,13 +116,13 @@

Source: models/Arrow.js


diff --git a/doc/Axes.js.html b/doc/Axes.js.html index 9fd3dc97..5735b5eb 100644 --- a/doc/Axes.js.html +++ b/doc/Axes.js.html @@ -105,13 +105,13 @@

Source: models/Axes.js


diff --git a/doc/DepthCloud.js.html b/doc/DepthCloud.js.html new file mode 100644 index 00000000..5aa69677 --- /dev/null +++ b/doc/DepthCloud.js.html @@ -0,0 +1,363 @@ + + + + + JSDoc: Source: depthcloud/DepthCloud.js + + + + + + + + + + +
+ +

Source: depthcloud/DepthCloud.js

+ + + + + +
+
+
/**
+ * @author Julius Kammerl - jkammerl@willowgarage.com
+ */
+
+/**
+ * The DepthCloud object.
+ *
+ * @constructor
+ * @param options - object with following keys:
+ *  * f - The camera's focal length
+ *  * pointSize - Point size (pixels) for rendered point cloud
+ *  * width, height - Dimensions of the video stream
+ *  * whiteness - Blends rgb values to white (0..100)
+ *  * varianceThreshold - Threshold for variance filter, used for compression artifact removal
+ */
+ROS3D.DepthCloud = function(options) {
+
+  THREE.Object3D.call(this);
+
+  // ///////////////////////////
+  // depth cloud options
+  // ///////////////////////////
+
+  this.url = options.url;
+  // f defaults to standard Kinect calibration
+  this.f = (options.f !== undefined) ? options.f : 526;
+  this.pointSize = (options.pointSize !== undefined) ? options.pointSize : 3;
+  this.width = (options.width !== undefined) ? options.width : 1024;
+  this.height = (options.height !== undefined) ? options.height : 1024;
+  this.whiteness = (options.whiteness !== undefined) ? options.whiteness : 0;
+  this.varianceThreshold = (options.varianceThreshold !== undefined) ? options.varianceThreshold : 0.000016667;
+
+  var metaLoaded = false;
+  this.video = document.createElement('video');
+
+  this.video.addEventListener('loadedmetadata', this.metaLoaded.bind(this), false);
+
+  this.video.loop = true;
+  this.video.src = this.url;
+  this.video.crossOrigin = 'Anonymous';
+  this.video.setAttribute('crossorigin', 'Anonymous');
+
+  // ///////////////////////////
+  // load shaders
+  // ///////////////////////////
+  this.vertex_shader = [
+    'uniform sampler2D map;',
+    '',
+    'uniform float width;',
+    'uniform float height;',
+    'uniform float nearClipping, farClipping;',
+    '',
+    'uniform float pointSize;',
+    'uniform float zOffset;',
+    '',
+    'uniform float focallength;',
+    '',
+    'varying vec2 vUvP;',
+    'varying vec2 colorP;',
+    '',
+    'varying float depthVariance;',
+    'varying float maskVal;',
+    '',
+    'float sampleDepth(vec2 pos)',
+    '  {',
+    '    float depth;',
+    '    ',
+    '    vec2 vUv = vec2( pos.x / (width*2.0), pos.y / (height*2.0)+0.5 );',
+    '    vec2 vUv2 = vec2( pos.x / (width*2.0)+0.5, pos.y / (height*2.0)+0.5 );',
+    '    ',
+    '    vec4 depthColor = texture2D( map, vUv );',
+    '    ',
+    '    depth = ( depthColor.r + depthColor.g + depthColor.b ) / 3.0 ;',
+    '    ',
+    '    if (depth>0.99)',
+    '    {',
+    '      vec4 depthColor2 = texture2D( map, vUv2 );',
+    '      float depth2 = ( depthColor2.r + depthColor2.g + depthColor2.b ) / 3.0 ;',
+    '      depth = 0.99+depth2;',
+    '    }',
+    '    ',
+    '    return depth;',
+    '  }',
+    '',
+    'float median(float a, float b, float c)',
+    '  {',
+    '    float r=a;',
+    '    ',
+    '    if ( (a<b) && (b<c) )',
+    '    {',
+    '      r = b;',
+    '    }',
+    '    if ( (a<c) && (c<b) )',
+    '    {',
+    '      r = c;',
+    '    }',
+    '    return r;',
+    '  }',
+    '',
+    'float variance(float d1, float d2, float d3, float d4, float d5, float d6, float d7, float d8, float d9)',
+    '  {',
+    '    float mean = (d1 + d2 + d3 + d4 + d5 + d6 + d7 + d8 + d9) / 9.0;',
+    '    float t1 = (d1-mean);',
+    '    float t2 = (d2-mean);',
+    '    float t3 = (d3-mean);',
+    '    float t4 = (d4-mean);',
+    '    float t5 = (d5-mean);',
+    '    float t6 = (d6-mean);',
+    '    float t7 = (d7-mean);',
+    '    float t8 = (d8-mean);',
+    '    float t9 = (d9-mean);',
+    '    float v = (t1*t1+t2*t2+t3*t3+t4*t4+t5*t5+t6*t6+t7*t7+t8*t8+t9*t9)/9.0;',
+    '    return v;',
+    '  }',
+    '',
+    'vec2 decodeDepth(vec2 pos)',
+    '  {',
+    '    vec2 ret;',
+    '    ',
+    '    ',
+    '    float depth1 = sampleDepth(vec2(position.x-1.0, position.y-1.0));',
+    '    float depth2 = sampleDepth(vec2(position.x, position.y-1.0));',
+    '    float depth3 = sampleDepth(vec2(position.x+1.0, position.y-1.0));',
+    '    float depth4 = sampleDepth(vec2(position.x-1.0, position.y));',
+    '    float depth5 = sampleDepth(vec2(position.x, position.y));',
+    '    float depth6 = sampleDepth(vec2(position.x+1.0, position.y));',
+    '    float depth7 = sampleDepth(vec2(position.x-1.0, position.y+1.0));',
+    '    float depth8 = sampleDepth(vec2(position.x, position.y+1.0));',
+    '    float depth9 = sampleDepth(vec2(position.x+1.0, position.y+1.0));',
+    '    ',
+    '    float median1 = median(depth1, depth2, depth3);',
+    '    float median2 = median(depth4, depth5, depth6);',
+    '    float median3 = median(depth7, depth8, depth9);',
+    '    ',
+    '    ret.x = median(median1, median2, median3);',
+    '    ret.y = variance(depth1, depth2, depth3, depth4, depth5, depth6, depth7, depth8, depth9);',
+    '    ',
+    '    return ret;',
+    '    ',
+    '  }',
+    '',
+    '',
+    'void main() {',
+    '  ',
+    '  vUvP = vec2( position.x / (width*2.0), position.y / (height*2.0)+0.5 );',
+    '  colorP = vec2( position.x / (width*2.0)+0.5 , position.y / (height*2.0)  );',
+    '  ',
+    '  vec4 pos = vec4(0.0,0.0,0.0,0.0);',
+    '  depthVariance = 0.0;',
+    '  ',
+    '  if ( (vUvP.x<0.0)|| (vUvP.x>0.5) || (vUvP.y<0.5) || (vUvP.y>0.0))',
+    '  {',
+    '    vec2 smp = decodeDepth(vec2(position.x, position.y));',
+    '    float depth = smp.x;',
+    '    depthVariance = smp.y;',
+    '    ',
+    '    float z = -depth;',
+    '    ',
+    '    pos = vec4(',
+    '      ( position.x / width - 0.5 ) * z * (1000.0/focallength) * -1.0,',
+    '      ( position.y / height - 0.5 ) * z * (1000.0/focallength),',
+    '      (- z + zOffset / 1000.0) * 2.0,',
+    '      1.0);',
+    '    ',
+    '    vec2 maskP = vec2( position.x / (width*2.0), position.y / (height*2.0)  );',
+    '    vec4 maskColor = texture2D( map, maskP );',
+    '    maskVal = ( maskColor.r + maskColor.g + maskColor.b ) / 3.0 ;',
+    '  }',
+    '  ',
+    '  gl_PointSize = pointSize;',
+    '  gl_Position = projectionMatrix * modelViewMatrix * pos;',
+    '  ',
+    '}'
+    ].join('\n');
+
+  this.fragment_shader = [
+    'uniform sampler2D map;',
+    'uniform float varianceThreshold;',
+    'uniform float whiteness;',
+    '',
+    'varying vec2 vUvP;',
+    'varying vec2 colorP;',
+    '',
+    'varying float depthVariance;',
+    'varying float maskVal;',
+    '',
+    '',
+    'void main() {',
+    '  ',
+    '  vec4 color;',
+    '  ',
+    '  if ( (depthVariance>varianceThreshold) || (maskVal>0.5) ||(vUvP.x<0.0)|| (vUvP.x>0.5) || (vUvP.y<0.5) || (vUvP.y>1.0))',
+    '  {  ',
+    '    discard;',
+    '  }',
+    '  else ',
+    '  {',
+    '    color = texture2D( map, colorP );',
+    '    ',
+    '    float fader = whiteness /100.0;',
+    '    ',
+    '    color.r = color.r * (1.0-fader)+ fader;',
+    '    ',
+    '    color.g = color.g * (1.0-fader)+ fader;',
+    '    ',
+    '    color.b = color.b * (1.0-fader)+ fader;',
+    '    ',
+    '    color.a = 1.0;//smoothstep( 20000.0, -20000.0, gl_FragCoord.z / gl_FragCoord.w );',
+    '  }',
+    '  ',
+    '  gl_FragColor = vec4( color.r, color.g, color.b, color.a );',
+    '  ',
+    '}'
+    ].join('\n');
+};
+ROS3D.DepthCloud.prototype.__proto__ = THREE.Object3D.prototype;
+
+/*
+ * Callback called when video metadata is ready
+ */
+ROS3D.DepthCloud.prototype.metaLoaded = function() {
+  this.metaLoaded = true;
+  this.initStreamer();
+};
+
+/*
+ * Callback called when video metadata is ready
+ */
+ROS3D.DepthCloud.prototype.initStreamer = function() {
+
+  if (this.metaLoaded) {
+    this.texture = new THREE.Texture(this.video);
+    this.geometry = new THREE.Geometry();
+
+    for (var i = 0, l = this.width * this.height; i < l; i++) {
+
+      var vertex = new THREE.Vector3();
+      vertex.x = (i % this.width);
+      vertex.y = Math.floor(i / this.width);
+
+      this.geometry.vertices.push(vertex);
+    }
+
+    this.material = new THREE.ShaderMaterial({
+
+      uniforms : {
+
+        'map' : {
+          type : 't',
+          value : this.texture
+        },
+        'width' : {
+          type : 'f',
+          value : this.width
+        },
+        'height' : {
+          type : 'f',
+          value : this.height
+        },
+        'focallength' : {
+          type : 'f',
+          value : this.f
+        },
+        'pointSize' : {
+          type : 'f',
+          value : this.pointSize
+        },
+        'zOffset' : {
+          type : 'f',
+          value : 0
+        },
+        'whiteness' : {
+          type : 'f',
+          value : this.whiteness
+        },
+        'varianceThreshold' : {
+          type : 'f',
+          value : this.varianceThreshold
+        }
+      },
+      vertexShader : this.vertex_shader,
+      fragmentShader : this.fragment_shader
+      // depthWrite: false
+
+    });
+
+    this.mesh = new THREE.ParticleSystem(this.geometry, this.material);
+    this.mesh.position.x = 0;
+    this.mesh.position.y = 0;
+    this.add(this.mesh);
+
+    var that = this;
+
+    setInterval(function() {
+      if (that.video.readyState === that.video.HAVE_ENOUGH_DATA) {
+        that.texture.needsUpdate = true;
+      }
+    }, 1000 / 30);
+  }
+};
+
+/*
+ * Start video playback
+ */
+ROS3D.DepthCloud.prototype.startStream = function() {
+  this.video.play();
+};
+
+/*
+ * Stop video playback
+ */
+ROS3D.DepthCloud.prototype.stopStream = function() {
+  this.video.stop();
+};
+
+
+
+ + + + +
+ + + +
+ + + + + + diff --git a/doc/Grid.js.html b/doc/Grid.js.html index 6a3a2548..f2cc1d40 100644 --- a/doc/Grid.js.html +++ b/doc/Grid.js.html @@ -64,13 +64,13 @@

Source: models/Grid.js


diff --git a/doc/Highlighter.js.html b/doc/Highlighter.js.html index 85b391da..7144505b 100644 --- a/doc/Highlighter.js.html +++ b/doc/Highlighter.js.html @@ -130,13 +130,13 @@

Source: visualization/interaction/Highlighter.js


diff --git a/doc/InteractiveMarker.js.html b/doc/InteractiveMarker.js.html index 7d3683ea..f50b2554 100644 --- a/doc/InteractiveMarker.js.html +++ b/doc/InteractiveMarker.js.html @@ -336,13 +336,13 @@

Source: interactivemarkers/InteractiveMarker.js


diff --git a/doc/InteractiveMarkerClient.js.html b/doc/InteractiveMarkerClient.js.html index f36990ed..8077923f 100644 --- a/doc/InteractiveMarkerClient.js.html +++ b/doc/InteractiveMarkerClient.js.html @@ -218,13 +218,13 @@

Source: interactivemarkers/InteractiveMarkerClient.js


diff --git a/doc/InteractiveMarkerControl.js.html b/doc/InteractiveMarkerControl.js.html index a3af7fe4..20e58fca 100644 --- a/doc/InteractiveMarkerControl.js.html +++ b/doc/InteractiveMarkerControl.js.html @@ -216,13 +216,13 @@

Source: interactivemarkers/InteractiveMarkerControl.js
- Documentation generated by JSDoc 3.2.0-dev on Mon Apr 15 2013 09:10:16 GMT-0700 (PDT) + Documentation generated by JSDoc 3.2.0-dev on Wed Jun 05 2013 11:21:12 GMT-0400 (EDT)
diff --git a/doc/InteractiveMarkerHandle.js.html b/doc/InteractiveMarkerHandle.js.html index 06a1ccef..e63d08c4 100644 --- a/doc/InteractiveMarkerHandle.js.html +++ b/doc/InteractiveMarkerHandle.js.html @@ -207,13 +207,13 @@

Source: interactivemarkers/InteractiveMarkerHandle.js


diff --git a/doc/InteractiveMarkerMenu.js.html b/doc/InteractiveMarkerMenu.js.html index 5cd20b2e..37aef3e8 100644 --- a/doc/InteractiveMarkerMenu.js.html +++ b/doc/InteractiveMarkerMenu.js.html @@ -201,13 +201,13 @@

Source: interactivemarkers/InteractiveMarkerMenu.js


diff --git a/doc/Marker.js.html b/doc/Marker.js.html index bebf35e0..8ab1cf2d 100644 --- a/doc/Marker.js.html +++ b/doc/Marker.js.html @@ -226,13 +226,13 @@

Source: markers/Marker.js


diff --git a/doc/MarkerClient.js.html b/doc/MarkerClient.js.html index 40c00a81..1b9bc340 100644 --- a/doc/MarkerClient.js.html +++ b/doc/MarkerClient.js.html @@ -90,13 +90,13 @@

Source: markers/MarkerClient.js


diff --git a/doc/MeshResource.js.html b/doc/MeshResource.js.html index 260b54bc..f40e12d5 100644 --- a/doc/MeshResource.js.html +++ b/doc/MeshResource.js.html @@ -86,13 +86,13 @@

Source: models/MeshResource.js


diff --git a/doc/MouseHandler.js.html b/doc/MouseHandler.js.html index fd6bb45e..a5ba6766 100644 --- a/doc/MouseHandler.js.html +++ b/doc/MouseHandler.js.html @@ -193,13 +193,13 @@

Source: visualization/interaction/MouseHandler.js


diff --git a/doc/OccupancyGrid.js.html b/doc/OccupancyGrid.js.html index 12c3a87e..260f7931 100644 --- a/doc/OccupancyGrid.js.html +++ b/doc/OccupancyGrid.js.html @@ -107,13 +107,13 @@

Source: maps/OccupancyGrid.js


diff --git a/doc/OccupancyGridClient.js.html b/doc/OccupancyGridClient.js.html index 6b956df1..486ff99a 100644 --- a/doc/OccupancyGridClient.js.html +++ b/doc/OccupancyGridClient.js.html @@ -105,13 +105,13 @@

Source: maps/OccupancyGridClient.js


diff --git a/doc/OrbitControls.js.html b/doc/OrbitControls.js.html index e0353244..17c89243 100644 --- a/doc/OrbitControls.js.html +++ b/doc/OrbitControls.js.html @@ -432,13 +432,13 @@

Source: visualization/interaction/OrbitControls.js


diff --git a/doc/ROS3D.Arrow.html b/doc/ROS3D.Arrow.html index 7cd23f18..3db768cf 100644 --- a/doc/ROS3D.Arrow.html +++ b/doc/ROS3D.Arrow.html @@ -511,13 +511,13 @@
Parameters:

diff --git a/doc/ROS3D.Axes.html b/doc/ROS3D.Axes.html index c416c341..e8a71e52 100644 --- a/doc/ROS3D.Axes.html +++ b/doc/ROS3D.Axes.html @@ -291,13 +291,13 @@
Parameters:

diff --git a/doc/ROS3D.DepthCloud.html b/doc/ROS3D.DepthCloud.html new file mode 100644 index 00000000..67e8f6e4 --- /dev/null +++ b/doc/ROS3D.DepthCloud.html @@ -0,0 +1,195 @@ + + + + + JSDoc: Class: DepthCloud + + + + + + + + + + +
+ +

Class: DepthCloud

+ + + + + +
+ +
+

+ ROS3D. + + DepthCloud +

+ +
+ +
+
+ + + + +
+

new DepthCloud(options)

+ + +
+
+ + +
+ The DepthCloud object. +
+ + + + + + + +
Parameters:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescription
options + + object with following keys: + * f - The camera's focal length + * pointSize - Point size (pixels) for rendered point cloud + * width, height - Dimensions of the video stream + * whiteness - Blends rgb values to white (0..100) + * varianceThreshold - Threshold for variance filter, used for compression artifact removal
+ + + +
+ + + + + + + + + + + + + + + + + + + +
Source:
+
+ + + + + + + +
+ + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
+ + + +
+ + + + + + diff --git a/doc/ROS3D.Grid.html b/doc/ROS3D.Grid.html index db9504e0..dcbbd9e7 100644 --- a/doc/ROS3D.Grid.html +++ b/doc/ROS3D.Grid.html @@ -179,13 +179,13 @@
Parameters:

diff --git a/doc/ROS3D.Highlighter.html b/doc/ROS3D.Highlighter.html index b24c10c4..600433a3 100644 --- a/doc/ROS3D.Highlighter.html +++ b/doc/ROS3D.Highlighter.html @@ -685,13 +685,13 @@
Parameters:

diff --git a/doc/ROS3D.InteractiveMarker.html b/doc/ROS3D.InteractiveMarker.html index 380a9313..b8db0287 100644 --- a/doc/ROS3D.InteractiveMarker.html +++ b/doc/ROS3D.InteractiveMarker.html @@ -1605,13 +1605,13 @@
Parameters:

diff --git a/doc/ROS3D.InteractiveMarkerClient.html b/doc/ROS3D.InteractiveMarkerClient.html index 813391bc..72910ad8 100644 --- a/doc/ROS3D.InteractiveMarkerClient.html +++ b/doc/ROS3D.InteractiveMarkerClient.html @@ -683,13 +683,13 @@

unsubscrib
- Documentation generated by JSDoc 3.2.0-dev on Mon Apr 15 2013 09:10:17 GMT-0700 (PDT) + Documentation generated by JSDoc 3.2.0-dev on Wed Jun 05 2013 11:21:12 GMT-0400 (EDT)
diff --git a/doc/ROS3D.InteractiveMarkerControl.html b/doc/ROS3D.InteractiveMarkerControl.html index 4d660fe9..375a7527 100644 --- a/doc/ROS3D.InteractiveMarkerControl.html +++ b/doc/ROS3D.InteractiveMarkerControl.html @@ -292,13 +292,13 @@

Parameters:

diff --git a/doc/ROS3D.InteractiveMarkerHandle.html b/doc/ROS3D.InteractiveMarkerHandle.html index f9353433..0ac01fe5 100644 --- a/doc/ROS3D.InteractiveMarkerHandle.html +++ b/doc/ROS3D.InteractiveMarkerHandle.html @@ -1234,13 +1234,13 @@
Parameters:

diff --git a/doc/ROS3D.InteractiveMarkerMenu.html b/doc/ROS3D.InteractiveMarkerMenu.html index 08f79fe3..6474def8 100644 --- a/doc/ROS3D.InteractiveMarkerMenu.html +++ b/doc/ROS3D.InteractiveMarkerMenu.html @@ -544,13 +544,13 @@
Parameters:

diff --git a/doc/ROS3D.Marker.html b/doc/ROS3D.Marker.html index d9e8c9c3..d7c8d503 100644 --- a/doc/ROS3D.Marker.html +++ b/doc/ROS3D.Marker.html @@ -290,13 +290,13 @@
Parameters:

diff --git a/doc/ROS3D.MarkerClient.html b/doc/ROS3D.MarkerClient.html index bed3499c..81ee7848 100644 --- a/doc/ROS3D.MarkerClient.html +++ b/doc/ROS3D.MarkerClient.html @@ -183,13 +183,13 @@
Parameters:

diff --git a/doc/ROS3D.MeshResource.html b/doc/ROS3D.MeshResource.html index 005c740b..658f59cd 100644 --- a/doc/ROS3D.MeshResource.html +++ b/doc/ROS3D.MeshResource.html @@ -180,13 +180,13 @@
Parameters:

diff --git a/doc/ROS3D.MouseHandler.html b/doc/ROS3D.MouseHandler.html index cb334e6e..a21fbef2 100644 --- a/doc/ROS3D.MouseHandler.html +++ b/doc/ROS3D.MouseHandler.html @@ -446,13 +446,13 @@
Parameters:

diff --git a/doc/ROS3D.OccupancyGrid.html b/doc/ROS3D.OccupancyGrid.html index 69419bb8..ab3d08f7 100644 --- a/doc/ROS3D.OccupancyGrid.html +++ b/doc/ROS3D.OccupancyGrid.html @@ -177,13 +177,13 @@
Parameters:

diff --git a/doc/ROS3D.OccupancyGridClient.html b/doc/ROS3D.OccupancyGridClient.html index 1cf8f850..88db9da8 100644 --- a/doc/ROS3D.OccupancyGridClient.html +++ b/doc/ROS3D.OccupancyGridClient.html @@ -184,13 +184,13 @@
Parameters:

diff --git a/doc/ROS3D.OrbitControls.html b/doc/ROS3D.OrbitControls.html index c0017e72..0a37bb1d 100644 --- a/doc/ROS3D.OrbitControls.html +++ b/doc/ROS3D.OrbitControls.html @@ -1850,13 +1850,13 @@
Parameters:

diff --git a/doc/ROS3D.SceneNode.html b/doc/ROS3D.SceneNode.html index 082a7397..e86eaf9a 100644 --- a/doc/ROS3D.SceneNode.html +++ b/doc/ROS3D.SceneNode.html @@ -292,13 +292,13 @@
Parameters:

diff --git a/doc/ROS3D.TriangleList.html b/doc/ROS3D.TriangleList.html index a1ee3aa1..d9fa2b4d 100644 --- a/doc/ROS3D.TriangleList.html +++ b/doc/ROS3D.TriangleList.html @@ -291,13 +291,13 @@
Parameters:

diff --git a/doc/ROS3D.Urdf.html b/doc/ROS3D.Urdf.html index 60007cb9..896b617c 100644 --- a/doc/ROS3D.Urdf.html +++ b/doc/ROS3D.Urdf.html @@ -179,13 +179,13 @@
Parameters:

diff --git a/doc/ROS3D.UrdfClient.html b/doc/ROS3D.UrdfClient.html index 2236d549..db7813b1 100644 --- a/doc/ROS3D.UrdfClient.html +++ b/doc/ROS3D.UrdfClient.html @@ -185,13 +185,13 @@
Parameters:

diff --git a/doc/ROS3D.Viewer.html b/doc/ROS3D.Viewer.html index d862fd91..efdd5517 100644 --- a/doc/ROS3D.Viewer.html +++ b/doc/ROS3D.Viewer.html @@ -308,7 +308,7 @@

<inner> draw - Renders the associated scene to the that. + Renders the associated scene to the viewer. @@ -378,13 +378,13 @@

<inner> draw
- Documentation generated by JSDoc 3.2.0-dev on Mon Apr 15 2013 09:10:17 GMT-0700 (PDT) + Documentation generated by JSDoc 3.2.0-dev on Wed Jun 05 2013 11:21:12 GMT-0400 (EDT)
diff --git a/doc/Ros3D.js.html b/doc/Ros3D.js.html index dfdab8c0..dd2f650e 100644 --- a/doc/Ros3D.js.html +++ b/doc/Ros3D.js.html @@ -31,7 +31,7 @@

Source: Ros3D.js

*/ var ROS3D = ROS3D || { - REVISION : '4' + REVISION : '5' }; // Marker types @@ -204,13 +204,13 @@

Source: Ros3D.js


- Documentation generated by JSDoc 3.2.0-dev on Mon Apr 15 2013 09:10:16 GMT-0700 (PDT) + Documentation generated by JSDoc 3.2.0-dev on Wed Jun 05 2013 11:21:12 GMT-0400 (EDT)
diff --git a/doc/SceneNode.js.html b/doc/SceneNode.js.html index ec30714b..3921d98b 100644 --- a/doc/SceneNode.js.html +++ b/doc/SceneNode.js.html @@ -94,13 +94,13 @@

Source: visualization/SceneNode.js


- Documentation generated by JSDoc 3.2.0-dev on Mon Apr 15 2013 09:10:17 GMT-0700 (PDT) + Documentation generated by JSDoc 3.2.0-dev on Wed Jun 05 2013 11:21:12 GMT-0400 (EDT)
diff --git a/doc/TriangleList.js.html b/doc/TriangleList.js.html index 5fd10ed1..b8cea150 100644 --- a/doc/TriangleList.js.html +++ b/doc/TriangleList.js.html @@ -112,13 +112,13 @@

Source: models/TriangleList.js


- Documentation generated by JSDoc 3.2.0-dev on Mon Apr 15 2013 09:10:17 GMT-0700 (PDT) + Documentation generated by JSDoc 3.2.0-dev on Wed Jun 05 2013 11:21:12 GMT-0400 (EDT)
diff --git a/doc/Urdf.js.html b/doc/Urdf.js.html index 19a1d720..584f7118 100644 --- a/doc/Urdf.js.html +++ b/doc/Urdf.js.html @@ -87,13 +87,13 @@

Source: urdf/Urdf.js


- Documentation generated by JSDoc 3.2.0-dev on Mon Apr 15 2013 09:10:17 GMT-0700 (PDT) + Documentation generated by JSDoc 3.2.0-dev on Wed Jun 05 2013 11:21:12 GMT-0400 (EDT)
diff --git a/doc/UrdfClient.js.html b/doc/UrdfClient.js.html index e4dfb0dc..7c49333c 100644 --- a/doc/UrdfClient.js.html +++ b/doc/UrdfClient.js.html @@ -83,13 +83,13 @@

Source: urdf/UrdfClient.js


- Documentation generated by JSDoc 3.2.0-dev on Mon Apr 15 2013 09:10:17 GMT-0700 (PDT) + Documentation generated by JSDoc 3.2.0-dev on Wed Jun 05 2013 11:21:12 GMT-0400 (EDT)
diff --git a/doc/Viewer.js.html b/doc/Viewer.js.html index 1584d42b..68d07bd1 100644 --- a/doc/Viewer.js.html +++ b/doc/Viewer.js.html @@ -105,7 +105,7 @@

Source: visualization/Viewer.js

}); /** - * Renders the associated scene to the that. + * Renders the associated scene to the viewer. */ function draw() { // update the controls @@ -156,13 +156,13 @@

Source: visualization/Viewer.js


- Documentation generated by JSDoc 3.2.0-dev on Mon Apr 15 2013 09:10:17 GMT-0700 (PDT) + Documentation generated by JSDoc 3.2.0-dev on Wed Jun 05 2013 11:21:12 GMT-0400 (EDT)
diff --git a/doc/global.html b/doc/global.html index ce282e0e..a090ab0b 100644 --- a/doc/global.html +++ b/doc/global.html @@ -161,13 +161,13 @@

ROS3D
- Documentation generated by JSDoc 3.2.0-dev on Mon Apr 15 2013 09:10:17 GMT-0700 (PDT) + Documentation generated by JSDoc 3.2.0-dev on Wed Jun 05 2013 11:21:12 GMT-0400 (EDT)
diff --git a/doc/index.html b/doc/index.html index 0d68dc73..aafd3ecf 100644 --- a/doc/index.html +++ b/doc/index.html @@ -48,13 +48,13 @@


- Documentation generated by JSDoc 3.2.0-dev on Mon Apr 15 2013 09:10:17 GMT-0700 (PDT) + Documentation generated by JSDoc 3.2.0-dev on Wed Jun 05 2013 11:21:12 GMT-0400 (EDT)
From a40021a233f959f17bbb504668c3ebd74584b4e5 Mon Sep 17 00:00:00 2001 From: Russell Toris Date: Wed, 5 Jun 2013 11:24:00 -0400 Subject: [PATCH 2/5] minor edit --- CHANGELOG.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00eb1bcf..35d8fe88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,5 @@ - 2013-05-29 - **r5** - * Added DepthCloud class for point ploud streaming with ros_web_video and depthcloud_encoder ([jkammerl](https://github.com/jkammerl/), [dgossow](https://github.com/dgossow/)) + * Added DepthCloud class for point ploud streaming with ros_web_video and depthcloud_encoder [(jkammerl)](https://github.com/jkammerl/), [(dgossow)](https://github.com/dgossow/) 2013-04-15 - **r4** * Initial pose now set in SceneNode [(rctoris)](https://github.com/rctoris/) @@ -27,4 +26,3 @@ 2013-03-17 - **r1** * Initial development of ROS3D [(rctoris)](https://github.com/rctoris/) - From c77a0dcc621ad28271204f543bd48e24a9b76cfe Mon Sep 17 00:00:00 2001 From: Russell Toris Date: Thu, 6 Jun 2013 10:11:20 -0400 Subject: [PATCH 3/5] r6 build --- CHANGELOG.md | 2 +- build/ros3d.js | 2 +- build/ros3d.min.js | 2 +- src/Ros3D.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 37b9a386..645ed6de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -DEVEL - **r6** +2013-06-06 - **r6** * MARKER_CUBE_LIST added to Marker.js [(rctoris)](https://github.com/rctoris/) * URDF meshes are now scaled correctly [(rctoris)](https://github.com/rctoris/) diff --git a/build/ros3d.js b/build/ros3d.js index 72dc5ce8..28cec71a 100644 --- a/build/ros3d.js +++ b/build/ros3d.js @@ -4,7 +4,7 @@ */ var ROS3D = ROS3D || { - REVISION : '6-devel' + REVISION : '6' }; // Marker types diff --git a/build/ros3d.min.js b/build/ros3d.min.js index b1d8e382..68f7197c 100644 --- a/build/ros3d.min.js +++ b/build/ros3d.min.js @@ -1,2 +1,2 @@ -var ROS3D=ROS3D||{REVISION:"6-devel"};ROS3D.MARKER_ARROW=0,ROS3D.MARKER_CUBE=1,ROS3D.MARKER_SPHERE=2,ROS3D.MARKER_CYLINDER=3,ROS3D.MARKER_LINE_STRIP=4,ROS3D.MARKER_LINE_LIST=5,ROS3D.MARKER_CUBE_LIST=6,ROS3D.MARKER_SPHERE_LIST=7,ROS3D.MARKER_POINTS=8,ROS3D.MARKER_TEXT_VIEW_FACING=9,ROS3D.MARKER_MESH_RESOURCE=10,ROS3D.MARKER_TRIANGLE_LIST=11,ROS3D.INTERACTIVE_MARKER_KEEP_ALIVE=0,ROS3D.INTERACTIVE_MARKER_POSE_UPDATE=1,ROS3D.INTERACTIVE_MARKER_MENU_SELECT=2,ROS3D.INTERACTIVE_MARKER_BUTTON_CLICK=3,ROS3D.INTERACTIVE_MARKER_MOUSE_DOWN=4,ROS3D.INTERACTIVE_MARKER_MOUSE_UP=5,ROS3D.INTERACTIVE_MARKER_NONE=0,ROS3D.INTERACTIVE_MARKER_MENU=1,ROS3D.INTERACTIVE_MARKER_BUTTON=2,ROS3D.INTERACTIVE_MARKER_MOVE_AXIS=3,ROS3D.INTERACTIVE_MARKER_MOVE_PLANE=4,ROS3D.INTERACTIVE_MARKER_ROTATE_AXIS=5,ROS3D.INTERACTIVE_MARKER_MOVE_ROTATE=6,ROS3D.INTERACTIVE_MARKER_INHERIT=0,ROS3D.INTERACTIVE_MARKER_FIXED=1,ROS3D.INTERACTIVE_MARKER_VIEW_FACING=2,ROS3D.makeColorMaterial=function(a,b,c,d){var e=new THREE.Color;return e.setRGB(a,b,c),.99>=d?new THREE.MeshBasicMaterial({color:e.getHex(),opacity:d+.1,transparent:!0,depthWrite:!0,blendSrc:THREE.SrcAlphaFactor,blendDst:THREE.OneMinusSrcAlphaFactor,blendEquation:THREE.ReverseSubtractEquation,blending:THREE.NormalBlending}):new THREE.MeshLambertMaterial({color:e.getHex(),opacity:d,blending:THREE.NormalBlending})},ROS3D.intersectPlane=function(a,b,c){var d=new THREE.Vector3,e=new THREE.Vector3;d.subVectors(b,a.origin);var f=a.direction.dot(c);if(Math.abs(f)0.99)"," {"," vec4 depthColor2 = texture2D( map, vUv2 );"," float depth2 = ( depthColor2.r + depthColor2.g + depthColor2.b ) / 3.0 ;"," depth = 0.99+depth2;"," }"," "," return depth;"," }","","float median(float a, float b, float c)"," {"," float r=a;"," "," if ( (a0.5) || (vUvP.y<0.5) || (vUvP.y>0.0))"," {"," vec2 smp = decodeDepth(vec2(position.x, position.y));"," float depth = smp.x;"," depthVariance = smp.y;"," "," float z = -depth;"," "," pos = vec4("," ( position.x / width - 0.5 ) * z * (1000.0/focallength) * -1.0,"," ( position.y / height - 0.5 ) * z * (1000.0/focallength),"," (- z + zOffset / 1000.0) * 2.0,"," 1.0);"," "," vec2 maskP = vec2( position.x / (width*2.0), position.y / (height*2.0) );"," vec4 maskColor = texture2D( map, maskP );"," maskVal = ( maskColor.r + maskColor.g + maskColor.b ) / 3.0 ;"," }"," "," gl_PointSize = pointSize;"," gl_Position = projectionMatrix * modelViewMatrix * pos;"," ","}"].join("\n"),this.fragment_shader=["uniform sampler2D map;","uniform float varianceThreshold;","uniform float whiteness;","","varying vec2 vUvP;","varying vec2 colorP;","","varying float depthVariance;","varying float maskVal;","","","void main() {"," "," vec4 color;"," "," if ( (depthVariance>varianceThreshold) || (maskVal>0.5) ||(vUvP.x<0.0)|| (vUvP.x>0.5) || (vUvP.y<0.5) || (vUvP.y>1.0))"," { "," discard;"," }"," else "," {"," color = texture2D( map, colorP );"," "," float fader = whiteness /100.0;"," "," color.r = color.r * (1.0-fader)+ fader;"," "," color.g = color.g * (1.0-fader)+ fader;"," "," color.b = color.b * (1.0-fader)+ fader;"," "," color.a = 1.0;//smoothstep( 20000.0, -20000.0, gl_FragCoord.z / gl_FragCoord.w );"," }"," "," gl_FragColor = vec4( color.r, color.g, color.b, color.a );"," ","}"].join("\n")},ROS3D.DepthCloud.prototype.__proto__=THREE.Object3D.prototype,ROS3D.DepthCloud.prototype.metaLoaded=function(){this.metaLoaded=!0,this.initStreamer()},ROS3D.DepthCloud.prototype.initStreamer=function(){if(this.metaLoaded){this.texture=new THREE.Texture(this.video),this.geometry=new THREE.Geometry;for(var a=0,b=this.width*this.height;b>a;a++){var c=new THREE.Vector3;c.x=a%this.width,c.y=Math.floor(a/this.width),this.geometry.vertices.push(c)}this.material=new THREE.ShaderMaterial({uniforms:{map:{type:"t",value:this.texture},width:{type:"f",value:this.width},height:{type:"f",value:this.height},focallength:{type:"f",value:this.f},pointSize:{type:"f",value:this.pointSize},zOffset:{type:"f",value:0},whiteness:{type:"f",value:this.whiteness},varianceThreshold:{type:"f",value:this.varianceThreshold}},vertexShader:this.vertex_shader,fragmentShader:this.fragment_shader}),this.mesh=new THREE.ParticleSystem(this.geometry,this.material),this.mesh.position.x=0,this.mesh.position.y=0,this.add(this.mesh);var d=this;setInterval(function(){d.video.readyState===d.video.HAVE_ENOUGH_DATA&&(d.texture.needsUpdate=!0)},1e3/30)}},ROS3D.DepthCloud.prototype.startStream=function(){this.video.play()},ROS3D.DepthCloud.prototype.stopStream=function(){this.video.stop()},ROS3D.InteractiveMarker=function(a){THREE.Object3D.call(this),THREE.EventDispatcher.call(this);var b=this;a=a||{};var c=a.handle;this.name=c.name;var d=a.camera,e=a.path||"/";this.dragging=!1,this.onServerSetPose({pose:c.pose}),this.dragStart={position:new THREE.Vector3,orientation:new THREE.Quaternion,positionWorld:new THREE.Vector3,orientationWorld:new THREE.Quaternion,event3d:{}},c.controls.forEach(function(a){b.add(new ROS3D.InteractiveMarkerControl({parent:b,message:a,camera:d,path:e}))}),c.menuEntries.length>0&&(this.menu=new ROS3D.InteractiveMarkerMenu({menuEntries:c.menuEntries}),this.menu.addEventListener("menu-select",function(a){b.dispatchEvent(a)}))},ROS3D.InteractiveMarker.prototype.__proto__=THREE.Object3D.prototype,ROS3D.InteractiveMarker.prototype.showMenu=function(a,b){this.menu&&this.menu.show(a,b)},ROS3D.InteractiveMarker.prototype.moveAxis=function(a,b,c){if(this.dragging){var d=a.currentControlOri,e=b.clone().applyQuaternion(d),f=this.dragStart.event3d.intersection.point,g=e.clone().applyQuaternion(this.dragStart.orientationWorld.clone()),h=new THREE.Ray(f,g),i=ROS3D.closestAxisPoint(h,c.camera,c.mousePos),j=new THREE.Vector3;j.addVectors(this.dragStart.position,e.clone().applyQuaternion(this.dragStart.orientation).multiplyScalar(i)),this.setPosition(a,j),c.stopPropagation()}},ROS3D.InteractiveMarker.prototype.movePlane=function(a,b,c){if(this.dragging){var d=a.currentControlOri,e=b.clone().applyQuaternion(d),f=this.dragStart.event3d.intersection.point,g=e.clone().applyQuaternion(this.dragStart.orientationWorld),h=ROS3D.intersectPlane(c.mouseRay,f,g),i=new THREE.Vector3;i.subVectors(h,f),i.add(this.dragStart.positionWorld),this.setPosition(a,i),c.stopPropagation()}},ROS3D.InteractiveMarker.prototype.rotateAxis=function(a,b,c){if(this.dragging){a.updateMatrixWorld();var d=a.currentControlOri,e=d.clone().multiply(b.clone()),f=new THREE.Vector3(1,0,0).applyQuaternion(e),g=this.dragStart.event3d.intersection.point,h=f.applyQuaternion(this.dragStart.orientationWorld),i=ROS3D.intersectPlane(c.mouseRay,g,h),j=new THREE.Ray(this.dragStart.positionWorld,h),k=ROS3D.intersectPlane(j,g,h),l=this.dragStart.orientationWorld.clone().multiply(e),m=l.clone().inverse();i.sub(k),i.applyQuaternion(m);var n=this.dragStart.event3d.intersection.point.clone();n.sub(k),n.applyQuaternion(m);var o=Math.atan2(i.y,i.z),p=Math.atan2(n.y,n.z),q=p-o,r=new THREE.Quaternion;r.setFromAxisAngle(f,q),this.setOrientation(a,r.multiply(this.dragStart.orientationWorld)),c.stopPropagation()}},ROS3D.InteractiveMarker.prototype.feedbackEvent=function(a,b){this.dispatchEvent({type:a,position:this.position.clone(),orientation:this.quaternion.clone(),controlName:b.name})},ROS3D.InteractiveMarker.prototype.startDrag=function(a,b){if(0===b.domEvent.button){b.stopPropagation(),this.dragging=!0,this.updateMatrixWorld(!0);var c=new THREE.Vector3;this.matrixWorld.decompose(this.dragStart.positionWorld,this.dragStart.orientationWorld,c),this.dragStart.position=this.position.clone(),this.dragStart.orientation=this.quaternion.clone(),this.dragStart.event3d=b,this.feedbackEvent("user-mousedown",a)}},ROS3D.InteractiveMarker.prototype.stopDrag=function(a,b){0===b.domEvent.button&&(b.stopPropagation(),this.dragging=!1,this.dragStart.event3d={},this.onServerSetPose(this.bufferedPoseEvent),this.bufferedPoseEvent=void 0,this.feedbackEvent("user-mouseup",a))},ROS3D.InteractiveMarker.prototype.buttonClick=function(a,b){b.stopPropagation(),this.feedbackEvent("user-button-click",a)},ROS3D.InteractiveMarker.prototype.setPosition=function(a,b){this.position=b,this.feedbackEvent("user-pose-change",a)},ROS3D.InteractiveMarker.prototype.setOrientation=function(a,b){b.normalize(),this.quaternion=b,this.feedbackEvent("user-pose-change",a)},ROS3D.InteractiveMarker.prototype.onServerSetPose=function(a){if(void 0!==a)if(this.dragging)this.bufferedPoseEvent=a;else{var b=a.pose;this.position.x=b.position.x,this.position.y=b.position.y,this.position.z=b.position.z,this.useQuaternion=!0,this.quaternion=new THREE.Quaternion(b.orientation.x,b.orientation.y,b.orientation.z,b.orientation.w),this.updateMatrixWorld(!0)}},ROS3D.InteractiveMarkerClient=function(a){a=a||{},this.ros=a.ros,this.tfClient=a.tfClient,this.topic=a.topic,this.path=a.path||"/",this.camera=a.camera,this.rootObject=a.rootObject||new THREE.Object3D,this.interactiveMarkers={},this.updateTopic=null,this.feedbackTopic=null,this.topic&&this.subscribe(this.topic)},ROS3D.InteractiveMarkerClient.prototype.subscribe=function(a){this.unsubscribe(),this.updateTopic=new ROSLIB.Topic({ros:this.ros,name:a+"/tunneled/update",messageType:"visualization_msgs/InteractiveMarkerUpdate",compression:"png"}),this.updateTopic.subscribe(this.processUpdate.bind(this)),this.feedbackTopic=new ROSLIB.Topic({ros:this.ros,name:a+"/feedback",messageType:"visualization_msgs/InteractiveMarkerFeedback",compression:"png"}),this.feedbackTopic.advertise(),this.initService=new ROSLIB.Service({ros:this.ros,name:a+"/tunneled/get_init",serviceType:"demo_interactive_markers/GetInit"});var b=new ROSLIB.ServiceRequest({});this.initService.callService(b,this.processInit.bind(this))},ROS3D.InteractiveMarkerClient.prototype.unsubscribe=function(){this.updateTopic&&this.updateTopic.unsubscribe(),this.feedbackTopic&&this.feedbackTopic.unadvertise();for(var a in this.interactiveMarkers)this.eraseIntMarker(a);this.interactiveMarkers={}},ROS3D.InteractiveMarkerClient.prototype.processInit=function(a){var b=a.msg;b.erases=[];for(var c in this.interactiveMarkers)b.erases.push(c);b.poses=[],this.processUpdate(b)},ROS3D.InteractiveMarkerClient.prototype.processUpdate=function(a){var b=this;a.erases.forEach(function(a){b.eraseIntMarker(a)}),a.poses.forEach(function(a){var c=b.interactiveMarkers[a.name];c&&c.setPoseFromServer(a.pose)}),a.markers.forEach(function(a){var c=b.interactiveMarkers[a.name];c&&b.eraseIntMarker(c.name);var d=new ROS3D.InteractiveMarkerHandle({message:a,feedbackTopic:b.feedbackTopic,tfClient:b.tfClient});b.interactiveMarkers[a.name]=d;var e=new ROS3D.InteractiveMarker({handle:d,camera:b.camera,path:b.path});e.name=a.name,b.rootObject.add(e),d.on("pose",function(a){e.onServerSetPose({pose:a})}),e.addEventListener("user-pose-change",d.setPoseFromClient.bind(d)),e.addEventListener("user-mousedown",d.onMouseDown.bind(d)),e.addEventListener("user-mouseup",d.onMouseUp.bind(d)),e.addEventListener("user-button-click",d.onButtonClick.bind(d)),e.addEventListener("menu-select",d.onMenuSelect.bind(d)),d.subscribeTf()})},ROS3D.InteractiveMarkerClient.prototype.eraseIntMarker=function(a){this.interactiveMarkers[a]&&(this.rootObject.remove(this.rootObject.getChildByName(a)),delete this.interactiveMarkers[a])},ROS3D.InteractiveMarkerControl=function(a){function b(a){a.stopPropagation()}var c=this;THREE.Object3D.call(this),THREE.EventDispatcher.call(this),a=a||{},this.parent=a.parent;var d=a.message;this.name=d.name,this.camera=a.camera,this.path=a.path||"/",this.dragging=!1;var e=new THREE.Quaternion(d.orientation.x,d.orientation.y,d.orientation.z,d.orientation.w);e.normalize();var f=new THREE.Vector3(1,0,0);switch(f.applyQuaternion(e),this.currentControlOri=new THREE.Quaternion,d.interaction_mode){case ROS3D.INTERACTIVE_MARKER_MOVE_AXIS:this.addEventListener("mousemove",this.parent.moveAxis.bind(this.parent,this,f)),this.addEventListener("touchmove",this.parent.moveAxis.bind(this.parent,this,f));break;case ROS3D.INTERACTIVE_MARKER_ROTATE_AXIS:this.addEventListener("mousemove",this.parent.rotateAxis.bind(this.parent,this,e));break;case ROS3D.INTERACTIVE_MARKER_MOVE_PLANE:this.addEventListener("mousemove",this.parent.movePlane.bind(this.parent,this,f));break;case ROS3D.INTERACTIVE_MARKER_BUTTON:this.addEventListener("click",this.parent.buttonClick.bind(this.parent,this))}d.interaction_mode!==ROS3D.INTERACTIVE_MARKER_NONE&&(this.addEventListener("mousedown",this.parent.startDrag.bind(this.parent,this)),this.addEventListener("mouseup",this.parent.stopDrag.bind(this.parent,this)),this.addEventListener("contextmenu",this.parent.showMenu.bind(this.parent,this)),this.addEventListener("mouseover",b),this.addEventListener("mouseout",b),this.addEventListener("click",b),this.addEventListener("touchstart",function(a){console.log(a.domEvent),1===a.domEvent.touches.length&&(a.type="mousedown",a.domEvent.button=0,c.dispatchEvent(a))}),this.addEventListener("touchmove",function(a){1===a.domEvent.touches.length&&(console.log(a.domEvent),a.type="mousemove",a.domEvent.button=0,c.dispatchEvent(a))}),this.addEventListener("touchend",function(a){0===a.domEvent.touches.length&&(a.domEvent.button=0,a.type="mouseup",c.dispatchEvent(a),a.type="click",c.dispatchEvent(a))}));var g=new THREE.Quaternion,h=this.parent.position.clone().multiplyScalar(-1);switch(d.orientation_mode){case ROS3D.INTERACTIVE_MARKER_INHERIT:g=this.parent.quaternion.clone().inverse(),this.updateMatrixWorld=function(a){ROS3D.InteractiveMarkerControl.prototype.updateMatrixWorld.call(c,a),c.currentControlOri.copy(c.quaternion),c.currentControlOri.normalize()};break;case ROS3D.INTERACTIVE_MARKER_FIXED:this.updateMatrixWorld=function(a){c.useQuaternion=!0,c.quaternion=c.parent.quaternion.clone().inverse(),c.updateMatrix(),c.matrixWorldNeedsUpdate=!0,ROS3D.InteractiveMarkerControl.prototype.updateMatrixWorld.call(c,a),c.currentControlOri.copy(c.quaternion)};break;case ROS3D.INTERACTIVE_MARKER_VIEW_FACING:var i=d.independentMarkerOrientation;this.updateMatrixWorld=function(a){c.camera.updateMatrixWorld();var b=(new THREE.Matrix4).extractRotation(c.camera.matrixWorld),d=new THREE.Matrix4,e=.5*Math.PI,f=new THREE.Vector3(-e,0,e);d.setRotationFromEuler(f);var g=new THREE.Matrix4;g.getInverse(c.parent.matrixWorld),b.multiplyMatrices(b,d),b.multiplyMatrices(g,b),c.currentControlOri.setFromRotationMatrix(b),i||(c.useQuaternion=!0,c.quaternion.copy(c.currentControlOri),c.updateMatrix(),c.matrixWorldNeedsUpdate=!0),ROS3D.InteractiveMarkerControl.prototype.updateMatrixWorld.call(c,a)};break;default:console.error("Unkown orientation mode: "+d.orientation_mode)}d.markers.forEach(function(a){var b=new ROS3D.Marker({message:a,path:c.path});""!==a.header.frame_id&&(b.position.add(h),b.position.applyQuaternion(g),b.quaternion.multiplyQuaternions(g,b.quaternion),b.updateMatrixWorld()),c.add(b)})},ROS3D.InteractiveMarkerControl.prototype.__proto__=THREE.Object3D.prototype,ROS3D.InteractiveMarkerHandle=function(a){a=a||{},this.message=a.message,this.feedbackTopic=a.feedbackTopic,this.tfClient=a.tfClient,this.name=this.message.name,this.header=this.message.header,this.controls=this.message.controls,this.menuEntries=this.message.menu_entries,this.dragging=!1,this.timeoutHandle=null,this.tfTransform=new ROSLIB.Transform,this.pose=new ROSLIB.Pose,this.setPoseFromServer(this.message.pose)},ROS3D.InteractiveMarkerHandle.prototype.__proto__=EventEmitter2.prototype,ROS3D.InteractiveMarkerHandle.prototype.subscribeTf=function(){0===this.message.header.stamp.secs&&0===this.message.header.stamp.nsecs&&this.tfClient.subscribe(this.message.header.frame_id,this.tfUpdate.bind(this))},ROS3D.InteractiveMarkerHandle.prototype.emitServerPoseUpdate=function(){var a=new ROSLIB.Pose(this.pose);a.applyTransform(this.tfTransform),this.emit("pose",a)},ROS3D.InteractiveMarkerHandle.prototype.setPoseFromServer=function(a){this.pose=new ROSLIB.Pose(a),this.emitServerPoseUpdate()},ROS3D.InteractiveMarkerHandle.prototype.tfUpdate=function(a){this.tfTransform=new ROSLIB.Transform(a),this.emitServerPoseUpdate()},ROS3D.InteractiveMarkerHandle.prototype.setPoseFromClient=function(a){this.pose=new ROSLIB.Pose(a);var b=this.tfTransform.clone();b.rotation.invert(),this.pose.applyTransform(b),this.sendFeedback(ROS3D.INTERACTIVE_MARKER_POSE_UPDATE,void 0,0,a.controlName),this.dragging&&(this.timeoutHandle&&clearTimeout(this.timeoutHandle),this.timeoutHandle=setTimeout(this.setPoseFromClient.bind(this,a),250))},ROS3D.InteractiveMarkerHandle.prototype.onButtonClick=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_BUTTON_CLICK,a.clickPosition,0,a.controlName)},ROS3D.InteractiveMarkerHandle.prototype.onMouseDown=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_MOUSE_DOWN,a.clickPosition,0,a.controlName),this.dragging=!0},ROS3D.InteractiveMarkerHandle.prototype.onMouseUp=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_MOUSE_UP,a.clickPosition,0,a.controlName),this.dragging=!1,this.timeoutHandle&&clearTimeout(this.timeoutHandle)},ROS3D.InteractiveMarkerHandle.prototype.onMenuSelect=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_MENU_SELECT,void 0,a.id,a.controlName)},ROS3D.InteractiveMarkerHandle.prototype.sendFeedback=function(a,b,c,d){var e=void 0!==b;b=b||{x:0,y:0,z:0};var f={header:this.header,client_id:this.clientID,marker_name:this.name,control_name:d,event_type:a,pose:this.pose,mouse_point:b,mouse_point_valid:e,menu_entry_id:c};this.feedbackTopic.publish(f)},ROS3D.InteractiveMarkerMenu=function(a){function b(a,b){this.dispatchEvent({type:"menu-select",domEvent:b,id:a.id,controlName:this.controlName}),this.hide(b)}function c(a,e){var f=document.createElement("ul");a.appendChild(f);for(var g=e.children,h=0;h0?(c(i,g[h]),j.addEventListener("click",d.hide.bind(d))):(j.addEventListener("click",b.bind(d,g[h])),j.className="default-interactive-marker-menu-entry")}}var d=this;a=a||{};var e=a.menuEntries,f=a.className||"default-interactive-marker-menu";a.entryClassName||"default-interactive-marker-menu-entry";var g=a.overlayClassName||"default-interactive-marker-overlay",h=[];if(h[0]={children:[]},THREE.EventDispatcher.call(this),null===document.getElementById("default-interactive-marker-menu-css")){var i=document.createElement("style");i.id="default-interactive-marker-menu-css",i.type="text/css",i.innerHTML=".default-interactive-marker-menu {background-color: #444444;border: 1px solid #888888;border: 1px solid #888888;padding: 0px 0px 0px 0px;color: #FFFFFF;font-family: sans-serif;font-size: 0.8em;z-index: 1002;}.default-interactive-marker-menu ul {padding: 0px 0px 5px 0px;margin: 0px;list-style-type: none;}.default-interactive-marker-menu ul li div {-webkit-touch-callout: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;cursor: default;padding: 3px 10px 3px 10px;}.default-interactive-marker-menu-entry:hover { background-color: #666666; cursor: pointer;}.default-interactive-marker-menu ul ul { font-style: italic; padding-left: 10px;}.default-interactive-marker-overlay { position: absolute; top: 0%; left: 0%; width: 100%; height: 100%; background-color: black; z-index: 1001; -moz-opacity: 0.0; opacity: .0; filter: alpha(opacity = 0);}",document.getElementsByTagName("head")[0].appendChild(i)}this.menuDomElem=document.createElement("div"),this.menuDomElem.style.position="absolute",this.menuDomElem.className=f,this.menuDomElem.addEventListener("contextmenu",function(a){a.preventDefault()}),this.overlayDomElem=document.createElement("div"),this.overlayDomElem.className=g,this.hideListener=this.hide.bind(this),this.overlayDomElem.addEventListener("contextmenu",this.hideListener),this.overlayDomElem.addEventListener("click",this.hideListener);var j,k,l;for(j=0;ji;i++)for(var j=0;c>j;j++){var k,l=j+(d-i-1)*c,m=b.data[l];k=100===m?0:0===m?255:127;var n=4*(j+i*c);h.data[n]=k,h.data[++n]=k,h.data[++n]=k,h.data[++n]=255}g.putImageData(h,0,0);var o=new THREE.Texture(f);o.needsUpdate=!0;var p=new THREE.MeshBasicMaterial({map:o});p.side=THREE.DoubleSide,THREE.Mesh.call(this,e,p),this.position.x=c*b.info.resolution/2,this.position.y=d*b.info.resolution/2,this.scale.x=b.info.resolution,this.scale.y=b.info.resolution},ROS3D.OccupancyGrid.prototype.__proto__=THREE.Mesh.prototype,ROS3D.OccupancyGridClient=function(a){var b=this;a=a||{};var c=a.ros,d=a.topic||"/map";this.continuous=a.continuous,this.tfClient=a.tfClient,this.rootObject=a.rootObject||new THREE.Object3D,this.currentGrid=null;var e=new ROSLIB.Topic({ros:c,name:d,messageType:"nav_msgs/OccupancyGrid",compression:"png"});e.subscribe(function(a){b.currentGrid&&b.rootObject.remove(b.currentGrid);var c=new ROS3D.OccupancyGrid({message:a});b.currentGrid=b.tfClient?new ROS3D.SceneNode({frameID:a.header.frame_id,tfClient:b.tfClient,object:c,pose:a.info.origin}):c,b.rootObject.add(b.currentGrid),b.emit("change"),b.continuous||e.unsubscribe()})},ROS3D.OccupancyGridClient.prototype.__proto__=EventEmitter2.prototype,ROS3D.Marker=function(a){a=a||{};var b=a.path||"/",c=a.message;"/"!==b.substr(b.length-1)&&(b+="/"),THREE.Object3D.call(this),this.useQuaternion=!0,this.setPose(c.pose);var d=ROS3D.makeColorMaterial(c.color.r,c.color.g,c.color.b,c.color.a);switch(c.type){case ROS3D.MARKER_ARROW:var e,f=c.scale.x,g=.23*f,h=c.scale.y,i=.5*h,j=null;if(2===c.points.length){j=new THREE.Vector3(c.points[0].x,c.points[0].y,c.points[0].z);var k=new THREE.Vector3(c.points[1].x,c.points[1].y,c.points[1].z);e=j.clone().negate().add(k),f=e.length(),h=c.scale.y,i=c.scale.x,0!==c.scale.z&&(g=c.scale.z)}this.add(new ROS3D.Arrow({direction:e,origin:j,length:f,headLength:g,shaftDiameter:i,headDiameter:h,material:d}));break;case ROS3D.MARKER_CUBE:var l=new THREE.CubeGeometry(c.scale.x,c.scale.y,c.scale.z);this.add(new THREE.Mesh(l,d));break;case ROS3D.MARKER_SPHERE:var m=new THREE.SphereGeometry(.5),n=new THREE.Mesh(m,d);n.scale.x=c.scale.x,n.scale.y=c.scale.y,n.scale.z=c.scale.z,this.add(n);break;case ROS3D.MARKER_CYLINDER:var o=new THREE.CylinderGeometry(.5,.5,1,16,1,!1),p=new THREE.Mesh(o,d);p.useQuaternion=!0,p.quaternion.setFromAxisAngle(new THREE.Vector3(1,0,0),.5*Math.PI),p.scale=new THREE.Vector3(c.scale.x,c.scale.y,c.scale.z),this.add(p);break;case ROS3D.MARKER_CUBE_LIST:var q,r,s,t,u=new THREE.Object3D,v=c.points.length,w=v===c.colors.length,x=Math.ceil(v/1250);for(q=0;v>q;q+=x)r=new THREE.CubeGeometry(c.scale.x,c.scale.y,c.scale.z),s=w?ROS3D.makeColorMaterial(c.colors[q].r,c.colors[q].g,c.colors[q].b,c.colors[q].a):d,t=new THREE.Mesh(r,s),t.position.x=c.points[q].x,t.position.y=c.points[q].y,t.position.z=c.points[q].z,u.add(t);this.add(u);break;case ROS3D.MARKER_SPHERE_LIST:case ROS3D.MARKER_POINTS:var y,z=new THREE.Geometry,A=new THREE.ParticleBasicMaterial({size:c.scale.x});for(y=0;y=d?new THREE.MeshBasicMaterial({color:e.getHex(),opacity:d+.1,transparent:!0,depthWrite:!0,blendSrc:THREE.SrcAlphaFactor,blendDst:THREE.OneMinusSrcAlphaFactor,blendEquation:THREE.ReverseSubtractEquation,blending:THREE.NormalBlending}):new THREE.MeshLambertMaterial({color:e.getHex(),opacity:d,blending:THREE.NormalBlending})},ROS3D.intersectPlane=function(a,b,c){var d=new THREE.Vector3,e=new THREE.Vector3;d.subVectors(b,a.origin);var f=a.direction.dot(c);if(Math.abs(f)0.99)"," {"," vec4 depthColor2 = texture2D( map, vUv2 );"," float depth2 = ( depthColor2.r + depthColor2.g + depthColor2.b ) / 3.0 ;"," depth = 0.99+depth2;"," }"," "," return depth;"," }","","float median(float a, float b, float c)"," {"," float r=a;"," "," if ( (a0.5) || (vUvP.y<0.5) || (vUvP.y>0.0))"," {"," vec2 smp = decodeDepth(vec2(position.x, position.y));"," float depth = smp.x;"," depthVariance = smp.y;"," "," float z = -depth;"," "," pos = vec4("," ( position.x / width - 0.5 ) * z * (1000.0/focallength) * -1.0,"," ( position.y / height - 0.5 ) * z * (1000.0/focallength),"," (- z + zOffset / 1000.0) * 2.0,"," 1.0);"," "," vec2 maskP = vec2( position.x / (width*2.0), position.y / (height*2.0) );"," vec4 maskColor = texture2D( map, maskP );"," maskVal = ( maskColor.r + maskColor.g + maskColor.b ) / 3.0 ;"," }"," "," gl_PointSize = pointSize;"," gl_Position = projectionMatrix * modelViewMatrix * pos;"," ","}"].join("\n"),this.fragment_shader=["uniform sampler2D map;","uniform float varianceThreshold;","uniform float whiteness;","","varying vec2 vUvP;","varying vec2 colorP;","","varying float depthVariance;","varying float maskVal;","","","void main() {"," "," vec4 color;"," "," if ( (depthVariance>varianceThreshold) || (maskVal>0.5) ||(vUvP.x<0.0)|| (vUvP.x>0.5) || (vUvP.y<0.5) || (vUvP.y>1.0))"," { "," discard;"," }"," else "," {"," color = texture2D( map, colorP );"," "," float fader = whiteness /100.0;"," "," color.r = color.r * (1.0-fader)+ fader;"," "," color.g = color.g * (1.0-fader)+ fader;"," "," color.b = color.b * (1.0-fader)+ fader;"," "," color.a = 1.0;//smoothstep( 20000.0, -20000.0, gl_FragCoord.z / gl_FragCoord.w );"," }"," "," gl_FragColor = vec4( color.r, color.g, color.b, color.a );"," ","}"].join("\n")},ROS3D.DepthCloud.prototype.__proto__=THREE.Object3D.prototype,ROS3D.DepthCloud.prototype.metaLoaded=function(){this.metaLoaded=!0,this.initStreamer()},ROS3D.DepthCloud.prototype.initStreamer=function(){if(this.metaLoaded){this.texture=new THREE.Texture(this.video),this.geometry=new THREE.Geometry;for(var a=0,b=this.width*this.height;b>a;a++){var c=new THREE.Vector3;c.x=a%this.width,c.y=Math.floor(a/this.width),this.geometry.vertices.push(c)}this.material=new THREE.ShaderMaterial({uniforms:{map:{type:"t",value:this.texture},width:{type:"f",value:this.width},height:{type:"f",value:this.height},focallength:{type:"f",value:this.f},pointSize:{type:"f",value:this.pointSize},zOffset:{type:"f",value:0},whiteness:{type:"f",value:this.whiteness},varianceThreshold:{type:"f",value:this.varianceThreshold}},vertexShader:this.vertex_shader,fragmentShader:this.fragment_shader}),this.mesh=new THREE.ParticleSystem(this.geometry,this.material),this.mesh.position.x=0,this.mesh.position.y=0,this.add(this.mesh);var d=this;setInterval(function(){d.video.readyState===d.video.HAVE_ENOUGH_DATA&&(d.texture.needsUpdate=!0)},1e3/30)}},ROS3D.DepthCloud.prototype.startStream=function(){this.video.play()},ROS3D.DepthCloud.prototype.stopStream=function(){this.video.stop()},ROS3D.InteractiveMarker=function(a){THREE.Object3D.call(this),THREE.EventDispatcher.call(this);var b=this;a=a||{};var c=a.handle;this.name=c.name;var d=a.camera,e=a.path||"/";this.dragging=!1,this.onServerSetPose({pose:c.pose}),this.dragStart={position:new THREE.Vector3,orientation:new THREE.Quaternion,positionWorld:new THREE.Vector3,orientationWorld:new THREE.Quaternion,event3d:{}},c.controls.forEach(function(a){b.add(new ROS3D.InteractiveMarkerControl({parent:b,message:a,camera:d,path:e}))}),c.menuEntries.length>0&&(this.menu=new ROS3D.InteractiveMarkerMenu({menuEntries:c.menuEntries}),this.menu.addEventListener("menu-select",function(a){b.dispatchEvent(a)}))},ROS3D.InteractiveMarker.prototype.__proto__=THREE.Object3D.prototype,ROS3D.InteractiveMarker.prototype.showMenu=function(a,b){this.menu&&this.menu.show(a,b)},ROS3D.InteractiveMarker.prototype.moveAxis=function(a,b,c){if(this.dragging){var d=a.currentControlOri,e=b.clone().applyQuaternion(d),f=this.dragStart.event3d.intersection.point,g=e.clone().applyQuaternion(this.dragStart.orientationWorld.clone()),h=new THREE.Ray(f,g),i=ROS3D.closestAxisPoint(h,c.camera,c.mousePos),j=new THREE.Vector3;j.addVectors(this.dragStart.position,e.clone().applyQuaternion(this.dragStart.orientation).multiplyScalar(i)),this.setPosition(a,j),c.stopPropagation()}},ROS3D.InteractiveMarker.prototype.movePlane=function(a,b,c){if(this.dragging){var d=a.currentControlOri,e=b.clone().applyQuaternion(d),f=this.dragStart.event3d.intersection.point,g=e.clone().applyQuaternion(this.dragStart.orientationWorld),h=ROS3D.intersectPlane(c.mouseRay,f,g),i=new THREE.Vector3;i.subVectors(h,f),i.add(this.dragStart.positionWorld),this.setPosition(a,i),c.stopPropagation()}},ROS3D.InteractiveMarker.prototype.rotateAxis=function(a,b,c){if(this.dragging){a.updateMatrixWorld();var d=a.currentControlOri,e=d.clone().multiply(b.clone()),f=new THREE.Vector3(1,0,0).applyQuaternion(e),g=this.dragStart.event3d.intersection.point,h=f.applyQuaternion(this.dragStart.orientationWorld),i=ROS3D.intersectPlane(c.mouseRay,g,h),j=new THREE.Ray(this.dragStart.positionWorld,h),k=ROS3D.intersectPlane(j,g,h),l=this.dragStart.orientationWorld.clone().multiply(e),m=l.clone().inverse();i.sub(k),i.applyQuaternion(m);var n=this.dragStart.event3d.intersection.point.clone();n.sub(k),n.applyQuaternion(m);var o=Math.atan2(i.y,i.z),p=Math.atan2(n.y,n.z),q=p-o,r=new THREE.Quaternion;r.setFromAxisAngle(f,q),this.setOrientation(a,r.multiply(this.dragStart.orientationWorld)),c.stopPropagation()}},ROS3D.InteractiveMarker.prototype.feedbackEvent=function(a,b){this.dispatchEvent({type:a,position:this.position.clone(),orientation:this.quaternion.clone(),controlName:b.name})},ROS3D.InteractiveMarker.prototype.startDrag=function(a,b){if(0===b.domEvent.button){b.stopPropagation(),this.dragging=!0,this.updateMatrixWorld(!0);var c=new THREE.Vector3;this.matrixWorld.decompose(this.dragStart.positionWorld,this.dragStart.orientationWorld,c),this.dragStart.position=this.position.clone(),this.dragStart.orientation=this.quaternion.clone(),this.dragStart.event3d=b,this.feedbackEvent("user-mousedown",a)}},ROS3D.InteractiveMarker.prototype.stopDrag=function(a,b){0===b.domEvent.button&&(b.stopPropagation(),this.dragging=!1,this.dragStart.event3d={},this.onServerSetPose(this.bufferedPoseEvent),this.bufferedPoseEvent=void 0,this.feedbackEvent("user-mouseup",a))},ROS3D.InteractiveMarker.prototype.buttonClick=function(a,b){b.stopPropagation(),this.feedbackEvent("user-button-click",a)},ROS3D.InteractiveMarker.prototype.setPosition=function(a,b){this.position=b,this.feedbackEvent("user-pose-change",a)},ROS3D.InteractiveMarker.prototype.setOrientation=function(a,b){b.normalize(),this.quaternion=b,this.feedbackEvent("user-pose-change",a)},ROS3D.InteractiveMarker.prototype.onServerSetPose=function(a){if(void 0!==a)if(this.dragging)this.bufferedPoseEvent=a;else{var b=a.pose;this.position.x=b.position.x,this.position.y=b.position.y,this.position.z=b.position.z,this.useQuaternion=!0,this.quaternion=new THREE.Quaternion(b.orientation.x,b.orientation.y,b.orientation.z,b.orientation.w),this.updateMatrixWorld(!0)}},ROS3D.InteractiveMarkerClient=function(a){a=a||{},this.ros=a.ros,this.tfClient=a.tfClient,this.topic=a.topic,this.path=a.path||"/",this.camera=a.camera,this.rootObject=a.rootObject||new THREE.Object3D,this.interactiveMarkers={},this.updateTopic=null,this.feedbackTopic=null,this.topic&&this.subscribe(this.topic)},ROS3D.InteractiveMarkerClient.prototype.subscribe=function(a){this.unsubscribe(),this.updateTopic=new ROSLIB.Topic({ros:this.ros,name:a+"/tunneled/update",messageType:"visualization_msgs/InteractiveMarkerUpdate",compression:"png"}),this.updateTopic.subscribe(this.processUpdate.bind(this)),this.feedbackTopic=new ROSLIB.Topic({ros:this.ros,name:a+"/feedback",messageType:"visualization_msgs/InteractiveMarkerFeedback",compression:"png"}),this.feedbackTopic.advertise(),this.initService=new ROSLIB.Service({ros:this.ros,name:a+"/tunneled/get_init",serviceType:"demo_interactive_markers/GetInit"});var b=new ROSLIB.ServiceRequest({});this.initService.callService(b,this.processInit.bind(this))},ROS3D.InteractiveMarkerClient.prototype.unsubscribe=function(){this.updateTopic&&this.updateTopic.unsubscribe(),this.feedbackTopic&&this.feedbackTopic.unadvertise();for(var a in this.interactiveMarkers)this.eraseIntMarker(a);this.interactiveMarkers={}},ROS3D.InteractiveMarkerClient.prototype.processInit=function(a){var b=a.msg;b.erases=[];for(var c in this.interactiveMarkers)b.erases.push(c);b.poses=[],this.processUpdate(b)},ROS3D.InteractiveMarkerClient.prototype.processUpdate=function(a){var b=this;a.erases.forEach(function(a){b.eraseIntMarker(a)}),a.poses.forEach(function(a){var c=b.interactiveMarkers[a.name];c&&c.setPoseFromServer(a.pose)}),a.markers.forEach(function(a){var c=b.interactiveMarkers[a.name];c&&b.eraseIntMarker(c.name);var d=new ROS3D.InteractiveMarkerHandle({message:a,feedbackTopic:b.feedbackTopic,tfClient:b.tfClient});b.interactiveMarkers[a.name]=d;var e=new ROS3D.InteractiveMarker({handle:d,camera:b.camera,path:b.path});e.name=a.name,b.rootObject.add(e),d.on("pose",function(a){e.onServerSetPose({pose:a})}),e.addEventListener("user-pose-change",d.setPoseFromClient.bind(d)),e.addEventListener("user-mousedown",d.onMouseDown.bind(d)),e.addEventListener("user-mouseup",d.onMouseUp.bind(d)),e.addEventListener("user-button-click",d.onButtonClick.bind(d)),e.addEventListener("menu-select",d.onMenuSelect.bind(d)),d.subscribeTf()})},ROS3D.InteractiveMarkerClient.prototype.eraseIntMarker=function(a){this.interactiveMarkers[a]&&(this.rootObject.remove(this.rootObject.getChildByName(a)),delete this.interactiveMarkers[a])},ROS3D.InteractiveMarkerControl=function(a){function b(a){a.stopPropagation()}var c=this;THREE.Object3D.call(this),THREE.EventDispatcher.call(this),a=a||{},this.parent=a.parent;var d=a.message;this.name=d.name,this.camera=a.camera,this.path=a.path||"/",this.dragging=!1;var e=new THREE.Quaternion(d.orientation.x,d.orientation.y,d.orientation.z,d.orientation.w);e.normalize();var f=new THREE.Vector3(1,0,0);switch(f.applyQuaternion(e),this.currentControlOri=new THREE.Quaternion,d.interaction_mode){case ROS3D.INTERACTIVE_MARKER_MOVE_AXIS:this.addEventListener("mousemove",this.parent.moveAxis.bind(this.parent,this,f)),this.addEventListener("touchmove",this.parent.moveAxis.bind(this.parent,this,f));break;case ROS3D.INTERACTIVE_MARKER_ROTATE_AXIS:this.addEventListener("mousemove",this.parent.rotateAxis.bind(this.parent,this,e));break;case ROS3D.INTERACTIVE_MARKER_MOVE_PLANE:this.addEventListener("mousemove",this.parent.movePlane.bind(this.parent,this,f));break;case ROS3D.INTERACTIVE_MARKER_BUTTON:this.addEventListener("click",this.parent.buttonClick.bind(this.parent,this))}d.interaction_mode!==ROS3D.INTERACTIVE_MARKER_NONE&&(this.addEventListener("mousedown",this.parent.startDrag.bind(this.parent,this)),this.addEventListener("mouseup",this.parent.stopDrag.bind(this.parent,this)),this.addEventListener("contextmenu",this.parent.showMenu.bind(this.parent,this)),this.addEventListener("mouseover",b),this.addEventListener("mouseout",b),this.addEventListener("click",b),this.addEventListener("touchstart",function(a){console.log(a.domEvent),1===a.domEvent.touches.length&&(a.type="mousedown",a.domEvent.button=0,c.dispatchEvent(a))}),this.addEventListener("touchmove",function(a){1===a.domEvent.touches.length&&(console.log(a.domEvent),a.type="mousemove",a.domEvent.button=0,c.dispatchEvent(a))}),this.addEventListener("touchend",function(a){0===a.domEvent.touches.length&&(a.domEvent.button=0,a.type="mouseup",c.dispatchEvent(a),a.type="click",c.dispatchEvent(a))}));var g=new THREE.Quaternion,h=this.parent.position.clone().multiplyScalar(-1);switch(d.orientation_mode){case ROS3D.INTERACTIVE_MARKER_INHERIT:g=this.parent.quaternion.clone().inverse(),this.updateMatrixWorld=function(a){ROS3D.InteractiveMarkerControl.prototype.updateMatrixWorld.call(c,a),c.currentControlOri.copy(c.quaternion),c.currentControlOri.normalize()};break;case ROS3D.INTERACTIVE_MARKER_FIXED:this.updateMatrixWorld=function(a){c.useQuaternion=!0,c.quaternion=c.parent.quaternion.clone().inverse(),c.updateMatrix(),c.matrixWorldNeedsUpdate=!0,ROS3D.InteractiveMarkerControl.prototype.updateMatrixWorld.call(c,a),c.currentControlOri.copy(c.quaternion)};break;case ROS3D.INTERACTIVE_MARKER_VIEW_FACING:var i=d.independentMarkerOrientation;this.updateMatrixWorld=function(a){c.camera.updateMatrixWorld();var b=(new THREE.Matrix4).extractRotation(c.camera.matrixWorld),d=new THREE.Matrix4,e=.5*Math.PI,f=new THREE.Vector3(-e,0,e);d.setRotationFromEuler(f);var g=new THREE.Matrix4;g.getInverse(c.parent.matrixWorld),b.multiplyMatrices(b,d),b.multiplyMatrices(g,b),c.currentControlOri.setFromRotationMatrix(b),i||(c.useQuaternion=!0,c.quaternion.copy(c.currentControlOri),c.updateMatrix(),c.matrixWorldNeedsUpdate=!0),ROS3D.InteractiveMarkerControl.prototype.updateMatrixWorld.call(c,a)};break;default:console.error("Unkown orientation mode: "+d.orientation_mode)}d.markers.forEach(function(a){var b=new ROS3D.Marker({message:a,path:c.path});""!==a.header.frame_id&&(b.position.add(h),b.position.applyQuaternion(g),b.quaternion.multiplyQuaternions(g,b.quaternion),b.updateMatrixWorld()),c.add(b)})},ROS3D.InteractiveMarkerControl.prototype.__proto__=THREE.Object3D.prototype,ROS3D.InteractiveMarkerHandle=function(a){a=a||{},this.message=a.message,this.feedbackTopic=a.feedbackTopic,this.tfClient=a.tfClient,this.name=this.message.name,this.header=this.message.header,this.controls=this.message.controls,this.menuEntries=this.message.menu_entries,this.dragging=!1,this.timeoutHandle=null,this.tfTransform=new ROSLIB.Transform,this.pose=new ROSLIB.Pose,this.setPoseFromServer(this.message.pose)},ROS3D.InteractiveMarkerHandle.prototype.__proto__=EventEmitter2.prototype,ROS3D.InteractiveMarkerHandle.prototype.subscribeTf=function(){0===this.message.header.stamp.secs&&0===this.message.header.stamp.nsecs&&this.tfClient.subscribe(this.message.header.frame_id,this.tfUpdate.bind(this))},ROS3D.InteractiveMarkerHandle.prototype.emitServerPoseUpdate=function(){var a=new ROSLIB.Pose(this.pose);a.applyTransform(this.tfTransform),this.emit("pose",a)},ROS3D.InteractiveMarkerHandle.prototype.setPoseFromServer=function(a){this.pose=new ROSLIB.Pose(a),this.emitServerPoseUpdate()},ROS3D.InteractiveMarkerHandle.prototype.tfUpdate=function(a){this.tfTransform=new ROSLIB.Transform(a),this.emitServerPoseUpdate()},ROS3D.InteractiveMarkerHandle.prototype.setPoseFromClient=function(a){this.pose=new ROSLIB.Pose(a);var b=this.tfTransform.clone();b.rotation.invert(),this.pose.applyTransform(b),this.sendFeedback(ROS3D.INTERACTIVE_MARKER_POSE_UPDATE,void 0,0,a.controlName),this.dragging&&(this.timeoutHandle&&clearTimeout(this.timeoutHandle),this.timeoutHandle=setTimeout(this.setPoseFromClient.bind(this,a),250))},ROS3D.InteractiveMarkerHandle.prototype.onButtonClick=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_BUTTON_CLICK,a.clickPosition,0,a.controlName)},ROS3D.InteractiveMarkerHandle.prototype.onMouseDown=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_MOUSE_DOWN,a.clickPosition,0,a.controlName),this.dragging=!0},ROS3D.InteractiveMarkerHandle.prototype.onMouseUp=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_MOUSE_UP,a.clickPosition,0,a.controlName),this.dragging=!1,this.timeoutHandle&&clearTimeout(this.timeoutHandle)},ROS3D.InteractiveMarkerHandle.prototype.onMenuSelect=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_MENU_SELECT,void 0,a.id,a.controlName)},ROS3D.InteractiveMarkerHandle.prototype.sendFeedback=function(a,b,c,d){var e=void 0!==b;b=b||{x:0,y:0,z:0};var f={header:this.header,client_id:this.clientID,marker_name:this.name,control_name:d,event_type:a,pose:this.pose,mouse_point:b,mouse_point_valid:e,menu_entry_id:c};this.feedbackTopic.publish(f)},ROS3D.InteractiveMarkerMenu=function(a){function b(a,b){this.dispatchEvent({type:"menu-select",domEvent:b,id:a.id,controlName:this.controlName}),this.hide(b)}function c(a,e){var f=document.createElement("ul");a.appendChild(f);for(var g=e.children,h=0;h0?(c(i,g[h]),j.addEventListener("click",d.hide.bind(d))):(j.addEventListener("click",b.bind(d,g[h])),j.className="default-interactive-marker-menu-entry")}}var d=this;a=a||{};var e=a.menuEntries,f=a.className||"default-interactive-marker-menu";a.entryClassName||"default-interactive-marker-menu-entry";var g=a.overlayClassName||"default-interactive-marker-overlay",h=[];if(h[0]={children:[]},THREE.EventDispatcher.call(this),null===document.getElementById("default-interactive-marker-menu-css")){var i=document.createElement("style");i.id="default-interactive-marker-menu-css",i.type="text/css",i.innerHTML=".default-interactive-marker-menu {background-color: #444444;border: 1px solid #888888;border: 1px solid #888888;padding: 0px 0px 0px 0px;color: #FFFFFF;font-family: sans-serif;font-size: 0.8em;z-index: 1002;}.default-interactive-marker-menu ul {padding: 0px 0px 5px 0px;margin: 0px;list-style-type: none;}.default-interactive-marker-menu ul li div {-webkit-touch-callout: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;cursor: default;padding: 3px 10px 3px 10px;}.default-interactive-marker-menu-entry:hover { background-color: #666666; cursor: pointer;}.default-interactive-marker-menu ul ul { font-style: italic; padding-left: 10px;}.default-interactive-marker-overlay { position: absolute; top: 0%; left: 0%; width: 100%; height: 100%; background-color: black; z-index: 1001; -moz-opacity: 0.0; opacity: .0; filter: alpha(opacity = 0);}",document.getElementsByTagName("head")[0].appendChild(i)}this.menuDomElem=document.createElement("div"),this.menuDomElem.style.position="absolute",this.menuDomElem.className=f,this.menuDomElem.addEventListener("contextmenu",function(a){a.preventDefault()}),this.overlayDomElem=document.createElement("div"),this.overlayDomElem.className=g,this.hideListener=this.hide.bind(this),this.overlayDomElem.addEventListener("contextmenu",this.hideListener),this.overlayDomElem.addEventListener("click",this.hideListener);var j,k,l;for(j=0;ji;i++)for(var j=0;c>j;j++){var k,l=j+(d-i-1)*c,m=b.data[l];k=100===m?0:0===m?255:127;var n=4*(j+i*c);h.data[n]=k,h.data[++n]=k,h.data[++n]=k,h.data[++n]=255}g.putImageData(h,0,0);var o=new THREE.Texture(f);o.needsUpdate=!0;var p=new THREE.MeshBasicMaterial({map:o});p.side=THREE.DoubleSide,THREE.Mesh.call(this,e,p),this.position.x=c*b.info.resolution/2,this.position.y=d*b.info.resolution/2,this.scale.x=b.info.resolution,this.scale.y=b.info.resolution},ROS3D.OccupancyGrid.prototype.__proto__=THREE.Mesh.prototype,ROS3D.OccupancyGridClient=function(a){var b=this;a=a||{};var c=a.ros,d=a.topic||"/map";this.continuous=a.continuous,this.tfClient=a.tfClient,this.rootObject=a.rootObject||new THREE.Object3D,this.currentGrid=null;var e=new ROSLIB.Topic({ros:c,name:d,messageType:"nav_msgs/OccupancyGrid",compression:"png"});e.subscribe(function(a){b.currentGrid&&b.rootObject.remove(b.currentGrid);var c=new ROS3D.OccupancyGrid({message:a});b.currentGrid=b.tfClient?new ROS3D.SceneNode({frameID:a.header.frame_id,tfClient:b.tfClient,object:c,pose:a.info.origin}):c,b.rootObject.add(b.currentGrid),b.emit("change"),b.continuous||e.unsubscribe()})},ROS3D.OccupancyGridClient.prototype.__proto__=EventEmitter2.prototype,ROS3D.Marker=function(a){a=a||{};var b=a.path||"/",c=a.message;"/"!==b.substr(b.length-1)&&(b+="/"),THREE.Object3D.call(this),this.useQuaternion=!0,this.setPose(c.pose);var d=ROS3D.makeColorMaterial(c.color.r,c.color.g,c.color.b,c.color.a);switch(c.type){case ROS3D.MARKER_ARROW:var e,f=c.scale.x,g=.23*f,h=c.scale.y,i=.5*h,j=null;if(2===c.points.length){j=new THREE.Vector3(c.points[0].x,c.points[0].y,c.points[0].z);var k=new THREE.Vector3(c.points[1].x,c.points[1].y,c.points[1].z);e=j.clone().negate().add(k),f=e.length(),h=c.scale.y,i=c.scale.x,0!==c.scale.z&&(g=c.scale.z)}this.add(new ROS3D.Arrow({direction:e,origin:j,length:f,headLength:g,shaftDiameter:i,headDiameter:h,material:d}));break;case ROS3D.MARKER_CUBE:var l=new THREE.CubeGeometry(c.scale.x,c.scale.y,c.scale.z);this.add(new THREE.Mesh(l,d));break;case ROS3D.MARKER_SPHERE:var m=new THREE.SphereGeometry(.5),n=new THREE.Mesh(m,d);n.scale.x=c.scale.x,n.scale.y=c.scale.y,n.scale.z=c.scale.z,this.add(n);break;case ROS3D.MARKER_CYLINDER:var o=new THREE.CylinderGeometry(.5,.5,1,16,1,!1),p=new THREE.Mesh(o,d);p.useQuaternion=!0,p.quaternion.setFromAxisAngle(new THREE.Vector3(1,0,0),.5*Math.PI),p.scale=new THREE.Vector3(c.scale.x,c.scale.y,c.scale.z),this.add(p);break;case ROS3D.MARKER_CUBE_LIST:var q,r,s,t,u=new THREE.Object3D,v=c.points.length,w=v===c.colors.length,x=Math.ceil(v/1250);for(q=0;v>q;q+=x)r=new THREE.CubeGeometry(c.scale.x,c.scale.y,c.scale.z),s=w?ROS3D.makeColorMaterial(c.colors[q].r,c.colors[q].g,c.colors[q].b,c.colors[q].a):d,t=new THREE.Mesh(r,s),t.position.x=c.points[q].x,t.position.y=c.points[q].y,t.position.z=c.points[q].z,u.add(t);this.add(u);break;case ROS3D.MARKER_SPHERE_LIST:case ROS3D.MARKER_POINTS:var y,z=new THREE.Geometry,A=new THREE.ParticleBasicMaterial({size:c.scale.x});for(y=0;yg;f++){var i=new THREE.Color;i.setRGB(d[f].r,d[f].g,d[f].b),h.vertexColors.push(i)}e.faces.push(k)}b.vertexColors=THREE.VertexColors}else if(d.length===c.length/3){for(f=0;f=0;f--)if(d[f].object===b[e]){c.push(d[f]);break}this.getWebglObjects(a,b[e].children,c)}},ROS3D.Highlighter.prototype.renderHighlight=function(a,b,c){var d=[];this.getWebglObjects(b,this.hoverObjs,d),b.overrideMaterial=new THREE.MeshBasicMaterial({fog:!1,opacity:.5,depthTest:!0,depthWrite:!1,polygonOffset:!0,polygonOffsetUnits:-1,side:THREE.DoubleSide});var e=b.__webglObjects;b.__webglObjects=d,a.render(b,c),b.__webglObjects=e,b.overrideMaterial=null},ROS3D.MouseHandler=function(a){THREE.EventDispatcher.call(this),this.renderer=a.renderer,this.camera=a.camera,this.rootObject=a.rootObject,this.fallbackTarget=a.fallbackTarget,this.lastTarget=this.fallbackTarget,this.dragging=!1,this.projector=new THREE.Projector;var b=["contextmenu","click","dblclick","mouseout","mousedown","mouseup","mousemove","mousewheel","DOMMouseScroll","touchstart","touchend","touchcancel","touchleave","touchmove"];this.listeners={},b.forEach(function(a){this.listeners[a]=this.processDomEvent.bind(this),this.renderer.domElement.addEventListener(a,this.listeners[a],!1)},this)},ROS3D.MouseHandler.prototype.processDomEvent=function(a){a.preventDefault();var b=a.target,c=b.getBoundingClientRect(),d=a.clientX-c.left-b.clientLeft+b.scrollLeft,e=a.clientY-c.top-b.clientTop+b.scrollTop,f=2*(d/b.clientWidth)-1,g=2*(-e/b.clientHeight)+1,h=new THREE.Vector3(f,g,.5);this.projector.unprojectVector(h,this.camera);var i=new THREE.Raycaster(this.camera.position.clone(),h.sub(this.camera.position).normalize()),j=i.ray,k={mousePos:new THREE.Vector2(f,g),mouseRay:j,domEvent:a,camera:this.camera,intersection:this.lastIntersection};if("mouseout"===a.type)return this.dragging&&(this.notify(this.lastTarget,"mouseup",k),this.dragging=!1),this.notify(this.lastTarget,"mouseout",k),this.lastTarget=null,void 0;if(this.dragging)return this.notify(this.lastTarget,a.type,k),("mouseup"===a.type&&2===a.button||"click"===a.type)&&(this.dragging=!1),void 0;b=this.lastTarget;var l=[];if(l=i.intersectObject(this.rootObject,!0),l.length>0?(b=l[0].object,k.intersection=this.lastIntersection=l[0]):b=this.fallbackTarget,b!==this.lastTarget){var m=this.notify(b,"mouseover",k);m?this.notify(this.lastTarget,"mouseout",k):(b=this.fallbackTarget,b!==this.lastTarget&&(this.notify(b,"mouseover",k),this.notify(this.lastTarget,"mouseout",k)))}this.notify(b,a.type,k),"mousedown"===a.type&&(this.dragging=!0),this.lastTarget=b},ROS3D.MouseHandler.prototype.notify=function(a,b,c){for(c.type=b,c.cancelBubble=!1,c.stopPropagation=function(){c.cancelBubble=!0},c.currentTarget=a;c.currentTarget;){if(c.currentTarget.dispatchEvent&&c.currentTarget.dispatchEvent instanceof Function&&(c.currentTarget.dispatchEvent(c),c.cancelBubble))return this.dispatchEvent(c),!0;c.currentTarget=c.currentTarget.parent}return!1},ROS3D.OrbitControls=function(a){function b(a){var b=a.domEvent;switch(b.preventDefault(),b.button){case 0:w=v.ROTATE,l.set(b.clientX,b.clientY);break;case 1:w=v.MOVE,s=new THREE.Vector3(0,0,1);var c=(new THREE.Matrix4).extractRotation(this.camera.matrix);s.applyMatrix4(c),r=i.center.clone(),t=i.camera.position.clone(),u=d(a.mouseRay,r,s);break;case 2:w=v.ZOOM,o.set(b.clientX,b.clientY)}this.showAxes()}function c(a){var b=a.domEvent;if(w===v.ROTATE)m.set(b.clientX,b.clientY),n.subVectors(m,l),i.rotateLeft(2*Math.PI*n.x/k*i.userRotateSpeed),i.rotateUp(2*Math.PI*n.y/k*i.userRotateSpeed),l.copy(m),this.showAxes();else if(w===v.ZOOM)p.set(b.clientX,b.clientY),q.subVectors(p,o),q.y>0?i.zoomIn():i.zoomOut(),o.copy(p),this.showAxes();else if(w===v.MOVE){var c=d(a.mouseRay,i.center,s);if(!c)return;var e=(new THREE.Vector3).subVectors(u.clone(),c.clone());i.center.addVectors(r.clone(),e.clone()),i.camera.position.addVectors(t.clone(),e.clone()),i.update(),i.camera.updateMatrixWorld(),this.showAxes()}}function d(a,b,c){var d=new THREE.Vector3,e=new THREE.Vector3;d.subVectors(b,a.origin);var f=a.direction.dot(c);if(Math.abs(f)0?i.zoomOut():i.zoomIn(),this.showAxes()}}function g(a){b(a),a.preventDefault()}function h(a){c(a),a.preventDefault()}THREE.EventDispatcher.call(this);var i=this;a=a||{};var j=a.scene;this.camera=a.camera,this.center=new THREE.Vector3,this.userZoom=!0,this.userZoomSpeed=a.userZoomSpeed||1,this.userRotate=!0,this.userRotateSpeed=a.userRotateSpeed||1,this.autoRotate=a.autoRotate,this.autoRotateSpeed=a.autoRotateSpeed||2,this.camera.up=new THREE.Vector3(0,0,1);var k=1800,l=new THREE.Vector2,m=new THREE.Vector2,n=new THREE.Vector2,o=new THREE.Vector2,p=new THREE.Vector2,q=new THREE.Vector2,r=new THREE.Vector3,s=new THREE.Vector3,t=new THREE.Vector3,u=new THREE.Vector3;this.phiDelta=0,this.thetaDelta=0,this.scale=1,this.lastPosition=new THREE.Vector3;var v={NONE:-1,ROTATE:0,ZOOM:1,MOVE:2},w=v.NONE;this.axes=new ROS3D.Axes({shaftRadius:.025,headRadius:.07,headLength:.2}),j.add(this.axes),this.axes.traverse(function(a){a.visible=!1}),this.addEventListener("mousedown",b),this.addEventListener("mouseup",e),this.addEventListener("mousemove",c),this.addEventListener("touchstart",g),this.addEventListener("touchmove",h),this.addEventListener("mousewheel",f),this.addEventListener("DOMMouseScroll",f)},ROS3D.OrbitControls.prototype.showAxes=function(){var a=this;this.axes.traverse(function(a){a.visible=!0}),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=setTimeout(function(){a.axes.traverse(function(a){a.visible=!1}),a.hideTimeout=!1},1e3)},ROS3D.OrbitControls.prototype.rotateLeft=function(a){void 0===a&&(a=2*Math.PI/60/60*this.autoRotateSpeed),this.thetaDelta-=a},ROS3D.OrbitControls.prototype.rotateRight=function(a){void 0===a&&(a=2*Math.PI/60/60*this.autoRotateSpeed),this.thetaDelta+=a},ROS3D.OrbitControls.prototype.rotateUp=function(a){void 0===a&&(a=2*Math.PI/60/60*this.autoRotateSpeed),this.phiDelta-=a},ROS3D.OrbitControls.prototype.rotateDown=function(a){void 0===a&&(a=2*Math.PI/60/60*this.autoRotateSpeed),this.phiDelta+=a},ROS3D.OrbitControls.prototype.zoomIn=function(a){void 0===a&&(a=Math.pow(.95,this.userZoomSpeed)),this.scale/=a},ROS3D.OrbitControls.prototype.zoomOut=function(a){void 0===a&&(a=Math.pow(.95,this.userZoomSpeed)),this.scale*=a},ROS3D.OrbitControls.prototype.update=function(){var a=this.camera.position,b=a.clone().sub(this.center),c=Math.atan2(b.y,b.x),d=Math.atan2(Math.sqrt(b.y*b.y+b.x*b.x),b.z);this.autoRotate&&this.rotateLeft(2*Math.PI/60/60*this.autoRotateSpeed),c+=this.thetaDelta,d+=this.phiDelta;var e=1e-6;d=Math.max(e,Math.min(Math.PI-e,d));var f=b.length();b.y=f*Math.sin(d)*Math.sin(c),b.z=f*Math.cos(d),b.x=f*Math.sin(d)*Math.cos(c),b.multiplyScalar(this.scale),a.copy(this.center).add(b),this.camera.lookAt(this.center),f=b.length(),this.axes.position=this.center.clone(),this.axes.scale.x=this.axes.scale.y=this.axes.scale.z=.05*f,this.axes.updateMatrixWorld(!0),this.thetaDelta=0,this.phiDelta=0,this.scale=1,this.lastPosition.distanceTo(this.camera.position)>0&&(this.dispatchEvent({type:"change"}),this.lastPosition.copy(this.camera.position))}; \ No newline at end of file diff --git a/src/Ros3D.js b/src/Ros3D.js index 3a09f6a0..7a8962b1 100644 --- a/src/Ros3D.js +++ b/src/Ros3D.js @@ -4,7 +4,7 @@ */ var ROS3D = ROS3D || { - REVISION : '6-devel' + REVISION : '6' }; // Marker types From 13881e1d405d079e1dc70ebba4e737e8ea55656e Mon Sep 17 00:00:00 2001 From: Russell Toris Date: Thu, 6 Jun 2013 10:18:13 -0400 Subject: [PATCH 4/5] r6 docs --- doc/Arrow.js.html | 2 +- doc/Axes.js.html | 2 +- doc/DepthCloud.js.html | 51 ++--- doc/Grid.js.html | 2 +- doc/Highlighter.js.html | 2 +- doc/InteractiveMarker.js.html | 2 +- doc/InteractiveMarkerClient.js.html | 2 +- doc/InteractiveMarkerControl.js.html | 2 +- doc/InteractiveMarkerHandle.js.html | 2 +- doc/InteractiveMarkerMenu.js.html | 2 +- doc/Marker.js.html | 32 ++- doc/MarkerClient.js.html | 2 +- doc/MeshResource.js.html | 2 +- doc/MouseHandler.js.html | 2 +- doc/OccupancyGrid.js.html | 2 +- doc/OccupancyGridClient.js.html | 2 +- doc/OrbitControls.js.html | 2 +- doc/ROS3D.Arrow.html | 2 +- doc/ROS3D.Axes.html | 2 +- doc/ROS3D.DepthCloud.html | 280 +++++++++++++++++++++++- doc/ROS3D.Grid.html | 2 +- doc/ROS3D.Highlighter.html | 2 +- doc/ROS3D.InteractiveMarker.html | 2 +- doc/ROS3D.InteractiveMarkerClient.html | 2 +- doc/ROS3D.InteractiveMarkerControl.html | 2 +- doc/ROS3D.InteractiveMarkerHandle.html | 2 +- doc/ROS3D.InteractiveMarkerMenu.html | 2 +- doc/ROS3D.Marker.html | 4 +- doc/ROS3D.MarkerClient.html | 2 +- doc/ROS3D.MeshResource.html | 2 +- doc/ROS3D.MouseHandler.html | 2 +- doc/ROS3D.OccupancyGrid.html | 2 +- doc/ROS3D.OccupancyGridClient.html | 2 +- doc/ROS3D.OrbitControls.html | 2 +- doc/ROS3D.SceneNode.html | 2 +- doc/ROS3D.TriangleList.html | 2 +- doc/ROS3D.Urdf.html | 2 +- doc/ROS3D.UrdfClient.html | 2 +- doc/ROS3D.Viewer.html | 2 +- doc/Ros3D.js.html | 4 +- doc/SceneNode.js.html | 2 +- doc/TriangleList.js.html | 2 +- doc/Urdf.js.html | 22 +- doc/UrdfClient.js.html | 2 +- doc/Viewer.js.html | 2 +- doc/global.html | 2 +- doc/index.html | 2 +- 47 files changed, 387 insertions(+), 88 deletions(-) diff --git a/doc/Arrow.js.html b/doc/Arrow.js.html index 0845b785..dc492862 100644 --- a/doc/Arrow.js.html +++ b/doc/Arrow.js.html @@ -122,7 +122,7 @@

Index

Classes

  • diff --git a/doc/Axes.js.html b/doc/Axes.js.html index 5735b5eb..ccee10fb 100644 --- a/doc/Axes.js.html +++ b/doc/Axes.js.html @@ -111,7 +111,7 @@

    Index

    Classes

    • diff --git a/doc/DepthCloud.js.html b/doc/DepthCloud.js.html index 5aa69677..66c7669e 100644 --- a/doc/DepthCloud.js.html +++ b/doc/DepthCloud.js.html @@ -34,28 +34,25 @@

      Source: depthcloud/DepthCloud.js

      * * @constructor * @param options - object with following keys: - * * f - The camera's focal length - * * pointSize - Point size (pixels) for rendered point cloud - * * width, height - Dimensions of the video stream - * * whiteness - Blends rgb values to white (0..100) - * * varianceThreshold - Threshold for variance filter, used for compression artifact removal + * * url - the URL of the stream + * * f (optional) - the camera's focal length (defaults to standard Kinect calibration) + * * pointSize (optional) - point size (pixels) for rendered point cloud + * * width (optional) - width of the video stream + * * height (optional) - height of the video stream + * * whiteness (optional) - blends rgb values to white (0..100) + * * varianceThreshold (optional) - threshold for variance filter, used for compression artifact removal */ ROS3D.DepthCloud = function(options) { - + options = options || {}; THREE.Object3D.call(this); - - // /////////////////////////// - // depth cloud options - // /////////////////////////// - + this.url = options.url; - // f defaults to standard Kinect calibration - this.f = (options.f !== undefined) ? options.f : 526; - this.pointSize = (options.pointSize !== undefined) ? options.pointSize : 3; - this.width = (options.width !== undefined) ? options.width : 1024; - this.height = (options.height !== undefined) ? options.height : 1024; - this.whiteness = (options.whiteness !== undefined) ? options.whiteness : 0; - this.varianceThreshold = (options.varianceThreshold !== undefined) ? options.varianceThreshold : 0.000016667; + this.f = options.f || 526; + this.pointSize = options.pointSize || 3; + this.width = options.width || 1024; + this.height = options.height || 1024; + this.whiteness = options.whiteness || 0; + this.varianceThreshold = options.varianceThreshold || 0.000016667; var metaLoaded = false; this.video = document.createElement('video'); @@ -67,9 +64,7 @@

      Source: depthcloud/DepthCloud.js

      this.video.crossOrigin = 'Anonymous'; this.video.setAttribute('crossorigin', 'Anonymous'); - // /////////////////////////// - // load shaders - // /////////////////////////// + // define custom shaders this.vertex_shader = [ 'uniform sampler2D map;', '', @@ -242,7 +237,7 @@

      Source: depthcloud/DepthCloud.js

      }; ROS3D.DepthCloud.prototype.__proto__ = THREE.Object3D.prototype; -/* +/** * Callback called when video metadata is ready */ ROS3D.DepthCloud.prototype.metaLoaded = function() { @@ -250,7 +245,7 @@

      Source: depthcloud/DepthCloud.js

      this.initStreamer(); }; -/* +/** * Callback called when video metadata is ready */ ROS3D.DepthCloud.prototype.initStreamer = function() { @@ -269,9 +264,7 @@

      Source: depthcloud/DepthCloud.js

      } this.material = new THREE.ShaderMaterial({ - uniforms : { - 'map' : { type : 't', value : this.texture @@ -307,8 +300,6 @@

      Source: depthcloud/DepthCloud.js

      }, vertexShader : this.vertex_shader, fragmentShader : this.fragment_shader - // depthWrite: false - }); this.mesh = new THREE.ParticleSystem(this.geometry, this.material); @@ -326,14 +317,14 @@

      Source: depthcloud/DepthCloud.js

      } }; -/* +/** * Start video playback */ ROS3D.DepthCloud.prototype.startStream = function() { this.video.play(); }; -/* +/** * Stop video playback */ ROS3D.DepthCloud.prototype.stopStream = function() { @@ -355,7 +346,7 @@

      Index

      Classes

      • diff --git a/doc/Grid.js.html b/doc/Grid.js.html index f2cc1d40..f8a8a1d1 100644 --- a/doc/Grid.js.html +++ b/doc/Grid.js.html @@ -70,7 +70,7 @@

        Index

        Classes

        • diff --git a/doc/Highlighter.js.html b/doc/Highlighter.js.html index 7144505b..50f7c5d4 100644 --- a/doc/Highlighter.js.html +++ b/doc/Highlighter.js.html @@ -136,7 +136,7 @@

          Index

          Classes

          • diff --git a/doc/InteractiveMarker.js.html b/doc/InteractiveMarker.js.html index f50b2554..dd84e810 100644 --- a/doc/InteractiveMarker.js.html +++ b/doc/InteractiveMarker.js.html @@ -342,7 +342,7 @@

            Index

            Classes

            • diff --git a/doc/InteractiveMarkerClient.js.html b/doc/InteractiveMarkerClient.js.html index 8077923f..4e115a9b 100644 --- a/doc/InteractiveMarkerClient.js.html +++ b/doc/InteractiveMarkerClient.js.html @@ -224,7 +224,7 @@

              Index

              Classes

              • diff --git a/doc/InteractiveMarkerControl.js.html b/doc/InteractiveMarkerControl.js.html index 20e58fca..b36a3323 100644 --- a/doc/InteractiveMarkerControl.js.html +++ b/doc/InteractiveMarkerControl.js.html @@ -222,7 +222,7 @@

                Index

                Classes

                • diff --git a/doc/InteractiveMarkerHandle.js.html b/doc/InteractiveMarkerHandle.js.html index e63d08c4..cd8a2b0b 100644 --- a/doc/InteractiveMarkerHandle.js.html +++ b/doc/InteractiveMarkerHandle.js.html @@ -213,7 +213,7 @@

                  Index

                  Classes

                  • diff --git a/doc/InteractiveMarkerMenu.js.html b/doc/InteractiveMarkerMenu.js.html index 37aef3e8..b93b1bee 100644 --- a/doc/InteractiveMarkerMenu.js.html +++ b/doc/InteractiveMarkerMenu.js.html @@ -207,7 +207,7 @@

                    Index

                    Classes

                    • diff --git a/doc/Marker.js.html b/doc/Marker.js.html index 8ab1cf2d..709a643a 100644 --- a/doc/Marker.js.html +++ b/doc/Marker.js.html @@ -116,6 +116,36 @@

                      Source: markers/Marker.js

                      this.add(cylinderMesh); break; case ROS3D.MARKER_CUBE_LIST: + // holds the main object + var object = new THREE.Object3D(); + + // check if custom colors should be used + var numPoints = message.points.length; + var createColors = (numPoints === message.colors.length); + // do not render giant lists + var stepSize = Math.ceil(numPoints / 1250); + + // add the points + var p, cube, curColor, newMesh; + for (p = 0; p < numPoints; p+=stepSize) { + cube = new THREE.CubeGeometry(message.scale.x, message.scale.y, message.scale.z); + + // check the color + if(createColors) { + curColor = ROS3D.makeColorMaterial(message.colors[p].r, message.colors[p].g, message.colors[p].b, message.colors[p].a); + } else { + curColor = colorMaterial; + } + + newMesh = new THREE.Mesh(cube, curColor); + newMesh.position.x = message.points[p].x; + newMesh.position.y = message.points[p].y; + newMesh.position.z = message.points[p].z; + object.add(newMesh); + } + + this.add(object); + break; case ROS3D.MARKER_SPHERE_LIST: case ROS3D.MARKER_POINTS: // for now, use a particle system for the lists @@ -232,7 +262,7 @@

                      Index

                      Classes

                      • diff --git a/doc/MarkerClient.js.html b/doc/MarkerClient.js.html index 1b9bc340..bcd5d5ac 100644 --- a/doc/MarkerClient.js.html +++ b/doc/MarkerClient.js.html @@ -96,7 +96,7 @@

                        Index

                        Classes

                        • diff --git a/doc/MeshResource.js.html b/doc/MeshResource.js.html index f40e12d5..8db0b949 100644 --- a/doc/MeshResource.js.html +++ b/doc/MeshResource.js.html @@ -92,7 +92,7 @@

                          Index

                          Classes

                          • diff --git a/doc/MouseHandler.js.html b/doc/MouseHandler.js.html index a5ba6766..92e97f7b 100644 --- a/doc/MouseHandler.js.html +++ b/doc/MouseHandler.js.html @@ -199,7 +199,7 @@

                            Index

                            Classes

                            • diff --git a/doc/OccupancyGrid.js.html b/doc/OccupancyGrid.js.html index 260f7931..1886c45e 100644 --- a/doc/OccupancyGrid.js.html +++ b/doc/OccupancyGrid.js.html @@ -113,7 +113,7 @@

                              Index

                              Classes

                              • diff --git a/doc/OccupancyGridClient.js.html b/doc/OccupancyGridClient.js.html index 486ff99a..b2e287a7 100644 --- a/doc/OccupancyGridClient.js.html +++ b/doc/OccupancyGridClient.js.html @@ -111,7 +111,7 @@

                                Index

                                Classes

                                • diff --git a/doc/OrbitControls.js.html b/doc/OrbitControls.js.html index 17c89243..cec78ae6 100644 --- a/doc/OrbitControls.js.html +++ b/doc/OrbitControls.js.html @@ -438,7 +438,7 @@

                                  Index

                                  Classes

                                  • diff --git a/doc/ROS3D.Arrow.html b/doc/ROS3D.Arrow.html index 3db768cf..ed377a17 100644 --- a/doc/ROS3D.Arrow.html +++ b/doc/ROS3D.Arrow.html @@ -517,7 +517,7 @@

                                    Index

                                    Classes

                                    • diff --git a/doc/ROS3D.Axes.html b/doc/ROS3D.Axes.html index e8a71e52..9af73326 100644 --- a/doc/ROS3D.Axes.html +++ b/doc/ROS3D.Axes.html @@ -297,7 +297,7 @@

                                      Index

                                      Classes

                                      • diff --git a/doc/ROS3D.DepthCloud.html b/doc/ROS3D.DepthCloud.html index 67e8f6e4..e541439d 100644 --- a/doc/ROS3D.DepthCloud.html +++ b/doc/ROS3D.DepthCloud.html @@ -95,11 +95,13 @@
                                        Parameters:
                                        object with following keys: - * f - The camera's focal length - * pointSize - Point size (pixels) for rendered point cloud - * width, height - Dimensions of the video stream - * whiteness - Blends rgb values to white (0..100) - * varianceThreshold - Threshold for variance filter, used for compression artifact removal + * url - the URL of the stream + * f (optional) - the camera's focal length (defaults to standard Kinect calibration) + * pointSize (optional) - point size (pixels) for rendered point cloud + * width (optional) - width of the video stream + * height (optional) - height of the video stream + * whiteness (optional) - blends rgb values to white (0..100) + * varianceThreshold (optional) - threshold for variance filter, used for compression artifact removal @@ -130,7 +132,7 @@
                                        Parameters:
                                        Source:
                                        @@ -167,6 +169,270 @@
                                        Parameters:
                                        +

                                        Methods

                                        + +
                                        + +
                                        +

                                        initStreamer()

                                        + + +
                                        +
                                        + + +
                                        + Callback called when video metadata is ready +
                                        + + + + + + + + + +
                                        + + + + + + + + + + + + + + + + + + + +
                                        Source:
                                        +
                                        + + + + + + + +
                                        + + + + + + + + + +
                                        + + + +
                                        +

                                        metaLoaded()

                                        + + +
                                        +
                                        + + +
                                        + Callback called when video metadata is ready +
                                        + + + + + + + + + +
                                        + + + + + + + + + + + + + + + + + + + +
                                        Source:
                                        +
                                        + + + + + + + +
                                        + + + + + + + + + +
                                        + + + +
                                        +

                                        startStream()

                                        + + +
                                        +
                                        + + +
                                        + Start video playback +
                                        + + + + + + + + + +
                                        + + + + + + + + + + + + + + + + + + + +
                                        Source:
                                        +
                                        + + + + + + + +
                                        + + + + + + + + + +
                                        + + + +
                                        +

                                        stopStream()

                                        + + +
                                        +
                                        + + +
                                        + Stop video playback +
                                        + + + + + + + + + +
                                        + + + + + + + + + + + + + + + + + + + +
                                        Source:
                                        +
                                        + + + + + + + +
                                        + + + + + + + + + +
                                        + +
                                        + @@ -187,7 +453,7 @@

                                        Index

                                        Classes

                                        • diff --git a/doc/ROS3D.Grid.html b/doc/ROS3D.Grid.html index dcbbd9e7..8871df27 100644 --- a/doc/ROS3D.Grid.html +++ b/doc/ROS3D.Grid.html @@ -185,7 +185,7 @@

                                          Index

                                          Classes

                                          • diff --git a/doc/ROS3D.Highlighter.html b/doc/ROS3D.Highlighter.html index 600433a3..5c7a2f54 100644 --- a/doc/ROS3D.Highlighter.html +++ b/doc/ROS3D.Highlighter.html @@ -691,7 +691,7 @@

                                            Index

                                            Classes

                                            • diff --git a/doc/ROS3D.InteractiveMarker.html b/doc/ROS3D.InteractiveMarker.html index b8db0287..5ebf88e6 100644 --- a/doc/ROS3D.InteractiveMarker.html +++ b/doc/ROS3D.InteractiveMarker.html @@ -1611,7 +1611,7 @@

                                              Index

                                              Classes

                                              • diff --git a/doc/ROS3D.InteractiveMarkerClient.html b/doc/ROS3D.InteractiveMarkerClient.html index 72910ad8..cf763988 100644 --- a/doc/ROS3D.InteractiveMarkerClient.html +++ b/doc/ROS3D.InteractiveMarkerClient.html @@ -689,7 +689,7 @@

                                                Index

                                                Classes

                                                • diff --git a/doc/ROS3D.InteractiveMarkerControl.html b/doc/ROS3D.InteractiveMarkerControl.html index 375a7527..804b1a3d 100644 --- a/doc/ROS3D.InteractiveMarkerControl.html +++ b/doc/ROS3D.InteractiveMarkerControl.html @@ -298,7 +298,7 @@

                                                  Index

                                                  Classes

                                                  • diff --git a/doc/ROS3D.InteractiveMarkerHandle.html b/doc/ROS3D.InteractiveMarkerHandle.html index 0ac01fe5..9001a5ca 100644 --- a/doc/ROS3D.InteractiveMarkerHandle.html +++ b/doc/ROS3D.InteractiveMarkerHandle.html @@ -1240,7 +1240,7 @@

                                                    Index

                                                    Classes

                                                    • diff --git a/doc/ROS3D.InteractiveMarkerMenu.html b/doc/ROS3D.InteractiveMarkerMenu.html index 6474def8..f6582e58 100644 --- a/doc/ROS3D.InteractiveMarkerMenu.html +++ b/doc/ROS3D.InteractiveMarkerMenu.html @@ -550,7 +550,7 @@

                                                      Index

                                                      Classes

                                                      • diff --git a/doc/ROS3D.Marker.html b/doc/ROS3D.Marker.html index d7c8d503..b731c4a4 100644 --- a/doc/ROS3D.Marker.html +++ b/doc/ROS3D.Marker.html @@ -253,7 +253,7 @@
                                                        Parameters:
                                                        Source:
                                                        @@ -296,7 +296,7 @@

                                                        Index

                                                        Classes

                                                        • diff --git a/doc/ROS3D.MarkerClient.html b/doc/ROS3D.MarkerClient.html index 81ee7848..b583a968 100644 --- a/doc/ROS3D.MarkerClient.html +++ b/doc/ROS3D.MarkerClient.html @@ -189,7 +189,7 @@

                                                          Index

                                                          Classes

                                                          • diff --git a/doc/ROS3D.MeshResource.html b/doc/ROS3D.MeshResource.html index 658f59cd..d0c32f81 100644 --- a/doc/ROS3D.MeshResource.html +++ b/doc/ROS3D.MeshResource.html @@ -186,7 +186,7 @@

                                                            Index

                                                            Classes

                                                            • diff --git a/doc/ROS3D.MouseHandler.html b/doc/ROS3D.MouseHandler.html index a21fbef2..831514cd 100644 --- a/doc/ROS3D.MouseHandler.html +++ b/doc/ROS3D.MouseHandler.html @@ -452,7 +452,7 @@

                                                              Index

                                                              Classes

                                                              • diff --git a/doc/ROS3D.OccupancyGrid.html b/doc/ROS3D.OccupancyGrid.html index ab3d08f7..958a10e1 100644 --- a/doc/ROS3D.OccupancyGrid.html +++ b/doc/ROS3D.OccupancyGrid.html @@ -183,7 +183,7 @@

                                                                Index

                                                                Classes

                                                                • diff --git a/doc/ROS3D.OccupancyGridClient.html b/doc/ROS3D.OccupancyGridClient.html index 88db9da8..79376b76 100644 --- a/doc/ROS3D.OccupancyGridClient.html +++ b/doc/ROS3D.OccupancyGridClient.html @@ -190,7 +190,7 @@

                                                                  Index

                                                                  Classes

                                                                  • diff --git a/doc/ROS3D.OrbitControls.html b/doc/ROS3D.OrbitControls.html index 0a37bb1d..ad5a5196 100644 --- a/doc/ROS3D.OrbitControls.html +++ b/doc/ROS3D.OrbitControls.html @@ -1856,7 +1856,7 @@

                                                                    Index

                                                                    Classes

                                                                    • diff --git a/doc/ROS3D.SceneNode.html b/doc/ROS3D.SceneNode.html index e86eaf9a..abfc8d74 100644 --- a/doc/ROS3D.SceneNode.html +++ b/doc/ROS3D.SceneNode.html @@ -298,7 +298,7 @@

                                                                      Index

                                                                      Classes

                                                                      • diff --git a/doc/ROS3D.TriangleList.html b/doc/ROS3D.TriangleList.html index d9fa2b4d..5ab80ea1 100644 --- a/doc/ROS3D.TriangleList.html +++ b/doc/ROS3D.TriangleList.html @@ -297,7 +297,7 @@

                                                                        Index

                                                                        Classes

                                                                        • diff --git a/doc/ROS3D.Urdf.html b/doc/ROS3D.Urdf.html index 896b617c..6720c0ca 100644 --- a/doc/ROS3D.Urdf.html +++ b/doc/ROS3D.Urdf.html @@ -185,7 +185,7 @@

                                                                          Index

                                                                          Classes

                                                                          • diff --git a/doc/ROS3D.UrdfClient.html b/doc/ROS3D.UrdfClient.html index db7813b1..0d858111 100644 --- a/doc/ROS3D.UrdfClient.html +++ b/doc/ROS3D.UrdfClient.html @@ -191,7 +191,7 @@

                                                                            Index

                                                                            Classes

                                                                            • diff --git a/doc/ROS3D.Viewer.html b/doc/ROS3D.Viewer.html index efdd5517..3d53969f 100644 --- a/doc/ROS3D.Viewer.html +++ b/doc/ROS3D.Viewer.html @@ -384,7 +384,7 @@

                                                                              Index

                                                                              Classes

                                                                              • diff --git a/doc/Ros3D.js.html b/doc/Ros3D.js.html index dd2f650e..b0257871 100644 --- a/doc/Ros3D.js.html +++ b/doc/Ros3D.js.html @@ -31,7 +31,7 @@

                                                                                Source: Ros3D.js

                                                                                */ var ROS3D = ROS3D || { - REVISION : '5' + REVISION : '6' }; // Marker types @@ -210,7 +210,7 @@

                                                                                Index

                                                                                Classes

                                                                                • diff --git a/doc/SceneNode.js.html b/doc/SceneNode.js.html index 3921d98b..bb50c74f 100644 --- a/doc/SceneNode.js.html +++ b/doc/SceneNode.js.html @@ -100,7 +100,7 @@

                                                                                  Index

                                                                                  Classes

                                                                                  • diff --git a/doc/TriangleList.js.html b/doc/TriangleList.js.html index b8cea150..224d9b83 100644 --- a/doc/TriangleList.js.html +++ b/doc/TriangleList.js.html @@ -118,7 +118,7 @@

                                                                                    Index

                                                                                    Classes

                                                                                    • diff --git a/doc/Urdf.js.html b/doc/Urdf.js.html index 584f7118..e810eee6 100644 --- a/doc/Urdf.js.html +++ b/doc/Urdf.js.html @@ -60,15 +60,27 @@

                                                                                      Source: urdf/Urdf.js

                                                                                      // ignore mesh files which are not in Collada format if (fileType === '.dae') { + // create the model + var mesh = new ROS3D.MeshResource({ + path : path, + resource : uri.substring(10) + }); + + // check for a scale + if(link.visual.geometry.scale) { + mesh.scale = new THREE.Vector3( + link.visual.geometry.scale.x, + link.visual.geometry.scale.y, + link.visual.geometry.scale.z + ); + } + // create a scene node with the model var sceneNode = new ROS3D.SceneNode({ frameID : frameID, pose : link.visual.origin, tfClient : tfClient, - object : new ROS3D.MeshResource({ - path : path, - resource : uri.substring(10) - }) + object : mesh }); this.add(sceneNode); } @@ -93,7 +105,7 @@

                                                                                      Index

                                                                                      Classes

                                                                                      • diff --git a/doc/UrdfClient.js.html b/doc/UrdfClient.js.html index 7c49333c..852f0176 100644 --- a/doc/UrdfClient.js.html +++ b/doc/UrdfClient.js.html @@ -89,7 +89,7 @@

                                                                                        Index

                                                                                        Classes

                                                                                        • diff --git a/doc/Viewer.js.html b/doc/Viewer.js.html index 68d07bd1..dd5f31eb 100644 --- a/doc/Viewer.js.html +++ b/doc/Viewer.js.html @@ -162,7 +162,7 @@

                                                                                          Index

                                                                                          Classes

                                                                                          • diff --git a/doc/global.html b/doc/global.html index a090ab0b..fdea35ab 100644 --- a/doc/global.html +++ b/doc/global.html @@ -167,7 +167,7 @@

                                                                                            Index

                                                                                            Classes

                                                                                            • diff --git a/doc/index.html b/doc/index.html index aafd3ecf..0d989131 100644 --- a/doc/index.html +++ b/doc/index.html @@ -54,7 +54,7 @@

                                                                                              Index

                                                                                              Classes

                                                                                              • From 399693388a765a1cb18e03db931c4cf9ef061719 Mon Sep 17 00:00:00 2001 From: Russell Toris Date: Thu, 6 Jun 2013 10:19:55 -0400 Subject: [PATCH 5/5] r7-devel started --- CHANGELOG.md | 2 ++ build/ros3d.js | 2 +- build/ros3d.min.js | 2 +- src/Ros3D.js | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b5829b0..d152c123 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +DEVEL - **r7** + 2013-06-06 - **r6** * MARKER_CUBE_LIST added to Marker.js [(rctoris)](https://github.com/rctoris/) * URDF meshes are now scaled correctly [(rctoris)](https://github.com/rctoris/) diff --git a/build/ros3d.js b/build/ros3d.js index 28cec71a..422474c1 100644 --- a/build/ros3d.js +++ b/build/ros3d.js @@ -4,7 +4,7 @@ */ var ROS3D = ROS3D || { - REVISION : '6' + REVISION : '7-devel' }; // Marker types diff --git a/build/ros3d.min.js b/build/ros3d.min.js index 68f7197c..ecf3ebae 100644 --- a/build/ros3d.min.js +++ b/build/ros3d.min.js @@ -1,2 +1,2 @@ -var ROS3D=ROS3D||{REVISION:"6"};ROS3D.MARKER_ARROW=0,ROS3D.MARKER_CUBE=1,ROS3D.MARKER_SPHERE=2,ROS3D.MARKER_CYLINDER=3,ROS3D.MARKER_LINE_STRIP=4,ROS3D.MARKER_LINE_LIST=5,ROS3D.MARKER_CUBE_LIST=6,ROS3D.MARKER_SPHERE_LIST=7,ROS3D.MARKER_POINTS=8,ROS3D.MARKER_TEXT_VIEW_FACING=9,ROS3D.MARKER_MESH_RESOURCE=10,ROS3D.MARKER_TRIANGLE_LIST=11,ROS3D.INTERACTIVE_MARKER_KEEP_ALIVE=0,ROS3D.INTERACTIVE_MARKER_POSE_UPDATE=1,ROS3D.INTERACTIVE_MARKER_MENU_SELECT=2,ROS3D.INTERACTIVE_MARKER_BUTTON_CLICK=3,ROS3D.INTERACTIVE_MARKER_MOUSE_DOWN=4,ROS3D.INTERACTIVE_MARKER_MOUSE_UP=5,ROS3D.INTERACTIVE_MARKER_NONE=0,ROS3D.INTERACTIVE_MARKER_MENU=1,ROS3D.INTERACTIVE_MARKER_BUTTON=2,ROS3D.INTERACTIVE_MARKER_MOVE_AXIS=3,ROS3D.INTERACTIVE_MARKER_MOVE_PLANE=4,ROS3D.INTERACTIVE_MARKER_ROTATE_AXIS=5,ROS3D.INTERACTIVE_MARKER_MOVE_ROTATE=6,ROS3D.INTERACTIVE_MARKER_INHERIT=0,ROS3D.INTERACTIVE_MARKER_FIXED=1,ROS3D.INTERACTIVE_MARKER_VIEW_FACING=2,ROS3D.makeColorMaterial=function(a,b,c,d){var e=new THREE.Color;return e.setRGB(a,b,c),.99>=d?new THREE.MeshBasicMaterial({color:e.getHex(),opacity:d+.1,transparent:!0,depthWrite:!0,blendSrc:THREE.SrcAlphaFactor,blendDst:THREE.OneMinusSrcAlphaFactor,blendEquation:THREE.ReverseSubtractEquation,blending:THREE.NormalBlending}):new THREE.MeshLambertMaterial({color:e.getHex(),opacity:d,blending:THREE.NormalBlending})},ROS3D.intersectPlane=function(a,b,c){var d=new THREE.Vector3,e=new THREE.Vector3;d.subVectors(b,a.origin);var f=a.direction.dot(c);if(Math.abs(f)0.99)"," {"," vec4 depthColor2 = texture2D( map, vUv2 );"," float depth2 = ( depthColor2.r + depthColor2.g + depthColor2.b ) / 3.0 ;"," depth = 0.99+depth2;"," }"," "," return depth;"," }","","float median(float a, float b, float c)"," {"," float r=a;"," "," if ( (a0.5) || (vUvP.y<0.5) || (vUvP.y>0.0))"," {"," vec2 smp = decodeDepth(vec2(position.x, position.y));"," float depth = smp.x;"," depthVariance = smp.y;"," "," float z = -depth;"," "," pos = vec4("," ( position.x / width - 0.5 ) * z * (1000.0/focallength) * -1.0,"," ( position.y / height - 0.5 ) * z * (1000.0/focallength),"," (- z + zOffset / 1000.0) * 2.0,"," 1.0);"," "," vec2 maskP = vec2( position.x / (width*2.0), position.y / (height*2.0) );"," vec4 maskColor = texture2D( map, maskP );"," maskVal = ( maskColor.r + maskColor.g + maskColor.b ) / 3.0 ;"," }"," "," gl_PointSize = pointSize;"," gl_Position = projectionMatrix * modelViewMatrix * pos;"," ","}"].join("\n"),this.fragment_shader=["uniform sampler2D map;","uniform float varianceThreshold;","uniform float whiteness;","","varying vec2 vUvP;","varying vec2 colorP;","","varying float depthVariance;","varying float maskVal;","","","void main() {"," "," vec4 color;"," "," if ( (depthVariance>varianceThreshold) || (maskVal>0.5) ||(vUvP.x<0.0)|| (vUvP.x>0.5) || (vUvP.y<0.5) || (vUvP.y>1.0))"," { "," discard;"," }"," else "," {"," color = texture2D( map, colorP );"," "," float fader = whiteness /100.0;"," "," color.r = color.r * (1.0-fader)+ fader;"," "," color.g = color.g * (1.0-fader)+ fader;"," "," color.b = color.b * (1.0-fader)+ fader;"," "," color.a = 1.0;//smoothstep( 20000.0, -20000.0, gl_FragCoord.z / gl_FragCoord.w );"," }"," "," gl_FragColor = vec4( color.r, color.g, color.b, color.a );"," ","}"].join("\n")},ROS3D.DepthCloud.prototype.__proto__=THREE.Object3D.prototype,ROS3D.DepthCloud.prototype.metaLoaded=function(){this.metaLoaded=!0,this.initStreamer()},ROS3D.DepthCloud.prototype.initStreamer=function(){if(this.metaLoaded){this.texture=new THREE.Texture(this.video),this.geometry=new THREE.Geometry;for(var a=0,b=this.width*this.height;b>a;a++){var c=new THREE.Vector3;c.x=a%this.width,c.y=Math.floor(a/this.width),this.geometry.vertices.push(c)}this.material=new THREE.ShaderMaterial({uniforms:{map:{type:"t",value:this.texture},width:{type:"f",value:this.width},height:{type:"f",value:this.height},focallength:{type:"f",value:this.f},pointSize:{type:"f",value:this.pointSize},zOffset:{type:"f",value:0},whiteness:{type:"f",value:this.whiteness},varianceThreshold:{type:"f",value:this.varianceThreshold}},vertexShader:this.vertex_shader,fragmentShader:this.fragment_shader}),this.mesh=new THREE.ParticleSystem(this.geometry,this.material),this.mesh.position.x=0,this.mesh.position.y=0,this.add(this.mesh);var d=this;setInterval(function(){d.video.readyState===d.video.HAVE_ENOUGH_DATA&&(d.texture.needsUpdate=!0)},1e3/30)}},ROS3D.DepthCloud.prototype.startStream=function(){this.video.play()},ROS3D.DepthCloud.prototype.stopStream=function(){this.video.stop()},ROS3D.InteractiveMarker=function(a){THREE.Object3D.call(this),THREE.EventDispatcher.call(this);var b=this;a=a||{};var c=a.handle;this.name=c.name;var d=a.camera,e=a.path||"/";this.dragging=!1,this.onServerSetPose({pose:c.pose}),this.dragStart={position:new THREE.Vector3,orientation:new THREE.Quaternion,positionWorld:new THREE.Vector3,orientationWorld:new THREE.Quaternion,event3d:{}},c.controls.forEach(function(a){b.add(new ROS3D.InteractiveMarkerControl({parent:b,message:a,camera:d,path:e}))}),c.menuEntries.length>0&&(this.menu=new ROS3D.InteractiveMarkerMenu({menuEntries:c.menuEntries}),this.menu.addEventListener("menu-select",function(a){b.dispatchEvent(a)}))},ROS3D.InteractiveMarker.prototype.__proto__=THREE.Object3D.prototype,ROS3D.InteractiveMarker.prototype.showMenu=function(a,b){this.menu&&this.menu.show(a,b)},ROS3D.InteractiveMarker.prototype.moveAxis=function(a,b,c){if(this.dragging){var d=a.currentControlOri,e=b.clone().applyQuaternion(d),f=this.dragStart.event3d.intersection.point,g=e.clone().applyQuaternion(this.dragStart.orientationWorld.clone()),h=new THREE.Ray(f,g),i=ROS3D.closestAxisPoint(h,c.camera,c.mousePos),j=new THREE.Vector3;j.addVectors(this.dragStart.position,e.clone().applyQuaternion(this.dragStart.orientation).multiplyScalar(i)),this.setPosition(a,j),c.stopPropagation()}},ROS3D.InteractiveMarker.prototype.movePlane=function(a,b,c){if(this.dragging){var d=a.currentControlOri,e=b.clone().applyQuaternion(d),f=this.dragStart.event3d.intersection.point,g=e.clone().applyQuaternion(this.dragStart.orientationWorld),h=ROS3D.intersectPlane(c.mouseRay,f,g),i=new THREE.Vector3;i.subVectors(h,f),i.add(this.dragStart.positionWorld),this.setPosition(a,i),c.stopPropagation()}},ROS3D.InteractiveMarker.prototype.rotateAxis=function(a,b,c){if(this.dragging){a.updateMatrixWorld();var d=a.currentControlOri,e=d.clone().multiply(b.clone()),f=new THREE.Vector3(1,0,0).applyQuaternion(e),g=this.dragStart.event3d.intersection.point,h=f.applyQuaternion(this.dragStart.orientationWorld),i=ROS3D.intersectPlane(c.mouseRay,g,h),j=new THREE.Ray(this.dragStart.positionWorld,h),k=ROS3D.intersectPlane(j,g,h),l=this.dragStart.orientationWorld.clone().multiply(e),m=l.clone().inverse();i.sub(k),i.applyQuaternion(m);var n=this.dragStart.event3d.intersection.point.clone();n.sub(k),n.applyQuaternion(m);var o=Math.atan2(i.y,i.z),p=Math.atan2(n.y,n.z),q=p-o,r=new THREE.Quaternion;r.setFromAxisAngle(f,q),this.setOrientation(a,r.multiply(this.dragStart.orientationWorld)),c.stopPropagation()}},ROS3D.InteractiveMarker.prototype.feedbackEvent=function(a,b){this.dispatchEvent({type:a,position:this.position.clone(),orientation:this.quaternion.clone(),controlName:b.name})},ROS3D.InteractiveMarker.prototype.startDrag=function(a,b){if(0===b.domEvent.button){b.stopPropagation(),this.dragging=!0,this.updateMatrixWorld(!0);var c=new THREE.Vector3;this.matrixWorld.decompose(this.dragStart.positionWorld,this.dragStart.orientationWorld,c),this.dragStart.position=this.position.clone(),this.dragStart.orientation=this.quaternion.clone(),this.dragStart.event3d=b,this.feedbackEvent("user-mousedown",a)}},ROS3D.InteractiveMarker.prototype.stopDrag=function(a,b){0===b.domEvent.button&&(b.stopPropagation(),this.dragging=!1,this.dragStart.event3d={},this.onServerSetPose(this.bufferedPoseEvent),this.bufferedPoseEvent=void 0,this.feedbackEvent("user-mouseup",a))},ROS3D.InteractiveMarker.prototype.buttonClick=function(a,b){b.stopPropagation(),this.feedbackEvent("user-button-click",a)},ROS3D.InteractiveMarker.prototype.setPosition=function(a,b){this.position=b,this.feedbackEvent("user-pose-change",a)},ROS3D.InteractiveMarker.prototype.setOrientation=function(a,b){b.normalize(),this.quaternion=b,this.feedbackEvent("user-pose-change",a)},ROS3D.InteractiveMarker.prototype.onServerSetPose=function(a){if(void 0!==a)if(this.dragging)this.bufferedPoseEvent=a;else{var b=a.pose;this.position.x=b.position.x,this.position.y=b.position.y,this.position.z=b.position.z,this.useQuaternion=!0,this.quaternion=new THREE.Quaternion(b.orientation.x,b.orientation.y,b.orientation.z,b.orientation.w),this.updateMatrixWorld(!0)}},ROS3D.InteractiveMarkerClient=function(a){a=a||{},this.ros=a.ros,this.tfClient=a.tfClient,this.topic=a.topic,this.path=a.path||"/",this.camera=a.camera,this.rootObject=a.rootObject||new THREE.Object3D,this.interactiveMarkers={},this.updateTopic=null,this.feedbackTopic=null,this.topic&&this.subscribe(this.topic)},ROS3D.InteractiveMarkerClient.prototype.subscribe=function(a){this.unsubscribe(),this.updateTopic=new ROSLIB.Topic({ros:this.ros,name:a+"/tunneled/update",messageType:"visualization_msgs/InteractiveMarkerUpdate",compression:"png"}),this.updateTopic.subscribe(this.processUpdate.bind(this)),this.feedbackTopic=new ROSLIB.Topic({ros:this.ros,name:a+"/feedback",messageType:"visualization_msgs/InteractiveMarkerFeedback",compression:"png"}),this.feedbackTopic.advertise(),this.initService=new ROSLIB.Service({ros:this.ros,name:a+"/tunneled/get_init",serviceType:"demo_interactive_markers/GetInit"});var b=new ROSLIB.ServiceRequest({});this.initService.callService(b,this.processInit.bind(this))},ROS3D.InteractiveMarkerClient.prototype.unsubscribe=function(){this.updateTopic&&this.updateTopic.unsubscribe(),this.feedbackTopic&&this.feedbackTopic.unadvertise();for(var a in this.interactiveMarkers)this.eraseIntMarker(a);this.interactiveMarkers={}},ROS3D.InteractiveMarkerClient.prototype.processInit=function(a){var b=a.msg;b.erases=[];for(var c in this.interactiveMarkers)b.erases.push(c);b.poses=[],this.processUpdate(b)},ROS3D.InteractiveMarkerClient.prototype.processUpdate=function(a){var b=this;a.erases.forEach(function(a){b.eraseIntMarker(a)}),a.poses.forEach(function(a){var c=b.interactiveMarkers[a.name];c&&c.setPoseFromServer(a.pose)}),a.markers.forEach(function(a){var c=b.interactiveMarkers[a.name];c&&b.eraseIntMarker(c.name);var d=new ROS3D.InteractiveMarkerHandle({message:a,feedbackTopic:b.feedbackTopic,tfClient:b.tfClient});b.interactiveMarkers[a.name]=d;var e=new ROS3D.InteractiveMarker({handle:d,camera:b.camera,path:b.path});e.name=a.name,b.rootObject.add(e),d.on("pose",function(a){e.onServerSetPose({pose:a})}),e.addEventListener("user-pose-change",d.setPoseFromClient.bind(d)),e.addEventListener("user-mousedown",d.onMouseDown.bind(d)),e.addEventListener("user-mouseup",d.onMouseUp.bind(d)),e.addEventListener("user-button-click",d.onButtonClick.bind(d)),e.addEventListener("menu-select",d.onMenuSelect.bind(d)),d.subscribeTf()})},ROS3D.InteractiveMarkerClient.prototype.eraseIntMarker=function(a){this.interactiveMarkers[a]&&(this.rootObject.remove(this.rootObject.getChildByName(a)),delete this.interactiveMarkers[a])},ROS3D.InteractiveMarkerControl=function(a){function b(a){a.stopPropagation()}var c=this;THREE.Object3D.call(this),THREE.EventDispatcher.call(this),a=a||{},this.parent=a.parent;var d=a.message;this.name=d.name,this.camera=a.camera,this.path=a.path||"/",this.dragging=!1;var e=new THREE.Quaternion(d.orientation.x,d.orientation.y,d.orientation.z,d.orientation.w);e.normalize();var f=new THREE.Vector3(1,0,0);switch(f.applyQuaternion(e),this.currentControlOri=new THREE.Quaternion,d.interaction_mode){case ROS3D.INTERACTIVE_MARKER_MOVE_AXIS:this.addEventListener("mousemove",this.parent.moveAxis.bind(this.parent,this,f)),this.addEventListener("touchmove",this.parent.moveAxis.bind(this.parent,this,f));break;case ROS3D.INTERACTIVE_MARKER_ROTATE_AXIS:this.addEventListener("mousemove",this.parent.rotateAxis.bind(this.parent,this,e));break;case ROS3D.INTERACTIVE_MARKER_MOVE_PLANE:this.addEventListener("mousemove",this.parent.movePlane.bind(this.parent,this,f));break;case ROS3D.INTERACTIVE_MARKER_BUTTON:this.addEventListener("click",this.parent.buttonClick.bind(this.parent,this))}d.interaction_mode!==ROS3D.INTERACTIVE_MARKER_NONE&&(this.addEventListener("mousedown",this.parent.startDrag.bind(this.parent,this)),this.addEventListener("mouseup",this.parent.stopDrag.bind(this.parent,this)),this.addEventListener("contextmenu",this.parent.showMenu.bind(this.parent,this)),this.addEventListener("mouseover",b),this.addEventListener("mouseout",b),this.addEventListener("click",b),this.addEventListener("touchstart",function(a){console.log(a.domEvent),1===a.domEvent.touches.length&&(a.type="mousedown",a.domEvent.button=0,c.dispatchEvent(a))}),this.addEventListener("touchmove",function(a){1===a.domEvent.touches.length&&(console.log(a.domEvent),a.type="mousemove",a.domEvent.button=0,c.dispatchEvent(a))}),this.addEventListener("touchend",function(a){0===a.domEvent.touches.length&&(a.domEvent.button=0,a.type="mouseup",c.dispatchEvent(a),a.type="click",c.dispatchEvent(a))}));var g=new THREE.Quaternion,h=this.parent.position.clone().multiplyScalar(-1);switch(d.orientation_mode){case ROS3D.INTERACTIVE_MARKER_INHERIT:g=this.parent.quaternion.clone().inverse(),this.updateMatrixWorld=function(a){ROS3D.InteractiveMarkerControl.prototype.updateMatrixWorld.call(c,a),c.currentControlOri.copy(c.quaternion),c.currentControlOri.normalize()};break;case ROS3D.INTERACTIVE_MARKER_FIXED:this.updateMatrixWorld=function(a){c.useQuaternion=!0,c.quaternion=c.parent.quaternion.clone().inverse(),c.updateMatrix(),c.matrixWorldNeedsUpdate=!0,ROS3D.InteractiveMarkerControl.prototype.updateMatrixWorld.call(c,a),c.currentControlOri.copy(c.quaternion)};break;case ROS3D.INTERACTIVE_MARKER_VIEW_FACING:var i=d.independentMarkerOrientation;this.updateMatrixWorld=function(a){c.camera.updateMatrixWorld();var b=(new THREE.Matrix4).extractRotation(c.camera.matrixWorld),d=new THREE.Matrix4,e=.5*Math.PI,f=new THREE.Vector3(-e,0,e);d.setRotationFromEuler(f);var g=new THREE.Matrix4;g.getInverse(c.parent.matrixWorld),b.multiplyMatrices(b,d),b.multiplyMatrices(g,b),c.currentControlOri.setFromRotationMatrix(b),i||(c.useQuaternion=!0,c.quaternion.copy(c.currentControlOri),c.updateMatrix(),c.matrixWorldNeedsUpdate=!0),ROS3D.InteractiveMarkerControl.prototype.updateMatrixWorld.call(c,a)};break;default:console.error("Unkown orientation mode: "+d.orientation_mode)}d.markers.forEach(function(a){var b=new ROS3D.Marker({message:a,path:c.path});""!==a.header.frame_id&&(b.position.add(h),b.position.applyQuaternion(g),b.quaternion.multiplyQuaternions(g,b.quaternion),b.updateMatrixWorld()),c.add(b)})},ROS3D.InteractiveMarkerControl.prototype.__proto__=THREE.Object3D.prototype,ROS3D.InteractiveMarkerHandle=function(a){a=a||{},this.message=a.message,this.feedbackTopic=a.feedbackTopic,this.tfClient=a.tfClient,this.name=this.message.name,this.header=this.message.header,this.controls=this.message.controls,this.menuEntries=this.message.menu_entries,this.dragging=!1,this.timeoutHandle=null,this.tfTransform=new ROSLIB.Transform,this.pose=new ROSLIB.Pose,this.setPoseFromServer(this.message.pose)},ROS3D.InteractiveMarkerHandle.prototype.__proto__=EventEmitter2.prototype,ROS3D.InteractiveMarkerHandle.prototype.subscribeTf=function(){0===this.message.header.stamp.secs&&0===this.message.header.stamp.nsecs&&this.tfClient.subscribe(this.message.header.frame_id,this.tfUpdate.bind(this))},ROS3D.InteractiveMarkerHandle.prototype.emitServerPoseUpdate=function(){var a=new ROSLIB.Pose(this.pose);a.applyTransform(this.tfTransform),this.emit("pose",a)},ROS3D.InteractiveMarkerHandle.prototype.setPoseFromServer=function(a){this.pose=new ROSLIB.Pose(a),this.emitServerPoseUpdate()},ROS3D.InteractiveMarkerHandle.prototype.tfUpdate=function(a){this.tfTransform=new ROSLIB.Transform(a),this.emitServerPoseUpdate()},ROS3D.InteractiveMarkerHandle.prototype.setPoseFromClient=function(a){this.pose=new ROSLIB.Pose(a);var b=this.tfTransform.clone();b.rotation.invert(),this.pose.applyTransform(b),this.sendFeedback(ROS3D.INTERACTIVE_MARKER_POSE_UPDATE,void 0,0,a.controlName),this.dragging&&(this.timeoutHandle&&clearTimeout(this.timeoutHandle),this.timeoutHandle=setTimeout(this.setPoseFromClient.bind(this,a),250))},ROS3D.InteractiveMarkerHandle.prototype.onButtonClick=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_BUTTON_CLICK,a.clickPosition,0,a.controlName)},ROS3D.InteractiveMarkerHandle.prototype.onMouseDown=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_MOUSE_DOWN,a.clickPosition,0,a.controlName),this.dragging=!0},ROS3D.InteractiveMarkerHandle.prototype.onMouseUp=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_MOUSE_UP,a.clickPosition,0,a.controlName),this.dragging=!1,this.timeoutHandle&&clearTimeout(this.timeoutHandle)},ROS3D.InteractiveMarkerHandle.prototype.onMenuSelect=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_MENU_SELECT,void 0,a.id,a.controlName)},ROS3D.InteractiveMarkerHandle.prototype.sendFeedback=function(a,b,c,d){var e=void 0!==b;b=b||{x:0,y:0,z:0};var f={header:this.header,client_id:this.clientID,marker_name:this.name,control_name:d,event_type:a,pose:this.pose,mouse_point:b,mouse_point_valid:e,menu_entry_id:c};this.feedbackTopic.publish(f)},ROS3D.InteractiveMarkerMenu=function(a){function b(a,b){this.dispatchEvent({type:"menu-select",domEvent:b,id:a.id,controlName:this.controlName}),this.hide(b)}function c(a,e){var f=document.createElement("ul");a.appendChild(f);for(var g=e.children,h=0;h0?(c(i,g[h]),j.addEventListener("click",d.hide.bind(d))):(j.addEventListener("click",b.bind(d,g[h])),j.className="default-interactive-marker-menu-entry")}}var d=this;a=a||{};var e=a.menuEntries,f=a.className||"default-interactive-marker-menu";a.entryClassName||"default-interactive-marker-menu-entry";var g=a.overlayClassName||"default-interactive-marker-overlay",h=[];if(h[0]={children:[]},THREE.EventDispatcher.call(this),null===document.getElementById("default-interactive-marker-menu-css")){var i=document.createElement("style");i.id="default-interactive-marker-menu-css",i.type="text/css",i.innerHTML=".default-interactive-marker-menu {background-color: #444444;border: 1px solid #888888;border: 1px solid #888888;padding: 0px 0px 0px 0px;color: #FFFFFF;font-family: sans-serif;font-size: 0.8em;z-index: 1002;}.default-interactive-marker-menu ul {padding: 0px 0px 5px 0px;margin: 0px;list-style-type: none;}.default-interactive-marker-menu ul li div {-webkit-touch-callout: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;cursor: default;padding: 3px 10px 3px 10px;}.default-interactive-marker-menu-entry:hover { background-color: #666666; cursor: pointer;}.default-interactive-marker-menu ul ul { font-style: italic; padding-left: 10px;}.default-interactive-marker-overlay { position: absolute; top: 0%; left: 0%; width: 100%; height: 100%; background-color: black; z-index: 1001; -moz-opacity: 0.0; opacity: .0; filter: alpha(opacity = 0);}",document.getElementsByTagName("head")[0].appendChild(i)}this.menuDomElem=document.createElement("div"),this.menuDomElem.style.position="absolute",this.menuDomElem.className=f,this.menuDomElem.addEventListener("contextmenu",function(a){a.preventDefault()}),this.overlayDomElem=document.createElement("div"),this.overlayDomElem.className=g,this.hideListener=this.hide.bind(this),this.overlayDomElem.addEventListener("contextmenu",this.hideListener),this.overlayDomElem.addEventListener("click",this.hideListener);var j,k,l;for(j=0;ji;i++)for(var j=0;c>j;j++){var k,l=j+(d-i-1)*c,m=b.data[l];k=100===m?0:0===m?255:127;var n=4*(j+i*c);h.data[n]=k,h.data[++n]=k,h.data[++n]=k,h.data[++n]=255}g.putImageData(h,0,0);var o=new THREE.Texture(f);o.needsUpdate=!0;var p=new THREE.MeshBasicMaterial({map:o});p.side=THREE.DoubleSide,THREE.Mesh.call(this,e,p),this.position.x=c*b.info.resolution/2,this.position.y=d*b.info.resolution/2,this.scale.x=b.info.resolution,this.scale.y=b.info.resolution},ROS3D.OccupancyGrid.prototype.__proto__=THREE.Mesh.prototype,ROS3D.OccupancyGridClient=function(a){var b=this;a=a||{};var c=a.ros,d=a.topic||"/map";this.continuous=a.continuous,this.tfClient=a.tfClient,this.rootObject=a.rootObject||new THREE.Object3D,this.currentGrid=null;var e=new ROSLIB.Topic({ros:c,name:d,messageType:"nav_msgs/OccupancyGrid",compression:"png"});e.subscribe(function(a){b.currentGrid&&b.rootObject.remove(b.currentGrid);var c=new ROS3D.OccupancyGrid({message:a});b.currentGrid=b.tfClient?new ROS3D.SceneNode({frameID:a.header.frame_id,tfClient:b.tfClient,object:c,pose:a.info.origin}):c,b.rootObject.add(b.currentGrid),b.emit("change"),b.continuous||e.unsubscribe()})},ROS3D.OccupancyGridClient.prototype.__proto__=EventEmitter2.prototype,ROS3D.Marker=function(a){a=a||{};var b=a.path||"/",c=a.message;"/"!==b.substr(b.length-1)&&(b+="/"),THREE.Object3D.call(this),this.useQuaternion=!0,this.setPose(c.pose);var d=ROS3D.makeColorMaterial(c.color.r,c.color.g,c.color.b,c.color.a);switch(c.type){case ROS3D.MARKER_ARROW:var e,f=c.scale.x,g=.23*f,h=c.scale.y,i=.5*h,j=null;if(2===c.points.length){j=new THREE.Vector3(c.points[0].x,c.points[0].y,c.points[0].z);var k=new THREE.Vector3(c.points[1].x,c.points[1].y,c.points[1].z);e=j.clone().negate().add(k),f=e.length(),h=c.scale.y,i=c.scale.x,0!==c.scale.z&&(g=c.scale.z)}this.add(new ROS3D.Arrow({direction:e,origin:j,length:f,headLength:g,shaftDiameter:i,headDiameter:h,material:d}));break;case ROS3D.MARKER_CUBE:var l=new THREE.CubeGeometry(c.scale.x,c.scale.y,c.scale.z);this.add(new THREE.Mesh(l,d));break;case ROS3D.MARKER_SPHERE:var m=new THREE.SphereGeometry(.5),n=new THREE.Mesh(m,d);n.scale.x=c.scale.x,n.scale.y=c.scale.y,n.scale.z=c.scale.z,this.add(n);break;case ROS3D.MARKER_CYLINDER:var o=new THREE.CylinderGeometry(.5,.5,1,16,1,!1),p=new THREE.Mesh(o,d);p.useQuaternion=!0,p.quaternion.setFromAxisAngle(new THREE.Vector3(1,0,0),.5*Math.PI),p.scale=new THREE.Vector3(c.scale.x,c.scale.y,c.scale.z),this.add(p);break;case ROS3D.MARKER_CUBE_LIST:var q,r,s,t,u=new THREE.Object3D,v=c.points.length,w=v===c.colors.length,x=Math.ceil(v/1250);for(q=0;v>q;q+=x)r=new THREE.CubeGeometry(c.scale.x,c.scale.y,c.scale.z),s=w?ROS3D.makeColorMaterial(c.colors[q].r,c.colors[q].g,c.colors[q].b,c.colors[q].a):d,t=new THREE.Mesh(r,s),t.position.x=c.points[q].x,t.position.y=c.points[q].y,t.position.z=c.points[q].z,u.add(t);this.add(u);break;case ROS3D.MARKER_SPHERE_LIST:case ROS3D.MARKER_POINTS:var y,z=new THREE.Geometry,A=new THREE.ParticleBasicMaterial({size:c.scale.x});for(y=0;y=d?new THREE.MeshBasicMaterial({color:e.getHex(),opacity:d+.1,transparent:!0,depthWrite:!0,blendSrc:THREE.SrcAlphaFactor,blendDst:THREE.OneMinusSrcAlphaFactor,blendEquation:THREE.ReverseSubtractEquation,blending:THREE.NormalBlending}):new THREE.MeshLambertMaterial({color:e.getHex(),opacity:d,blending:THREE.NormalBlending})},ROS3D.intersectPlane=function(a,b,c){var d=new THREE.Vector3,e=new THREE.Vector3;d.subVectors(b,a.origin);var f=a.direction.dot(c);if(Math.abs(f)0.99)"," {"," vec4 depthColor2 = texture2D( map, vUv2 );"," float depth2 = ( depthColor2.r + depthColor2.g + depthColor2.b ) / 3.0 ;"," depth = 0.99+depth2;"," }"," "," return depth;"," }","","float median(float a, float b, float c)"," {"," float r=a;"," "," if ( (a0.5) || (vUvP.y<0.5) || (vUvP.y>0.0))"," {"," vec2 smp = decodeDepth(vec2(position.x, position.y));"," float depth = smp.x;"," depthVariance = smp.y;"," "," float z = -depth;"," "," pos = vec4("," ( position.x / width - 0.5 ) * z * (1000.0/focallength) * -1.0,"," ( position.y / height - 0.5 ) * z * (1000.0/focallength),"," (- z + zOffset / 1000.0) * 2.0,"," 1.0);"," "," vec2 maskP = vec2( position.x / (width*2.0), position.y / (height*2.0) );"," vec4 maskColor = texture2D( map, maskP );"," maskVal = ( maskColor.r + maskColor.g + maskColor.b ) / 3.0 ;"," }"," "," gl_PointSize = pointSize;"," gl_Position = projectionMatrix * modelViewMatrix * pos;"," ","}"].join("\n"),this.fragment_shader=["uniform sampler2D map;","uniform float varianceThreshold;","uniform float whiteness;","","varying vec2 vUvP;","varying vec2 colorP;","","varying float depthVariance;","varying float maskVal;","","","void main() {"," "," vec4 color;"," "," if ( (depthVariance>varianceThreshold) || (maskVal>0.5) ||(vUvP.x<0.0)|| (vUvP.x>0.5) || (vUvP.y<0.5) || (vUvP.y>1.0))"," { "," discard;"," }"," else "," {"," color = texture2D( map, colorP );"," "," float fader = whiteness /100.0;"," "," color.r = color.r * (1.0-fader)+ fader;"," "," color.g = color.g * (1.0-fader)+ fader;"," "," color.b = color.b * (1.0-fader)+ fader;"," "," color.a = 1.0;//smoothstep( 20000.0, -20000.0, gl_FragCoord.z / gl_FragCoord.w );"," }"," "," gl_FragColor = vec4( color.r, color.g, color.b, color.a );"," ","}"].join("\n")},ROS3D.DepthCloud.prototype.__proto__=THREE.Object3D.prototype,ROS3D.DepthCloud.prototype.metaLoaded=function(){this.metaLoaded=!0,this.initStreamer()},ROS3D.DepthCloud.prototype.initStreamer=function(){if(this.metaLoaded){this.texture=new THREE.Texture(this.video),this.geometry=new THREE.Geometry;for(var a=0,b=this.width*this.height;b>a;a++){var c=new THREE.Vector3;c.x=a%this.width,c.y=Math.floor(a/this.width),this.geometry.vertices.push(c)}this.material=new THREE.ShaderMaterial({uniforms:{map:{type:"t",value:this.texture},width:{type:"f",value:this.width},height:{type:"f",value:this.height},focallength:{type:"f",value:this.f},pointSize:{type:"f",value:this.pointSize},zOffset:{type:"f",value:0},whiteness:{type:"f",value:this.whiteness},varianceThreshold:{type:"f",value:this.varianceThreshold}},vertexShader:this.vertex_shader,fragmentShader:this.fragment_shader}),this.mesh=new THREE.ParticleSystem(this.geometry,this.material),this.mesh.position.x=0,this.mesh.position.y=0,this.add(this.mesh);var d=this;setInterval(function(){d.video.readyState===d.video.HAVE_ENOUGH_DATA&&(d.texture.needsUpdate=!0)},1e3/30)}},ROS3D.DepthCloud.prototype.startStream=function(){this.video.play()},ROS3D.DepthCloud.prototype.stopStream=function(){this.video.stop()},ROS3D.InteractiveMarker=function(a){THREE.Object3D.call(this),THREE.EventDispatcher.call(this);var b=this;a=a||{};var c=a.handle;this.name=c.name;var d=a.camera,e=a.path||"/";this.dragging=!1,this.onServerSetPose({pose:c.pose}),this.dragStart={position:new THREE.Vector3,orientation:new THREE.Quaternion,positionWorld:new THREE.Vector3,orientationWorld:new THREE.Quaternion,event3d:{}},c.controls.forEach(function(a){b.add(new ROS3D.InteractiveMarkerControl({parent:b,message:a,camera:d,path:e}))}),c.menuEntries.length>0&&(this.menu=new ROS3D.InteractiveMarkerMenu({menuEntries:c.menuEntries}),this.menu.addEventListener("menu-select",function(a){b.dispatchEvent(a)}))},ROS3D.InteractiveMarker.prototype.__proto__=THREE.Object3D.prototype,ROS3D.InteractiveMarker.prototype.showMenu=function(a,b){this.menu&&this.menu.show(a,b)},ROS3D.InteractiveMarker.prototype.moveAxis=function(a,b,c){if(this.dragging){var d=a.currentControlOri,e=b.clone().applyQuaternion(d),f=this.dragStart.event3d.intersection.point,g=e.clone().applyQuaternion(this.dragStart.orientationWorld.clone()),h=new THREE.Ray(f,g),i=ROS3D.closestAxisPoint(h,c.camera,c.mousePos),j=new THREE.Vector3;j.addVectors(this.dragStart.position,e.clone().applyQuaternion(this.dragStart.orientation).multiplyScalar(i)),this.setPosition(a,j),c.stopPropagation()}},ROS3D.InteractiveMarker.prototype.movePlane=function(a,b,c){if(this.dragging){var d=a.currentControlOri,e=b.clone().applyQuaternion(d),f=this.dragStart.event3d.intersection.point,g=e.clone().applyQuaternion(this.dragStart.orientationWorld),h=ROS3D.intersectPlane(c.mouseRay,f,g),i=new THREE.Vector3;i.subVectors(h,f),i.add(this.dragStart.positionWorld),this.setPosition(a,i),c.stopPropagation()}},ROS3D.InteractiveMarker.prototype.rotateAxis=function(a,b,c){if(this.dragging){a.updateMatrixWorld();var d=a.currentControlOri,e=d.clone().multiply(b.clone()),f=new THREE.Vector3(1,0,0).applyQuaternion(e),g=this.dragStart.event3d.intersection.point,h=f.applyQuaternion(this.dragStart.orientationWorld),i=ROS3D.intersectPlane(c.mouseRay,g,h),j=new THREE.Ray(this.dragStart.positionWorld,h),k=ROS3D.intersectPlane(j,g,h),l=this.dragStart.orientationWorld.clone().multiply(e),m=l.clone().inverse();i.sub(k),i.applyQuaternion(m);var n=this.dragStart.event3d.intersection.point.clone();n.sub(k),n.applyQuaternion(m);var o=Math.atan2(i.y,i.z),p=Math.atan2(n.y,n.z),q=p-o,r=new THREE.Quaternion;r.setFromAxisAngle(f,q),this.setOrientation(a,r.multiply(this.dragStart.orientationWorld)),c.stopPropagation()}},ROS3D.InteractiveMarker.prototype.feedbackEvent=function(a,b){this.dispatchEvent({type:a,position:this.position.clone(),orientation:this.quaternion.clone(),controlName:b.name})},ROS3D.InteractiveMarker.prototype.startDrag=function(a,b){if(0===b.domEvent.button){b.stopPropagation(),this.dragging=!0,this.updateMatrixWorld(!0);var c=new THREE.Vector3;this.matrixWorld.decompose(this.dragStart.positionWorld,this.dragStart.orientationWorld,c),this.dragStart.position=this.position.clone(),this.dragStart.orientation=this.quaternion.clone(),this.dragStart.event3d=b,this.feedbackEvent("user-mousedown",a)}},ROS3D.InteractiveMarker.prototype.stopDrag=function(a,b){0===b.domEvent.button&&(b.stopPropagation(),this.dragging=!1,this.dragStart.event3d={},this.onServerSetPose(this.bufferedPoseEvent),this.bufferedPoseEvent=void 0,this.feedbackEvent("user-mouseup",a))},ROS3D.InteractiveMarker.prototype.buttonClick=function(a,b){b.stopPropagation(),this.feedbackEvent("user-button-click",a)},ROS3D.InteractiveMarker.prototype.setPosition=function(a,b){this.position=b,this.feedbackEvent("user-pose-change",a)},ROS3D.InteractiveMarker.prototype.setOrientation=function(a,b){b.normalize(),this.quaternion=b,this.feedbackEvent("user-pose-change",a)},ROS3D.InteractiveMarker.prototype.onServerSetPose=function(a){if(void 0!==a)if(this.dragging)this.bufferedPoseEvent=a;else{var b=a.pose;this.position.x=b.position.x,this.position.y=b.position.y,this.position.z=b.position.z,this.useQuaternion=!0,this.quaternion=new THREE.Quaternion(b.orientation.x,b.orientation.y,b.orientation.z,b.orientation.w),this.updateMatrixWorld(!0)}},ROS3D.InteractiveMarkerClient=function(a){a=a||{},this.ros=a.ros,this.tfClient=a.tfClient,this.topic=a.topic,this.path=a.path||"/",this.camera=a.camera,this.rootObject=a.rootObject||new THREE.Object3D,this.interactiveMarkers={},this.updateTopic=null,this.feedbackTopic=null,this.topic&&this.subscribe(this.topic)},ROS3D.InteractiveMarkerClient.prototype.subscribe=function(a){this.unsubscribe(),this.updateTopic=new ROSLIB.Topic({ros:this.ros,name:a+"/tunneled/update",messageType:"visualization_msgs/InteractiveMarkerUpdate",compression:"png"}),this.updateTopic.subscribe(this.processUpdate.bind(this)),this.feedbackTopic=new ROSLIB.Topic({ros:this.ros,name:a+"/feedback",messageType:"visualization_msgs/InteractiveMarkerFeedback",compression:"png"}),this.feedbackTopic.advertise(),this.initService=new ROSLIB.Service({ros:this.ros,name:a+"/tunneled/get_init",serviceType:"demo_interactive_markers/GetInit"});var b=new ROSLIB.ServiceRequest({});this.initService.callService(b,this.processInit.bind(this))},ROS3D.InteractiveMarkerClient.prototype.unsubscribe=function(){this.updateTopic&&this.updateTopic.unsubscribe(),this.feedbackTopic&&this.feedbackTopic.unadvertise();for(var a in this.interactiveMarkers)this.eraseIntMarker(a);this.interactiveMarkers={}},ROS3D.InteractiveMarkerClient.prototype.processInit=function(a){var b=a.msg;b.erases=[];for(var c in this.interactiveMarkers)b.erases.push(c);b.poses=[],this.processUpdate(b)},ROS3D.InteractiveMarkerClient.prototype.processUpdate=function(a){var b=this;a.erases.forEach(function(a){b.eraseIntMarker(a)}),a.poses.forEach(function(a){var c=b.interactiveMarkers[a.name];c&&c.setPoseFromServer(a.pose)}),a.markers.forEach(function(a){var c=b.interactiveMarkers[a.name];c&&b.eraseIntMarker(c.name);var d=new ROS3D.InteractiveMarkerHandle({message:a,feedbackTopic:b.feedbackTopic,tfClient:b.tfClient});b.interactiveMarkers[a.name]=d;var e=new ROS3D.InteractiveMarker({handle:d,camera:b.camera,path:b.path});e.name=a.name,b.rootObject.add(e),d.on("pose",function(a){e.onServerSetPose({pose:a})}),e.addEventListener("user-pose-change",d.setPoseFromClient.bind(d)),e.addEventListener("user-mousedown",d.onMouseDown.bind(d)),e.addEventListener("user-mouseup",d.onMouseUp.bind(d)),e.addEventListener("user-button-click",d.onButtonClick.bind(d)),e.addEventListener("menu-select",d.onMenuSelect.bind(d)),d.subscribeTf()})},ROS3D.InteractiveMarkerClient.prototype.eraseIntMarker=function(a){this.interactiveMarkers[a]&&(this.rootObject.remove(this.rootObject.getChildByName(a)),delete this.interactiveMarkers[a])},ROS3D.InteractiveMarkerControl=function(a){function b(a){a.stopPropagation()}var c=this;THREE.Object3D.call(this),THREE.EventDispatcher.call(this),a=a||{},this.parent=a.parent;var d=a.message;this.name=d.name,this.camera=a.camera,this.path=a.path||"/",this.dragging=!1;var e=new THREE.Quaternion(d.orientation.x,d.orientation.y,d.orientation.z,d.orientation.w);e.normalize();var f=new THREE.Vector3(1,0,0);switch(f.applyQuaternion(e),this.currentControlOri=new THREE.Quaternion,d.interaction_mode){case ROS3D.INTERACTIVE_MARKER_MOVE_AXIS:this.addEventListener("mousemove",this.parent.moveAxis.bind(this.parent,this,f)),this.addEventListener("touchmove",this.parent.moveAxis.bind(this.parent,this,f));break;case ROS3D.INTERACTIVE_MARKER_ROTATE_AXIS:this.addEventListener("mousemove",this.parent.rotateAxis.bind(this.parent,this,e));break;case ROS3D.INTERACTIVE_MARKER_MOVE_PLANE:this.addEventListener("mousemove",this.parent.movePlane.bind(this.parent,this,f));break;case ROS3D.INTERACTIVE_MARKER_BUTTON:this.addEventListener("click",this.parent.buttonClick.bind(this.parent,this))}d.interaction_mode!==ROS3D.INTERACTIVE_MARKER_NONE&&(this.addEventListener("mousedown",this.parent.startDrag.bind(this.parent,this)),this.addEventListener("mouseup",this.parent.stopDrag.bind(this.parent,this)),this.addEventListener("contextmenu",this.parent.showMenu.bind(this.parent,this)),this.addEventListener("mouseover",b),this.addEventListener("mouseout",b),this.addEventListener("click",b),this.addEventListener("touchstart",function(a){console.log(a.domEvent),1===a.domEvent.touches.length&&(a.type="mousedown",a.domEvent.button=0,c.dispatchEvent(a))}),this.addEventListener("touchmove",function(a){1===a.domEvent.touches.length&&(console.log(a.domEvent),a.type="mousemove",a.domEvent.button=0,c.dispatchEvent(a))}),this.addEventListener("touchend",function(a){0===a.domEvent.touches.length&&(a.domEvent.button=0,a.type="mouseup",c.dispatchEvent(a),a.type="click",c.dispatchEvent(a))}));var g=new THREE.Quaternion,h=this.parent.position.clone().multiplyScalar(-1);switch(d.orientation_mode){case ROS3D.INTERACTIVE_MARKER_INHERIT:g=this.parent.quaternion.clone().inverse(),this.updateMatrixWorld=function(a){ROS3D.InteractiveMarkerControl.prototype.updateMatrixWorld.call(c,a),c.currentControlOri.copy(c.quaternion),c.currentControlOri.normalize()};break;case ROS3D.INTERACTIVE_MARKER_FIXED:this.updateMatrixWorld=function(a){c.useQuaternion=!0,c.quaternion=c.parent.quaternion.clone().inverse(),c.updateMatrix(),c.matrixWorldNeedsUpdate=!0,ROS3D.InteractiveMarkerControl.prototype.updateMatrixWorld.call(c,a),c.currentControlOri.copy(c.quaternion)};break;case ROS3D.INTERACTIVE_MARKER_VIEW_FACING:var i=d.independentMarkerOrientation;this.updateMatrixWorld=function(a){c.camera.updateMatrixWorld();var b=(new THREE.Matrix4).extractRotation(c.camera.matrixWorld),d=new THREE.Matrix4,e=.5*Math.PI,f=new THREE.Vector3(-e,0,e);d.setRotationFromEuler(f);var g=new THREE.Matrix4;g.getInverse(c.parent.matrixWorld),b.multiplyMatrices(b,d),b.multiplyMatrices(g,b),c.currentControlOri.setFromRotationMatrix(b),i||(c.useQuaternion=!0,c.quaternion.copy(c.currentControlOri),c.updateMatrix(),c.matrixWorldNeedsUpdate=!0),ROS3D.InteractiveMarkerControl.prototype.updateMatrixWorld.call(c,a)};break;default:console.error("Unkown orientation mode: "+d.orientation_mode)}d.markers.forEach(function(a){var b=new ROS3D.Marker({message:a,path:c.path});""!==a.header.frame_id&&(b.position.add(h),b.position.applyQuaternion(g),b.quaternion.multiplyQuaternions(g,b.quaternion),b.updateMatrixWorld()),c.add(b)})},ROS3D.InteractiveMarkerControl.prototype.__proto__=THREE.Object3D.prototype,ROS3D.InteractiveMarkerHandle=function(a){a=a||{},this.message=a.message,this.feedbackTopic=a.feedbackTopic,this.tfClient=a.tfClient,this.name=this.message.name,this.header=this.message.header,this.controls=this.message.controls,this.menuEntries=this.message.menu_entries,this.dragging=!1,this.timeoutHandle=null,this.tfTransform=new ROSLIB.Transform,this.pose=new ROSLIB.Pose,this.setPoseFromServer(this.message.pose)},ROS3D.InteractiveMarkerHandle.prototype.__proto__=EventEmitter2.prototype,ROS3D.InteractiveMarkerHandle.prototype.subscribeTf=function(){0===this.message.header.stamp.secs&&0===this.message.header.stamp.nsecs&&this.tfClient.subscribe(this.message.header.frame_id,this.tfUpdate.bind(this))},ROS3D.InteractiveMarkerHandle.prototype.emitServerPoseUpdate=function(){var a=new ROSLIB.Pose(this.pose);a.applyTransform(this.tfTransform),this.emit("pose",a)},ROS3D.InteractiveMarkerHandle.prototype.setPoseFromServer=function(a){this.pose=new ROSLIB.Pose(a),this.emitServerPoseUpdate()},ROS3D.InteractiveMarkerHandle.prototype.tfUpdate=function(a){this.tfTransform=new ROSLIB.Transform(a),this.emitServerPoseUpdate()},ROS3D.InteractiveMarkerHandle.prototype.setPoseFromClient=function(a){this.pose=new ROSLIB.Pose(a);var b=this.tfTransform.clone();b.rotation.invert(),this.pose.applyTransform(b),this.sendFeedback(ROS3D.INTERACTIVE_MARKER_POSE_UPDATE,void 0,0,a.controlName),this.dragging&&(this.timeoutHandle&&clearTimeout(this.timeoutHandle),this.timeoutHandle=setTimeout(this.setPoseFromClient.bind(this,a),250))},ROS3D.InteractiveMarkerHandle.prototype.onButtonClick=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_BUTTON_CLICK,a.clickPosition,0,a.controlName)},ROS3D.InteractiveMarkerHandle.prototype.onMouseDown=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_MOUSE_DOWN,a.clickPosition,0,a.controlName),this.dragging=!0},ROS3D.InteractiveMarkerHandle.prototype.onMouseUp=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_MOUSE_UP,a.clickPosition,0,a.controlName),this.dragging=!1,this.timeoutHandle&&clearTimeout(this.timeoutHandle)},ROS3D.InteractiveMarkerHandle.prototype.onMenuSelect=function(a){this.sendFeedback(ROS3D.INTERACTIVE_MARKER_MENU_SELECT,void 0,a.id,a.controlName)},ROS3D.InteractiveMarkerHandle.prototype.sendFeedback=function(a,b,c,d){var e=void 0!==b;b=b||{x:0,y:0,z:0};var f={header:this.header,client_id:this.clientID,marker_name:this.name,control_name:d,event_type:a,pose:this.pose,mouse_point:b,mouse_point_valid:e,menu_entry_id:c};this.feedbackTopic.publish(f)},ROS3D.InteractiveMarkerMenu=function(a){function b(a,b){this.dispatchEvent({type:"menu-select",domEvent:b,id:a.id,controlName:this.controlName}),this.hide(b)}function c(a,e){var f=document.createElement("ul");a.appendChild(f);for(var g=e.children,h=0;h0?(c(i,g[h]),j.addEventListener("click",d.hide.bind(d))):(j.addEventListener("click",b.bind(d,g[h])),j.className="default-interactive-marker-menu-entry")}}var d=this;a=a||{};var e=a.menuEntries,f=a.className||"default-interactive-marker-menu";a.entryClassName||"default-interactive-marker-menu-entry";var g=a.overlayClassName||"default-interactive-marker-overlay",h=[];if(h[0]={children:[]},THREE.EventDispatcher.call(this),null===document.getElementById("default-interactive-marker-menu-css")){var i=document.createElement("style");i.id="default-interactive-marker-menu-css",i.type="text/css",i.innerHTML=".default-interactive-marker-menu {background-color: #444444;border: 1px solid #888888;border: 1px solid #888888;padding: 0px 0px 0px 0px;color: #FFFFFF;font-family: sans-serif;font-size: 0.8em;z-index: 1002;}.default-interactive-marker-menu ul {padding: 0px 0px 5px 0px;margin: 0px;list-style-type: none;}.default-interactive-marker-menu ul li div {-webkit-touch-callout: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;cursor: default;padding: 3px 10px 3px 10px;}.default-interactive-marker-menu-entry:hover { background-color: #666666; cursor: pointer;}.default-interactive-marker-menu ul ul { font-style: italic; padding-left: 10px;}.default-interactive-marker-overlay { position: absolute; top: 0%; left: 0%; width: 100%; height: 100%; background-color: black; z-index: 1001; -moz-opacity: 0.0; opacity: .0; filter: alpha(opacity = 0);}",document.getElementsByTagName("head")[0].appendChild(i)}this.menuDomElem=document.createElement("div"),this.menuDomElem.style.position="absolute",this.menuDomElem.className=f,this.menuDomElem.addEventListener("contextmenu",function(a){a.preventDefault()}),this.overlayDomElem=document.createElement("div"),this.overlayDomElem.className=g,this.hideListener=this.hide.bind(this),this.overlayDomElem.addEventListener("contextmenu",this.hideListener),this.overlayDomElem.addEventListener("click",this.hideListener);var j,k,l;for(j=0;ji;i++)for(var j=0;c>j;j++){var k,l=j+(d-i-1)*c,m=b.data[l];k=100===m?0:0===m?255:127;var n=4*(j+i*c);h.data[n]=k,h.data[++n]=k,h.data[++n]=k,h.data[++n]=255}g.putImageData(h,0,0);var o=new THREE.Texture(f);o.needsUpdate=!0;var p=new THREE.MeshBasicMaterial({map:o});p.side=THREE.DoubleSide,THREE.Mesh.call(this,e,p),this.position.x=c*b.info.resolution/2,this.position.y=d*b.info.resolution/2,this.scale.x=b.info.resolution,this.scale.y=b.info.resolution},ROS3D.OccupancyGrid.prototype.__proto__=THREE.Mesh.prototype,ROS3D.OccupancyGridClient=function(a){var b=this;a=a||{};var c=a.ros,d=a.topic||"/map";this.continuous=a.continuous,this.tfClient=a.tfClient,this.rootObject=a.rootObject||new THREE.Object3D,this.currentGrid=null;var e=new ROSLIB.Topic({ros:c,name:d,messageType:"nav_msgs/OccupancyGrid",compression:"png"});e.subscribe(function(a){b.currentGrid&&b.rootObject.remove(b.currentGrid);var c=new ROS3D.OccupancyGrid({message:a});b.currentGrid=b.tfClient?new ROS3D.SceneNode({frameID:a.header.frame_id,tfClient:b.tfClient,object:c,pose:a.info.origin}):c,b.rootObject.add(b.currentGrid),b.emit("change"),b.continuous||e.unsubscribe()})},ROS3D.OccupancyGridClient.prototype.__proto__=EventEmitter2.prototype,ROS3D.Marker=function(a){a=a||{};var b=a.path||"/",c=a.message;"/"!==b.substr(b.length-1)&&(b+="/"),THREE.Object3D.call(this),this.useQuaternion=!0,this.setPose(c.pose);var d=ROS3D.makeColorMaterial(c.color.r,c.color.g,c.color.b,c.color.a);switch(c.type){case ROS3D.MARKER_ARROW:var e,f=c.scale.x,g=.23*f,h=c.scale.y,i=.5*h,j=null;if(2===c.points.length){j=new THREE.Vector3(c.points[0].x,c.points[0].y,c.points[0].z);var k=new THREE.Vector3(c.points[1].x,c.points[1].y,c.points[1].z);e=j.clone().negate().add(k),f=e.length(),h=c.scale.y,i=c.scale.x,0!==c.scale.z&&(g=c.scale.z)}this.add(new ROS3D.Arrow({direction:e,origin:j,length:f,headLength:g,shaftDiameter:i,headDiameter:h,material:d}));break;case ROS3D.MARKER_CUBE:var l=new THREE.CubeGeometry(c.scale.x,c.scale.y,c.scale.z);this.add(new THREE.Mesh(l,d));break;case ROS3D.MARKER_SPHERE:var m=new THREE.SphereGeometry(.5),n=new THREE.Mesh(m,d);n.scale.x=c.scale.x,n.scale.y=c.scale.y,n.scale.z=c.scale.z,this.add(n);break;case ROS3D.MARKER_CYLINDER:var o=new THREE.CylinderGeometry(.5,.5,1,16,1,!1),p=new THREE.Mesh(o,d);p.useQuaternion=!0,p.quaternion.setFromAxisAngle(new THREE.Vector3(1,0,0),.5*Math.PI),p.scale=new THREE.Vector3(c.scale.x,c.scale.y,c.scale.z),this.add(p);break;case ROS3D.MARKER_CUBE_LIST:var q,r,s,t,u=new THREE.Object3D,v=c.points.length,w=v===c.colors.length,x=Math.ceil(v/1250);for(q=0;v>q;q+=x)r=new THREE.CubeGeometry(c.scale.x,c.scale.y,c.scale.z),s=w?ROS3D.makeColorMaterial(c.colors[q].r,c.colors[q].g,c.colors[q].b,c.colors[q].a):d,t=new THREE.Mesh(r,s),t.position.x=c.points[q].x,t.position.y=c.points[q].y,t.position.z=c.points[q].z,u.add(t);this.add(u);break;case ROS3D.MARKER_SPHERE_LIST:case ROS3D.MARKER_POINTS:var y,z=new THREE.Geometry,A=new THREE.ParticleBasicMaterial({size:c.scale.x});for(y=0;yg;f++){var i=new THREE.Color;i.setRGB(d[f].r,d[f].g,d[f].b),h.vertexColors.push(i)}e.faces.push(k)}b.vertexColors=THREE.VertexColors}else if(d.length===c.length/3){for(f=0;f=0;f--)if(d[f].object===b[e]){c.push(d[f]);break}this.getWebglObjects(a,b[e].children,c)}},ROS3D.Highlighter.prototype.renderHighlight=function(a,b,c){var d=[];this.getWebglObjects(b,this.hoverObjs,d),b.overrideMaterial=new THREE.MeshBasicMaterial({fog:!1,opacity:.5,depthTest:!0,depthWrite:!1,polygonOffset:!0,polygonOffsetUnits:-1,side:THREE.DoubleSide});var e=b.__webglObjects;b.__webglObjects=d,a.render(b,c),b.__webglObjects=e,b.overrideMaterial=null},ROS3D.MouseHandler=function(a){THREE.EventDispatcher.call(this),this.renderer=a.renderer,this.camera=a.camera,this.rootObject=a.rootObject,this.fallbackTarget=a.fallbackTarget,this.lastTarget=this.fallbackTarget,this.dragging=!1,this.projector=new THREE.Projector;var b=["contextmenu","click","dblclick","mouseout","mousedown","mouseup","mousemove","mousewheel","DOMMouseScroll","touchstart","touchend","touchcancel","touchleave","touchmove"];this.listeners={},b.forEach(function(a){this.listeners[a]=this.processDomEvent.bind(this),this.renderer.domElement.addEventListener(a,this.listeners[a],!1)},this)},ROS3D.MouseHandler.prototype.processDomEvent=function(a){a.preventDefault();var b=a.target,c=b.getBoundingClientRect(),d=a.clientX-c.left-b.clientLeft+b.scrollLeft,e=a.clientY-c.top-b.clientTop+b.scrollTop,f=2*(d/b.clientWidth)-1,g=2*(-e/b.clientHeight)+1,h=new THREE.Vector3(f,g,.5);this.projector.unprojectVector(h,this.camera);var i=new THREE.Raycaster(this.camera.position.clone(),h.sub(this.camera.position).normalize()),j=i.ray,k={mousePos:new THREE.Vector2(f,g),mouseRay:j,domEvent:a,camera:this.camera,intersection:this.lastIntersection};if("mouseout"===a.type)return this.dragging&&(this.notify(this.lastTarget,"mouseup",k),this.dragging=!1),this.notify(this.lastTarget,"mouseout",k),this.lastTarget=null,void 0;if(this.dragging)return this.notify(this.lastTarget,a.type,k),("mouseup"===a.type&&2===a.button||"click"===a.type)&&(this.dragging=!1),void 0;b=this.lastTarget;var l=[];if(l=i.intersectObject(this.rootObject,!0),l.length>0?(b=l[0].object,k.intersection=this.lastIntersection=l[0]):b=this.fallbackTarget,b!==this.lastTarget){var m=this.notify(b,"mouseover",k);m?this.notify(this.lastTarget,"mouseout",k):(b=this.fallbackTarget,b!==this.lastTarget&&(this.notify(b,"mouseover",k),this.notify(this.lastTarget,"mouseout",k)))}this.notify(b,a.type,k),"mousedown"===a.type&&(this.dragging=!0),this.lastTarget=b},ROS3D.MouseHandler.prototype.notify=function(a,b,c){for(c.type=b,c.cancelBubble=!1,c.stopPropagation=function(){c.cancelBubble=!0},c.currentTarget=a;c.currentTarget;){if(c.currentTarget.dispatchEvent&&c.currentTarget.dispatchEvent instanceof Function&&(c.currentTarget.dispatchEvent(c),c.cancelBubble))return this.dispatchEvent(c),!0;c.currentTarget=c.currentTarget.parent}return!1},ROS3D.OrbitControls=function(a){function b(a){var b=a.domEvent;switch(b.preventDefault(),b.button){case 0:w=v.ROTATE,l.set(b.clientX,b.clientY);break;case 1:w=v.MOVE,s=new THREE.Vector3(0,0,1);var c=(new THREE.Matrix4).extractRotation(this.camera.matrix);s.applyMatrix4(c),r=i.center.clone(),t=i.camera.position.clone(),u=d(a.mouseRay,r,s);break;case 2:w=v.ZOOM,o.set(b.clientX,b.clientY)}this.showAxes()}function c(a){var b=a.domEvent;if(w===v.ROTATE)m.set(b.clientX,b.clientY),n.subVectors(m,l),i.rotateLeft(2*Math.PI*n.x/k*i.userRotateSpeed),i.rotateUp(2*Math.PI*n.y/k*i.userRotateSpeed),l.copy(m),this.showAxes();else if(w===v.ZOOM)p.set(b.clientX,b.clientY),q.subVectors(p,o),q.y>0?i.zoomIn():i.zoomOut(),o.copy(p),this.showAxes();else if(w===v.MOVE){var c=d(a.mouseRay,i.center,s);if(!c)return;var e=(new THREE.Vector3).subVectors(u.clone(),c.clone());i.center.addVectors(r.clone(),e.clone()),i.camera.position.addVectors(t.clone(),e.clone()),i.update(),i.camera.updateMatrixWorld(),this.showAxes()}}function d(a,b,c){var d=new THREE.Vector3,e=new THREE.Vector3;d.subVectors(b,a.origin);var f=a.direction.dot(c);if(Math.abs(f)0?i.zoomOut():i.zoomIn(),this.showAxes()}}function g(a){b(a),a.preventDefault()}function h(a){c(a),a.preventDefault()}THREE.EventDispatcher.call(this);var i=this;a=a||{};var j=a.scene;this.camera=a.camera,this.center=new THREE.Vector3,this.userZoom=!0,this.userZoomSpeed=a.userZoomSpeed||1,this.userRotate=!0,this.userRotateSpeed=a.userRotateSpeed||1,this.autoRotate=a.autoRotate,this.autoRotateSpeed=a.autoRotateSpeed||2,this.camera.up=new THREE.Vector3(0,0,1);var k=1800,l=new THREE.Vector2,m=new THREE.Vector2,n=new THREE.Vector2,o=new THREE.Vector2,p=new THREE.Vector2,q=new THREE.Vector2,r=new THREE.Vector3,s=new THREE.Vector3,t=new THREE.Vector3,u=new THREE.Vector3;this.phiDelta=0,this.thetaDelta=0,this.scale=1,this.lastPosition=new THREE.Vector3;var v={NONE:-1,ROTATE:0,ZOOM:1,MOVE:2},w=v.NONE;this.axes=new ROS3D.Axes({shaftRadius:.025,headRadius:.07,headLength:.2}),j.add(this.axes),this.axes.traverse(function(a){a.visible=!1}),this.addEventListener("mousedown",b),this.addEventListener("mouseup",e),this.addEventListener("mousemove",c),this.addEventListener("touchstart",g),this.addEventListener("touchmove",h),this.addEventListener("mousewheel",f),this.addEventListener("DOMMouseScroll",f)},ROS3D.OrbitControls.prototype.showAxes=function(){var a=this;this.axes.traverse(function(a){a.visible=!0}),this.hideTimeout&&clearTimeout(this.hideTimeout),this.hideTimeout=setTimeout(function(){a.axes.traverse(function(a){a.visible=!1}),a.hideTimeout=!1},1e3)},ROS3D.OrbitControls.prototype.rotateLeft=function(a){void 0===a&&(a=2*Math.PI/60/60*this.autoRotateSpeed),this.thetaDelta-=a},ROS3D.OrbitControls.prototype.rotateRight=function(a){void 0===a&&(a=2*Math.PI/60/60*this.autoRotateSpeed),this.thetaDelta+=a},ROS3D.OrbitControls.prototype.rotateUp=function(a){void 0===a&&(a=2*Math.PI/60/60*this.autoRotateSpeed),this.phiDelta-=a},ROS3D.OrbitControls.prototype.rotateDown=function(a){void 0===a&&(a=2*Math.PI/60/60*this.autoRotateSpeed),this.phiDelta+=a},ROS3D.OrbitControls.prototype.zoomIn=function(a){void 0===a&&(a=Math.pow(.95,this.userZoomSpeed)),this.scale/=a},ROS3D.OrbitControls.prototype.zoomOut=function(a){void 0===a&&(a=Math.pow(.95,this.userZoomSpeed)),this.scale*=a},ROS3D.OrbitControls.prototype.update=function(){var a=this.camera.position,b=a.clone().sub(this.center),c=Math.atan2(b.y,b.x),d=Math.atan2(Math.sqrt(b.y*b.y+b.x*b.x),b.z);this.autoRotate&&this.rotateLeft(2*Math.PI/60/60*this.autoRotateSpeed),c+=this.thetaDelta,d+=this.phiDelta;var e=1e-6;d=Math.max(e,Math.min(Math.PI-e,d));var f=b.length();b.y=f*Math.sin(d)*Math.sin(c),b.z=f*Math.cos(d),b.x=f*Math.sin(d)*Math.cos(c),b.multiplyScalar(this.scale),a.copy(this.center).add(b),this.camera.lookAt(this.center),f=b.length(),this.axes.position=this.center.clone(),this.axes.scale.x=this.axes.scale.y=this.axes.scale.z=.05*f,this.axes.updateMatrixWorld(!0),this.thetaDelta=0,this.phiDelta=0,this.scale=1,this.lastPosition.distanceTo(this.camera.position)>0&&(this.dispatchEvent({type:"change"}),this.lastPosition.copy(this.camera.position))}; \ No newline at end of file diff --git a/src/Ros3D.js b/src/Ros3D.js index 7a8962b1..19486a78 100644 --- a/src/Ros3D.js +++ b/src/Ros3D.js @@ -4,7 +4,7 @@ */ var ROS3D = ROS3D || { - REVISION : '6' + REVISION : '7-devel' }; // Marker types