diff --git a/examples/js/loaders/SVGLoader.js b/examples/js/loaders/SVGLoader.js index a71ffa5833f2e08a882fca40cdbe9ce8a1cecb3c..809c4d94d0a8ae48f14aae703a6b1110e0406b5b 100644 --- a/examples/js/loaders/SVGLoader.js +++ b/examples/js/loaders/SVGLoader.js @@ -756,140 +756,139 @@ THREE.SVGLoader.prototype = { function parseTransformNode( node ) { - var transformAttr = node.getAttribute( 'transform' ); - var transform = null; - var openParPos = transformAttr.indexOf( "(" ); - var closeParPos = transformAttr.indexOf( ")" ); + var transform = new THREE.Matrix3(); + var currentTransform = tempTransform0; + var transformsTexts = node.getAttribute( 'transform' ).split( ' ' ); + + for ( var tIndex = transformsTexts.length - 1; tIndex >= 0; tIndex-- ) { - if ( openParPos > 0 && openParPos < closeParPos ) { + var transformText = transformsTexts[ tIndex ]; + var openParPos = transformText.indexOf( "(" ); + var closeParPos = transformText.indexOf( ")" ); - var transformType = transformAttr.substr( 0, openParPos ); + if ( openParPos > 0 && openParPos < closeParPos ) { - var array = parseFloats( transformAttr.substr( openParPos + 1, closeParPos - openParPos - 1 ) ); + var transformType = transformText.substr( 0, openParPos ); - switch ( transformType ) { + var array = parseFloats( transformText.substr( openParPos + 1, closeParPos - openParPos - 1 ) ); + + currentTransform.identity(); - case "translate": + switch ( transformType ) { - if ( array.length >= 1 ) { + case "translate": - transform = new THREE.Matrix3(); + if ( array.length >= 1 ) { - var tx = array[ 0 ]; - var ty = tx; + var tx = array[ 0 ]; + var ty = tx; - if ( array.length >= 2 ) { + if ( array.length >= 2 ) { - ty = array[ 1 ]; + ty = array[ 1 ]; - } + } - transform.translate( tx, ty ); + currentTransform.translate( tx, ty ); - } + } - break; + break; - case "rotate": + case "rotate": - if ( array.length >= 1 ) { + if ( array.length >= 1 ) { - var angle = 0; - var cx = 0; - var cy = 0; + var angle = 0; + var cx = 0; + var cy = 0; - transform = new THREE.Matrix3(); + // Angle + angle = - array[ 0 ] * Math.PI / 180; - // Angle - angle = - array[ 0 ] * Math.PI / 180; + if ( array.length >= 3 ) { - if ( array.length >= 3 ) { + // Center x, y + cx = array[ 1 ]; + cy = array[ 2 ]; - // Center x, y - cx = array[ 1 ]; - cy = array[ 2 ]; + } - } + // Rotate around center (cx, cy) + tempTransform1.identity().translate( -cx, -cy ); + tempTransform2.identity().rotate( angle ); + tempTransform3.multiplyMatrices( tempTransform2, tempTransform1 ); + tempTransform1.identity().translate( cx, cy ); + currentTransform.multiplyMatrices( tempTransform1, tempTransform3 ); - // Rotate around center (cx, cy) - tempTransform1.identity().translate( -cx, -cy ); - tempTransform2.identity().rotate( angle ); - tempTransform3.multiplyMatrices( tempTransform2, tempTransform1 ); - tempTransform1.identity().translate( cx, cy ); - transform.multiplyMatrices( tempTransform1, tempTransform3 ); + } - } + break; - break; + case "scale": - case "scale": + if ( array.length >= 1 ) { - if ( array.length >= 1 ) { + var scaleX = array[ 0 ]; + var scaleY = scaleX; - transform = new THREE.Matrix3(); + if ( array.length >= 2 ) { + scaleY = array[ 1 ]; + } - var scaleX = array[ 0 ]; - var scaleY = scaleX; + currentTransform.scale( scaleX, scaleY ); - if ( array.length >= 2 ) { - scaleY = array[ 1 ]; } - transform.scale( scaleX, scaleY ); - - } - - break; - - case "skewX": - - if ( array.length === 1 ) { + break; - transform = new THREE.Matrix3(); + case "skewX": - transform.set( - 1, Math.tan( array[ 0 ] * Math.PI / 180 ), 0, - 0, 1, 0, - 0, 0, 1 - ); + if ( array.length === 1 ) { - } + currentTransform.set( + 1, Math.tan( array[ 0 ] * Math.PI / 180 ), 0, + 0, 1, 0, + 0, 0, 1 + ); - break; + } - case "skewY": + break; - if ( array.length === 1 ) { + case "skewY": - transform = new THREE.Matrix3(); + if ( array.length === 1 ) { - transform.set( - 1, 0, 0, - Math.tan( array[ 0 ] * Math.PI / 180 ), 1, 0, - 0, 0, 1 - ); + currentTransform.set( + 1, 0, 0, + Math.tan( array[ 0 ] * Math.PI / 180 ), 1, 0, + 0, 0, 1 + ); - } + } - break; + break; - case "matrix": + case "matrix": - if ( array.length === 6 ) { + if ( array.length === 6 ) { - transform = new THREE.Matrix3(); + currentTransform.set( + array[ 0 ], array[ 2 ], array[ 4 ], + array[ 1 ], array[ 3 ], array[ 5 ], + 0, 0, 1 + ); - transform.set( - array[ 0 ], array[ 2 ], array[ 4 ], - array[ 1 ], array[ 3 ], array[ 5 ], - 0, 0, 1 - ); + } - } + break; + } - break; } + transform.premultiply( currentTransform ); + } return transform; @@ -984,6 +983,7 @@ THREE.SVGLoader.prototype = { var transformStack = []; + var tempTransform0 = new THREE.Matrix3(); var tempTransform1 = new THREE.Matrix3(); var tempTransform2 = new THREE.Matrix3(); var tempTransform3 = new THREE.Matrix3();