Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
R
rndmc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
2
Issues
2
List
Boards
Labels
Service Desk
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jake Read
rndmc
Commits
bfa06660
Commit
bfa06660
authored
Dec 17, 2018
by
Jake Read
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mvrobot
parent
9322f1a4
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
801 additions
and
99 deletions
+801
-99
README.md
README.md
+4
-2
client/client.js
client/client.js
+26
-3
client/divtools.js
client/divtools.js
+7
-1
client/style.css
client/style.css
+8
-0
client/ui/libs/three.js
client/ui/libs/three.js
+487
-0
client/ui/robotRepresentation.js
client/ui/robotRepresentation.js
+125
-0
client/ui/threeCanvas.js
client/ui/threeCanvas.js
+1
-0
modules/robot/forwardTransform.js
modules/robot/forwardTransform.js
+51
-59
modules/ui/robotCanvas.js
modules/ui/robotCanvas.js
+21
-16
modules/util/gate.js
modules/util/gate.js
+9
-3
modules/util/log.js
modules/util/log.js
+7
-4
programs.js
programs.js
+6
-1
robot.js
robot.js
+46
-10
views.js
views.js
+3
-0
No files found.
README.md
View file @
bfa06660
...
...
@@ -267,8 +267,10 @@ View.assignProgram(program)
## Immediately
-
go for generic ui class like remote hardware: subscribes etc
-
nice work on generic ui classes / ui.thing.call('function', arg)
-
finish robot flow: offsets, ok, 100ms updates, ok
-
forward transform object -> three.js canvas
-
do key-binding ui for robot jogging, write video
-
three robot canvas
-
set module display width
...
...
client/client.js
View file @
bfa06660
...
...
@@ -32,7 +32,7 @@ var wrapper = {}
var
nav
=
{}
var
verbose
=
false
var
verboseComs
=
false
var
verboseComs
=
false
/*
...
...
@@ -98,7 +98,7 @@ function socketSend(type, data) {
type
:
type
,
data
:
data
}
if
(
verboseComs
)
console
.
log
(
'
SEND
'
,
msg
)
if
(
verboseComs
)
console
.
log
(
'
SEND
'
,
msg
)
sckt
.
send
(
JSON
.
stringify
(
msg
))
}
...
...
@@ -106,7 +106,7 @@ function socketRecv(evt) {
var
recv
=
JSON
.
parse
(
evt
.
data
)
var
type
=
recv
.
type
var
data
=
recv
.
data
if
(
verboseComs
)
console
.
log
(
'
RECV
'
,
recv
)
if
(
verboseComs
)
console
.
log
(
'
RECV
'
,
recv
)
// tree banger
switch
(
type
)
{
case
'
console
'
:
...
...
@@ -171,6 +171,9 @@ function heapSendsNewProgram(prgm) {
// whole hearted replace
// hello for bugs when we lay this on top of something else
program
=
prgm
if
(
program
.
description
.
view
!=
null
)
{
writeTransformToPage
(
program
.
description
.
view
)
}
// 1st we want to git rm old files ...
// when adding links, we'll have to add all and then draw links
if
(
verbose
)
console
.
log
(
'
LOAD PROGRAM
'
,
program
)
...
...
@@ -397,6 +400,21 @@ function getCurrentTransform() {
})
}
function
writeTransformToPage
(
trns
)
{
// console.log('writing transform', trns)
/* transform is like {
scale: number,
translate: [x, y],
origin: [x, y]
}
*/
document
.
body
.
style
.
transform
=
`scale(
${
trns
.
scale
}
) translate(
${
trns
.
translate
[
0
]}
px,
${
trns
.
translate
[
1
]}
px)`
document
.
body
.
style
.
transformOrigin
=
`
${
trns
.
origin
[
0
]}
px
${
trns
.
origin
[
1
]}
px`
// opposite for nav
nav
.
style
.
transformOrigin
=
`
${
trns
.
origin
[
0
]}
px
${
trns
.
origin
[
1
]}
px`
nav
.
style
.
transform
=
`scale(
${
1
/
trns
.
scale
}
) translate(
${
-
trns
.
translate
[
0
]
*
trns
.
scale
}
px,
${
-
trns
.
translate
[
1
]
*
trns
.
scale
}
px)`
}
function
elementIsNotModule
(
element
)
{
if
((
element
.
tagName
==
'
HTML
'
)
||
(
element
.
tagName
==
'
BODY
'
)
||
(
element
.
tagName
==
'
svg
'
))
{
return
true
...
...
@@ -420,6 +438,11 @@ onwheel = function(evt) {
var
ty
=
cT
.
ty
+
(
evt
.
pageY
-
cT
.
oy
)
*
(
1
-
1
/
cT
.
s
)
// body
writeTransformToPage
({
scale
:
scale
,
translate
:
[
tx
,
ty
],
origin
:
[
evt
.
pageX
,
evt
.
pageY
]
})
document
.
body
.
style
.
transform
=
`scale(
${
scale
}
) translate(
${
tx
}
px,
${
ty
}
px)`
document
.
body
.
style
.
transformOrigin
=
`
${
evt
.
pageX
}
px
${
evt
.
pageY
}
px`
...
...
client/divtools.js
View file @
bfa06660
...
...
@@ -3,11 +3,17 @@
function
addRepToView
(
rep
)
{
// a div to locate it
var
domElem
=
document
.
createElement
(
'
div
'
)
if
(
rep
.
description
.
isBigBlock
){
domElem
.
className
=
'
bigblock
'
}
else
{
domElem
.
className
=
'
block
'
}
// dif. color for hardwares ?
domElem
.
className
=
'
block
'
if
(
rep
.
description
.
isHardware
)
{
domElem
.
classList
.
add
(
'
hardware
'
)
}
domElem
.
style
.
left
=
lastPos
.
x
+
'
px
'
domElem
.
style
.
top
=
lastPos
.
y
+
'
px
'
...
...
client/style.css
View file @
bfa06660
...
...
@@ -18,6 +18,14 @@ body {
background-color
:
#303030
;
}
.bigblock
{
width
:
800px
;
position
:
absolute
;
padding
:
0px
;
padding-bottom
:
23px
;
background-color
:
#303030
;
}
.hardware
{
background-color
:
#4d4c4c
;
}
...
...
client/ui/libs/three.js
View file @
bfa06660
...
...
@@ -48754,3 +48754,490 @@ Object.defineProperties( THREE.OrbitControls.prototype, {
}
} );
;(function() {
"use strict";
var root = this
var has_require = typeof require !== 'undefined'
var THREE = root.THREE || has_require && require('three')
if( !THREE )
throw new Error( 'MeshLine requires three.js' )
function MeshLine() {
this.positions = [];
this.previous = [];
this.next = [];
this.side = [];
this.width = [];
this.indices_array = [];
this.uvs = [];
this.counters = [];
this.geometry = new THREE.BufferGeometry();
this.widthCallback = null;
}
MeshLine.prototype.setGeometry = function( g, c ) {
this.widthCallback = c;
this.positions = [];
this.counters = [];
if( g instanceof THREE.Geometry ) {
for( var j = 0; j < g.vertices.length; j++ ) {
var v = g.vertices[ j ];
var c = j/g.vertices.length;
this.positions.push( v.x, v.y, v.z );
this.positions.push( v.x, v.y, v.z );
this.counters.push(c);
this.counters.push(c);
}
}
if( g instanceof THREE.BufferGeometry ) {
// read attribute positions ?
}
if( g instanceof Float32Array || g instanceof Array ) {
for( var j = 0; j < g.length; j += 3 ) {
var c = j/g.length;
this.positions.push( g[ j ], g[ j + 1 ], g[ j + 2 ] );
this.positions.push( g[ j ], g[ j + 1 ], g[ j + 2 ] );
this.counters.push(c);
this.counters.push(c);
}
}
this.process();
}
MeshLine.prototype.compareV3 = function( a, b ) {
var aa = a * 6;
var ab = b * 6;
return ( this.positions[ aa ] === this.positions[ ab ] ) && ( this.positions[ aa + 1 ] === this.positions[ ab + 1 ] ) && ( this.positions[ aa + 2 ] === this.positions[ ab + 2 ] );
}
MeshLine.prototype.copyV3 = function( a ) {
var aa = a * 6;
return [ this.positions[ aa ], this.positions[ aa + 1 ], this.positions[ aa + 2 ] ];
}
MeshLine.prototype.process = function() {
var l = this.positions.length / 6;
this.previous = [];
this.next = [];
this.side = [];
this.width = [];
this.indices_array = [];
this.uvs = [];
for( var j = 0; j < l; j++ ) {
this.side.push( 1 );
this.side.push( -1 );
}
var w;
for( var j = 0; j < l; j++ ) {
if( this.widthCallback ) w = this.widthCallback( j / ( l -1 ) );
else w = 1;
this.width.push( w );
this.width.push( w );
}
for( var j = 0; j < l; j++ ) {
this.uvs.push( j / ( l - 1 ), 0 );
this.uvs.push( j / ( l - 1 ), 1 );
}
var v;
if( this.compareV3( 0, l - 1 ) ){
v = this.copyV3( l - 2 );
} else {
v = this.copyV3( 0 );
}
this.previous.push( v[ 0 ], v[ 1 ], v[ 2 ] );
this.previous.push( v[ 0 ], v[ 1 ], v[ 2 ] );
for( var j = 0; j < l - 1; j++ ) {
v = this.copyV3( j );
this.previous.push( v[ 0 ], v[ 1 ], v[ 2 ] );
this.previous.push( v[ 0 ], v[ 1 ], v[ 2 ] );
}
for( var j = 1; j < l; j++ ) {
v = this.copyV3( j );
this.next.push( v[ 0 ], v[ 1 ], v[ 2 ] );
this.next.push( v[ 0 ], v[ 1 ], v[ 2 ] );
}
if( this.compareV3( l - 1, 0 ) ){
v = this.copyV3( 1 );
} else {
v = this.copyV3( l - 1 );
}
this.next.push( v[ 0 ], v[ 1 ], v[ 2 ] );
this.next.push( v[ 0 ], v[ 1 ], v[ 2 ] );
for( var j = 0; j < l - 1; j++ ) {
var n = j * 2;
this.indices_array.push( n, n + 1, n + 2 );
this.indices_array.push( n + 2, n + 1, n + 3 );
}
if (!this.attributes) {
this.attributes = {
position: new THREE.BufferAttribute( new Float32Array( this.positions ), 3 ),
previous: new THREE.BufferAttribute( new Float32Array( this.previous ), 3 ),
next: new THREE.BufferAttribute( new Float32Array( this.next ), 3 ),
side: new THREE.BufferAttribute( new Float32Array( this.side ), 1 ),
width: new THREE.BufferAttribute( new Float32Array( this.width ), 1 ),
uv: new THREE.BufferAttribute( new Float32Array( this.uvs ), 2 ),
index: new THREE.BufferAttribute( new Uint16Array( this.indices_array ), 1 ),
counters: new THREE.BufferAttribute( new Float32Array( this.counters ), 1 )
}
} else {
this.attributes.position.copyArray(new Float32Array(this.positions));
this.attributes.position.needsUpdate = true;
this.attributes.previous.copyArray(new Float32Array(this.previous));
this.attributes.previous.needsUpdate = true;
this.attributes.next.copyArray(new Float32Array(this.next));
this.attributes.next.needsUpdate = true;
this.attributes.side.copyArray(new Float32Array(this.side));
this.attributes.side.needsUpdate = true;
this.attributes.width.copyArray(new Float32Array(this.width));
this.attributes.width.needsUpdate = true;
this.attributes.uv.copyArray(new Float32Array(this.uvs));
this.attributes.uv.needsUpdate = true;
this.attributes.index.copyArray(new Uint16Array(this.indices_array));
this.attributes.index.needsUpdate = true;
}
this.geometry.addAttribute( 'position', this.attributes.position );
this.geometry.addAttribute( 'previous', this.attributes.previous );
this.geometry.addAttribute( 'next', this.attributes.next );
this.geometry.addAttribute( 'side', this.attributes.side );
this.geometry.addAttribute( 'width', this.attributes.width );
this.geometry.addAttribute( 'uv', this.attributes.uv );
this.geometry.addAttribute( 'counters', this.attributes.counters );
this.geometry.setIndex( this.attributes.index );
}
function memcpy (src, srcOffset, dst, dstOffset, length) {
var i
src = src.subarray || src.slice ? src : src.buffer
dst = dst.subarray || dst.slice ? dst : dst.buffer
src = srcOffset ? src.subarray ?
src.subarray(srcOffset, length && srcOffset + length) :
src.slice(srcOffset, length && srcOffset + length) : src
if (dst.set) {
dst.set(src, dstOffset)
} else {
for (i=0; i<src.length; i++) {
dst[i + dstOffset] = src[i]
}
}
return dst
}
/**
* Fast method to advance the line by one position. The oldest position is removed.
* @param position
*/
MeshLine.prototype.advance = function(position) {
var positions = this.attributes.position.array;
var previous = this.attributes.previous.array;
var next = this.attributes.next.array;
var l = positions.length;
// PREVIOUS
memcpy( positions, 0, previous, 0, l );
// POSITIONS
memcpy( positions, 6, positions, 0, l - 6 );
positions[l - 6] = position.x;
positions[l - 5] = position.y;
positions[l - 4] = position.z;
positions[l - 3] = position.x;
positions[l - 2] = position.y;
positions[l - 1] = position.z;
// NEXT
memcpy( positions, 6, next, 0, l - 6 );
next[l - 6] = position.x;
next[l - 5] = position.y;
next[l - 4] = position.z;
next[l - 3] = position.x;
next[l - 2] = position.y;
next[l - 1] = position.z;
this.attributes.position.needsUpdate = true;
this.attributes.previous.needsUpdate = true;
this.attributes.next.needsUpdate = true;
};
function MeshLineMaterial( parameters ) {
var vertexShaderSource = [
'precision highp float;',
'',
'attribute vec3 position;',
'attribute vec3 previous;',
'attribute vec3 next;',
'attribute float side;',
'attribute float width;',
'attribute vec2 uv;',
'attribute float counters;',
'',
'uniform mat4 projectionMatrix;',
'uniform mat4 modelViewMatrix;',
'uniform vec2 resolution;',
'uniform float lineWidth;',
'uniform vec3 color;',
'uniform float opacity;',
'uniform float near;',
'uniform float far;',
'uniform float sizeAttenuation;',
'',
'varying vec2 vUV;',
'varying vec4 vColor;',
'varying float vCounters;',
'',
'vec2 fix( vec4 i, float aspect ) {',
'',
' vec2 res = i.xy / i.w;',
' res.x *= aspect;',
' vCounters = counters;',
' return res;',
'',
'}',
'',
'void main() {',
'',
' float aspect = resolution.x / resolution.y;',
' float pixelWidthRatio = 1. / (resolution.x * projectionMatrix[0][0]);',
'',
' vColor = vec4( color, opacity );',
' vUV = uv;',
'',
' mat4 m = projectionMatrix * modelViewMatrix;',
' vec4 finalPosition = m * vec4( position, 1.0 );',
' vec4 prevPos = m * vec4( previous, 1.0 );',
' vec4 nextPos = m * vec4( next, 1.0 );',
'',
' vec2 currentP = fix( finalPosition, aspect );',
' vec2 prevP = fix( prevPos, aspect );',
' vec2 nextP = fix( nextPos, aspect );',
'',
' float pixelWidth = finalPosition.w * pixelWidthRatio;',
' float w = 1.8 * pixelWidth * lineWidth * width;',
'',
' if( sizeAttenuation == 1. ) {',
' w = 1.8 * lineWidth * width;',
' }',
'',
' vec2 dir;',
' if( nextP == currentP ) dir = normalize( currentP - prevP );',
' else if( prevP == currentP ) dir = normalize( nextP - currentP );',
' else {',
' vec2 dir1 = normalize( currentP - prevP );',
' vec2 dir2 = normalize( nextP - currentP );',
' dir = normalize( dir1 + dir2 );',
'',
' vec2 perp = vec2( -dir1.y, dir1.x );',
' vec2 miter = vec2( -dir.y, dir.x );',
' //w = clamp( w / dot( miter, perp ), 0., 4. * lineWidth * width );',
'',
' }',
'',
' //vec2 normal = ( cross( vec3( dir, 0. ), vec3( 0., 0., 1. ) ) ).xy;',
' vec2 normal = vec2( -dir.y, dir.x );',
' normal.x /= aspect;',
' normal *= .5 * w;',
'',
' vec4 offset = vec4( normal * side, 0.0, 1.0 );',
' finalPosition.xy += offset.xy;',
'',
' gl_Position = finalPosition;',
'',
'}' ];
var fragmentShaderSource = [
'#extension GL_OES_standard_derivatives : enable',
'precision mediump float;',
'',
'uniform sampler2D map;',
'uniform sampler2D alphaMap;',
'uniform float useMap;',
'uniform float useAlphaMap;',
'uniform float useDash;',
'uniform float dashArray;',
'uniform float dashOffset;',
'uniform float dashRatio;',
'uniform float visibility;',
'uniform float alphaTest;',
'uniform vec2 repeat;',
'',
'varying vec2 vUV;',
'varying vec4 vColor;',
'varying float vCounters;',
'',
'void main() {',
'',
' vec4 c = vColor;',
' if( useMap == 1. ) c *= texture2D( map, vUV * repeat );',
' if( useAlphaMap == 1. ) c.a *= texture2D( alphaMap, vUV * repeat ).a;',
' if( c.a < alphaTest ) discard;',
' if( useDash == 1. ){',
' c.a *= ceil(mod(vCounters + dashOffset, dashArray) - (dashArray * dashRatio));',
' }',
' gl_FragColor = c;',
' gl_FragColor.a *= step(vCounters, visibility);',
'}' ];
function check( v, d ) {
if( v === undefined ) return d;
return v;
}
THREE.Material.call( this );
parameters = parameters || {};
this.lineWidth = check( parameters.lineWidth, 1 );
this.map = check( parameters.map, null );
this.useMap = check( parameters.useMap, 0 );
this.alphaMap = check( parameters.alphaMap, null );
this.useAlphaMap = check( parameters.useAlphaMap, 0 );
this.color = check( parameters.color, new THREE.Color( 0xffffff ) );
this.opacity = check( parameters.opacity, 1 );
this.resolution = check( parameters.resolution, new THREE.Vector2( 1, 1 ) );
this.sizeAttenuation = check( parameters.sizeAttenuation, 1 );
this.near = check( parameters.near, 1 );
this.far = check( parameters.far, 1 );
this.dashArray = check( parameters.dashArray, 0 );
this.dashOffset = check( parameters.dashOffset, 0 );
this.dashRatio = check( parameters.dashRatio, 0.5 );
this.useDash = ( this.dashArray !== 0 ) ? 1 : 0;
this.visibility = check( parameters.visibility, 1 );
this.alphaTest = check( parameters.alphaTest, 0 );
this.repeat = check( parameters.repeat, new THREE.Vector2( 1, 1 ) );
var material = new THREE.RawShaderMaterial( {
uniforms:{
lineWidth: { type: 'f', value: this.lineWidth },
map: { type: 't', value: this.map },
useMap: { type: 'f', value: this.useMap },
alphaMap: { type: 't', value: this.alphaMap },
useAlphaMap: { type: 'f', value: this.useAlphaMap },
color: { type: 'c', value: this.color },
opacity: { type: 'f', value: this.opacity },
resolution: { type: 'v2', value: this.resolution },
sizeAttenuation: { type: 'f', value: this.sizeAttenuation },
near: { type: 'f', value: this.near },
far: { type: 'f', value: this.far },
dashArray: { type: 'f', value: this.dashArray },
dashOffset: { type: 'f', value: this.dashOffset },
dashRatio: { type: 'f', value: this.dashRatio },
useDash: { type: 'f', value: this.useDash },
visibility: {type: 'f', value: this.visibility},
alphaTest: {type: 'f', value: this.alphaTest},
repeat: { type: 'v2', value: this.repeat }
},
vertexShader: vertexShaderSource.join( '\r\n' ),
fragmentShader: fragmentShaderSource.join( '\r\n' )
});
delete parameters.lineWidth;
delete parameters.map;
delete parameters.useMap;
delete parameters.alphaMap;
delete parameters.useAlphaMap;
delete parameters.color;
delete parameters.opacity;
delete parameters.resolution;
delete parameters.sizeAttenuation;
delete parameters.near;
delete parameters.far;
delete parameters.dashArray;
delete parameters.dashOffset;
delete parameters.dashRatio;
delete parameters.visibility;
delete parameters.alphaTest;
delete parameters.repeat;
material.type = 'MeshLineMaterial';
material.setValues( parameters );
return material;
};
MeshLineMaterial.prototype = Object.create( THREE.Material.prototype );
MeshLineMaterial.prototype.constructor = MeshLineMaterial;
MeshLineMaterial.prototype.copy = function ( source ) {
THREE.Material.prototype.copy.call( this, source );
this.lineWidth = source.lineWidth;
this.map = source.map;
this.useMap = source.useMap;
this.alphaMap = source.alphaMap;
this.useAlphaMap = source.useAlphaMap;
this.color.copy( source.color );
this.opacity = source.opacity;
this.resolution.copy( source.resolution );
this.sizeAttenuation = source.sizeAttenuation;
this.near = source.near;
this.far = source.far;
this.dashArray.copy( source.dashArray );
this.dashOffset.copy( source.dashOffset );
this.dashRatio.copy( source.dashRatio );
this.useDash = source.useDash;
this.visibility = source.visibility;
this.alphaTest = source.alphaTest;
this.repeat.copy( source.repeat );
return this;
};
if( typeof exports !== 'undefined' ) {
if( typeof module !== 'undefined' && module.exports ) {
exports = module.exports = { MeshLine: MeshLine, MeshLineMaterial: MeshLineMaterial };
}
exports.MeshLine = MeshLine;
exports.MeshLineMaterial = MeshLineMaterial;
}
else {
root.MeshLine = MeshLine;
root.MeshLineMaterial = MeshLineMaterial;
}
}).call(this);
client/ui/robotRepresentation.js
0 → 100644
View file @
bfa06660
(
function
()
{
// generic / example three.js canvas
/* KRITICAL STEP */
// this is our object, that we will later append
// to the .lump position
var
threeCanvas
=
{}
var
verbose
=
false
// now three stuff
var
container
=
document
.
createElement
(
'
div
'
)
var
scene
=
new
THREE
.
Scene
()
scene
.
background
=
new
THREE
.
Color
(
0xd6d6d6
)
var
camera
=
new
THREE
.
PerspectiveCamera
(
75
,
1
,
0.01
,
1000
)
camera
.
up
.
set
(
0
,
0
,
1
)
var
renderer
=
new
THREE
.
WebGLRenderer
()
renderer
.
setSize
(
696
,
796
)
container
.
appendChild
(
renderer
.
domElement
)
// axes
var
axesHelper
=
new
THREE
.
AxesHelper
(
0.1
)
scene
.
add
(
axesHelper
)
// grid
/*
var gridHelper = new THREE.GridHelper(10, 100)
gridHelper.translateOnAxis(new THREE.Vector3(0, 0, 1), -0.01)
gridHelper.rotateX(-Math.PI / 2)
scene.add(gridHelper)
*/
// one line
var
material
=
new
THREE
.
LineBasicMaterial
({
color
:
0x000000
})
var
geometry
=
new
THREE
.
Geometry
()
geometry
.
vertices
.
push
(
new
THREE
.
Vector3
(
0
,
0
,
0
))
geometry
.
vertices
.
push
(
new
THREE
.
Vector3
(
0.5
,
0
,
0.5
))
geometry
.
vertices
.
push
(
new
THREE
.
Vector3
(
1
,
0
,
0.5
))
var
meshline
=
new
MeshLine
()
meshline
.
setGeometry
(
geometry
,
function
(
p
)
{
return
3
})
var
material
=
new
MeshLineMaterial
({
useMap
:
false
,
color
:
new
THREE
.
Color
(
0x50514f
),
opacity
:
1
,
sizeAttenuation
:
true
,
lineWidth
:
0.01
,
near
:
camera
.
near
,
far
:
camera
.
far
})
var
mesh
=
new
THREE
.
Mesh
(
meshline
.
geometry
,
material
)
scene
.
add
(
mesh
)