Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 45 additions & 34 deletions examples/js/loaders/SVGLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,7 @@ THREE.SVGLoader.prototype = {

parse: function ( text ) {

function parseNodes( nodes ) {

for ( var i = 0; i < nodes.length; i ++ ) {

parseNode( nodes[ i ] );

}

}

function parseNode( node ) {
function parseNode( node, style ) {

if ( node.nodeType !== 1 ) return;

Expand All @@ -48,49 +38,56 @@ THREE.SVGLoader.prototype = {
break;

case 'g':
parseStyle( node, style );
break;

case 'path':
paths.push( parsePathNode( node ) );
paths.push( parsePathNode( node, style ) );
break;

case 'rect':
paths.push( parseRectNode( node ) );
paths.push( parseRectNode( node, style ) );
break;

case 'polygon':
paths.push( parsePolygonNode( node ) );
paths.push( parsePolygonNode( node, style ) );
break;

case 'polyline':
paths.push( parsePolylineNode( node ) );
paths.push( parsePolylineNode( node, style ) );
break;

case 'circle':
paths.push( parseCircleNode( node ) );
paths.push( parseCircleNode( node, style ) );
break;

case 'ellipse':
paths.push( parseEllipseNode( node ) );
paths.push( parseEllipseNode( node, style ) );
break;

case 'line':
paths.push( parseLineNode( node ) );
paths.push( parseLineNode( node, style ) );
break;

default:
console.log( node );

}

parseNodes( node.childNodes );
var nodes = node.childNodes;

for ( var i = 0; i < nodes.length; i ++ ) {

parseNode( nodes[ i ], style );

}

}

function parsePathNode( node ) {
function parsePathNode( node, style ) {

var path = new THREE.ShapePath();
path.color.setStyle( parseFill( node ) );
path.color.setStyle( parseFill( node, style ) );

var point = new THREE.Vector2();
var control = new THREE.Vector2();
Expand Down Expand Up @@ -325,15 +322,15 @@ THREE.SVGLoader.prototype = {

}

function parseRectNode( node ) {
function parseRectNode( node, style ) {

var x = parseFloat( node.getAttribute( 'x' ) );
var y = parseFloat( node.getAttribute( 'y' ) );
var w = parseFloat( node.getAttribute( 'width' ) );
var h = parseFloat( node.getAttribute( 'height' ) );

var path = new THREE.ShapePath();
path.color.setStyle( parseFill( node ) );
path.color.setStyle( parseFill( node, style ) );
path.moveTo( x, y );
path.lineTo( x + w, y );
path.lineTo( x + w, y + h );
Expand All @@ -342,7 +339,7 @@ THREE.SVGLoader.prototype = {

}

function parsePolygonNode( node ) {
function parsePolygonNode( node, style ) {

function iterator( match, a, b ) {

Expand All @@ -362,7 +359,7 @@ THREE.SVGLoader.prototype = {
var regex = /(-?[\d\.?]+)[,|\s](-?[\d\.?]+)/g;

var path = new THREE.ShapePath();
path.color.setStyle( parseFill( node ) );
path.color.setStyle( parseFill( node, style ) );

var index = 0;

Expand All @@ -374,7 +371,7 @@ THREE.SVGLoader.prototype = {

}

function parsePolylineNode( node ) {
function parsePolylineNode( node, style ) {

function iterator( match, a, b ) {

Expand All @@ -394,7 +391,7 @@ THREE.SVGLoader.prototype = {
var regex = /(-?[\d\.?]+)[,|\s](-?[\d\.?]+)/g;

var path = new THREE.ShapePath();
path.color.setStyle( parseFill( node ) );
path.color.setStyle( parseFill( node, style ) );

var index = 0;

Expand All @@ -406,7 +403,7 @@ THREE.SVGLoader.prototype = {

}

function parseCircleNode( node ) {
function parseCircleNode( node, style ) {

var x = parseFloat( node.getAttribute( 'cx' ) );
var y = parseFloat( node.getAttribute( 'cy' ) );
Expand All @@ -416,14 +413,14 @@ THREE.SVGLoader.prototype = {
subpath.absarc( x, y, r, 0, Math.PI * 2 );

var path = new THREE.ShapePath();
path.color.setStyle( parseFill( node ) );
path.color.setStyle( parseFill( node, style ) );
path.subPaths.push( subpath );

return path;

}

function parseEllipseNode( node ) {
function parseEllipseNode( node, style ) {

var x = parseFloat( node.getAttribute( 'cx' ) );
var y = parseFloat( node.getAttribute( 'cy' ) );
Expand All @@ -434,14 +431,14 @@ THREE.SVGLoader.prototype = {
subpath.absellipse( x, y, rx, ry, 0, Math.PI * 2 );

var path = new THREE.ShapePath();
path.color.setStyle( parseFill( node ) );
path.color.setStyle( parseFill( node, style ) );
path.subPaths.push( subpath );

return path;

}

function parseLineNode( node ) {
function parseLineNode( node, style ) {

var x1 = parseFloat( node.getAttribute( 'x1' ) );
var y1 = parseFloat( node.getAttribute( 'y1' ) );
Expand All @@ -457,14 +454,28 @@ THREE.SVGLoader.prototype = {

}

function parseFill( node ) {
//

function parseStyle( node, style ) {

style.fill = node.style.fill;

}

function parseFill( node, style ) {

if ( node.hasAttribute( 'fill' ) ) {

return node.getAttribute( 'fill' );

}

if ( style.fill !== '' ) {

return style.fill;

}

return '#ffffff';

}
Expand Down Expand Up @@ -499,7 +510,7 @@ THREE.SVGLoader.prototype = {

var paths = [];

parseNode( svg );
parseNode( svg, {} );

return paths;

Expand Down
1 change: 1 addition & 0 deletions examples/webgl_loader_svg.html
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@
//

var controls = new THREE.OrbitControls( camera, renderer.domElement );
controls.screenSpacePanning = true;

//

Expand Down