Created
April 12, 2016 10:49
-
-
Save Samsy/096fb2916dae6c9f6c4ebaa062e89983 to your computer and use it in GitHub Desktop.
CSS 3D RENDERER IE FIX
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import THREE from 'three' | |
import Config from 'config' | |
let config = Config.instance | |
var isLow = false | |
if(config.browser == 'Safari') { | |
isLow = true | |
} | |
// console.log('debug css3D ' + config.browser) | |
/** | |
* Based on http://www.emagix.net/academic/mscs-project/item/camera-sync-with-css3-and-webgl-threejs | |
* @author mrdoob / http://mrdoob.com/ | |
*/ | |
THREE.CSS3DObject = function ( element ) { | |
THREE.Object3D.call( this ); | |
this.element = element; | |
this.element.style.position = 'absolute'; | |
this.addEventListener( 'removed', function ( event ) { | |
if ( this.element.parentNode !== null ) { | |
this.element.parentNode.removeChild( this.element ); | |
} | |
} ); | |
}; | |
THREE.CSS3DObject.prototype = Object.create( THREE.Object3D.prototype ); | |
THREE.CSS3DObject.prototype.constructor = THREE.CSS3DObject; | |
THREE.CSS3DSprite = function ( element ) { | |
THREE.CSS3DObject.call( this, element ); | |
}; | |
THREE.CSS3DSprite.prototype = Object.create( THREE.CSS3DObject.prototype ); | |
THREE.CSS3DSprite.prototype.constructor = THREE.CSS3DSprite; | |
// | |
THREE.CSS3DRenderer = function () { | |
var _width, _height; | |
var _widthHalf, _heightHalf; | |
var matrix = new THREE.Matrix4(); | |
var cache = { | |
camera: { fov: 0, style: '' }, | |
objects: {} | |
}; | |
var domElement = document.createElement( 'div' ); | |
domElement.style.overflow = 'hidden'; | |
domElement.style.WebkitTransformStyle = 'preserve-3d'; | |
domElement.style.MozTransformStyle = 'preserve-3d'; | |
domElement.style.oTransformStyle = 'preserve-3d'; | |
domElement.style.transformStyle = 'preserve-3d'; | |
this.domElement = domElement; | |
var cameraElement = document.createElement( 'div' ); | |
cameraElement.style.WebkitTransformStyle = 'preserve-3d'; | |
cameraElement.style.MozTransformStyle = 'preserve-3d'; | |
cameraElement.style.oTransformStyle = 'preserve-3d'; | |
cameraElement.style.transformStyle = 'preserve-3d'; | |
domElement.appendChild( cameraElement ); | |
this.setClearColor = function () {}; | |
this.getSize = function() { | |
return { | |
width: _width, | |
height: _height | |
}; | |
}; | |
this.setSize = function ( width, height ) { | |
_width = width; | |
_height = height; | |
_widthHalf = _width / 2; | |
_heightHalf = _height / 2; | |
domElement.style.width = width + 'px'; | |
domElement.style.height = height + 'px'; | |
cameraElement.style.width = width + 'px'; | |
cameraElement.style.height = height + 'px'; | |
}; | |
var isInt = function( value ) { | |
return Number( value ) === value && value % 1 === 0; | |
}; | |
var epsilon; | |
if ( !isLow ) { | |
epsilon = function ( value ) { | |
return Math.abs( value ) < 0.000001 ? 0 : value; | |
}; | |
} | |
else { | |
epsilon = function ( value ) { | |
return Math.abs( value ) < 0.000001 ? 0 : value.toFixed(10); | |
}; | |
} | |
var getCameraCSSMatrix = function ( matrix ) { | |
var elements = matrix.elements; | |
return 'matrix3d(' + | |
epsilon( elements[ 0 ] ) + ',' + | |
epsilon( - elements[ 1 ] ) + ',' + | |
epsilon( elements[ 2 ] ) + ',' + | |
epsilon( elements[ 3 ] ) + ',' + | |
epsilon( elements[ 4 ] ) + ',' + | |
epsilon( - elements[ 5 ] ) + ',' + | |
epsilon( elements[ 6 ] ) + ',' + | |
epsilon( elements[ 7 ] ) + ',' + | |
epsilon( elements[ 8 ] ) + ',' + | |
epsilon( - elements[ 9 ] ) + ',' + | |
epsilon( elements[ 10 ] ) + ',' + | |
epsilon( elements[ 11 ] ) + ',' + | |
epsilon( elements[ 12 ] ) + ',' + | |
epsilon( - elements[ 13 ] ) + ',' + | |
epsilon( elements[ 14 ] ) + ',' + | |
epsilon( elements[ 15 ] ) + | |
')'; | |
}; | |
var getObjectCSSMatrix = function ( matrix ) { | |
var elements = matrix.elements; | |
return 'translate3d(-50%,-50%,0) matrix3d(' + | |
epsilon( elements[ 0 ] ) + ',' + | |
epsilon( elements[ 1 ] ) + ',' + | |
epsilon( elements[ 2 ] ) + ',' + | |
epsilon( elements[ 3 ] ) + ',' + | |
epsilon( - elements[ 4 ] ) + ',' + | |
epsilon( - elements[ 5 ] ) + ',' + | |
epsilon( - elements[ 6 ] ) + ',' + | |
epsilon( - elements[ 7 ] ) + ',' + | |
epsilon( elements[ 8 ] ) + ',' + | |
epsilon( elements[ 9 ] ) + ',' + | |
epsilon( elements[ 10 ] ) + ',' + | |
epsilon( elements[ 11 ] ) + ',' + | |
epsilon( elements[ 12 ] ) + ',' + | |
epsilon( elements[ 13 ] ) + ',' + | |
epsilon( elements[ 14 ] ) + ',' + | |
epsilon( elements[ 15 ] ) + | |
')'; | |
}; | |
var renderObject = function ( object, camera ) { | |
if ( object instanceof THREE.CSS3DObject ) { | |
var style; | |
if ( object instanceof THREE.CSS3DSprite ) { | |
// http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/ | |
matrix.copy( camera.matrixWorldInverse ); | |
matrix.transpose(); | |
matrix.copyPosition( object.matrixWorld ); | |
matrix.scale( object.scale ); | |
matrix.elements[ 3 ] = 0; | |
matrix.elements[ 7 ] = 0; | |
matrix.elements[ 11 ] = 0; | |
matrix.elements[ 15 ] = 1; | |
style = getObjectCSSMatrix( matrix ); | |
} else { | |
style = getObjectCSSMatrix( object.matrixWorld ); | |
} | |
var element = object.element; | |
var cachedStyle = cache.objects[ object.id ]; | |
if ( cachedStyle === undefined || cachedStyle !== style ) { | |
element.style.WebkitTransform = style; | |
element.style.MozTransform = style; | |
element.style.oTransform = style; | |
element.style.transform = style; | |
cache.objects[ object.id ] = style; | |
} | |
if ( element.parentNode !== cameraElement ) { | |
cameraElement.appendChild( element ); | |
} | |
} | |
for ( var i = 0, l = object.children.length; i < l; i ++ ) { | |
renderObject( object.children[ i ], camera ); | |
} | |
}; | |
this.render = function ( scene, camera ) { | |
var fov = (0.5 / Math.tan( THREE.Math.degToRad( camera.fov * 0.5 ) ) * _height); | |
if ( cache.camera.fov !== fov ) { | |
domElement.style.WebkitPerspective = fov + "px"; | |
domElement.style.MozPerspective = fov + "px"; | |
domElement.style.oPerspective = fov + "px"; | |
domElement.style.perspective = fov + "px"; | |
cache.camera.fov = fov; | |
console.log(cache.camera.fov, camera.fov ) | |
} | |
scene.updateMatrixWorld(); | |
if ( camera.parent === null ) camera.updateMatrixWorld(); | |
camera.matrixWorldInverse.getInverse( camera.matrixWorld ); | |
var style = "translate3d(0,0," + fov + "px)" + getCameraCSSMatrix( camera.matrixWorldInverse ) + | |
" translate3d(" + _widthHalf + "px," + _heightHalf + "px, 0)"; | |
if ( cache.camera.style !== style ) { | |
cameraElement.style.WebkitTransform = style; | |
cameraElement.style.MozTransform = style; | |
cameraElement.style.oTransform = style; | |
cameraElement.style.transform = style; | |
cache.camera.style = style; | |
} | |
renderObject( scene, camera ); | |
}; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment