Răsfoiți Sursa

Merge remote-tracking branch 'jterrace/double-sided-fix' into dev

Mr.doob 13 ani în urmă
părinte
comite
50df8b9bae
1 a modificat fișierele cu 35 adăugiri și 19 ștergeri
  1. 35 19
      examples/js/loaders/ColladaLoader.js

+ 35 - 19
examples/js/loaders/ColladaLoader.js

@@ -742,11 +742,19 @@ THREE.ColladaLoader = function () {
 						var mat = materials[ instance_material.target ];
 						var effect_id = mat.instance_effect.url;
 						var shader = effects[ effect_id ].shader;
+						var material3js = shader.material;
 
-						shader.material.opacity = !shader.material.opacity ? 1 : shader.material.opacity;
+						if ( geometry.doubleSided ) {
+
+							material3js = material3js.clone();
+							material3js.side = THREE.DoubleSide;
+
+						}
+
+						material3js.opacity = !material3js.opacity ? 1 : material3js.opacity;
 						used_materials[ instance_material.symbol ] = num_materials;
-						used_materials_array.push( shader.material )
-						first_material = shader.material;
+						used_materials_array.push( material3js );
+						first_material = material3js;
 						first_material.name = mat.name == null || mat.name === '' ? mat.id : mat.name;
 						num_materials ++;
 
@@ -755,7 +763,7 @@ THREE.ColladaLoader = function () {
 				}
 
 				var mesh;
-				var material = first_material || new THREE.MeshLambertMaterial( { color: 0xdddddd, shading: THREE.FlatShading } );
+				var material = first_material || new THREE.MeshLambertMaterial( { color: 0xdddddd, shading: THREE.FlatShading, side: geometry.doubleSided ? THREE.DoubleSide : THREE.FrontSide } );
 				var geom = geometry.mesh.geometry3js;
 
 				if ( num_materials > 1 ) {
@@ -2226,6 +2234,8 @@ THREE.ColladaLoader = function () {
 
 		this.id = element.getAttribute('id');
 
+		extractDoubleSided( this, element );
+
 		for ( var i = 0; i < element.childNodes.length; i ++ ) {
 
 			var child = element.childNodes[i];
@@ -3322,21 +3332,7 @@ THREE.ColladaLoader = function () {
 		this.id = element.getAttribute( 'id' );
 		this.name = element.getAttribute( 'name' );
 
-		this.doubleSided = false;
-
-		var node = COLLADA.evaluate( './/dae:extra//dae:double_sided', element, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
-
-		if ( node ) {
-
-			node = node.iterateNext();
-
-			if ( node && parseInt( node.textContent, 10 ) === 1 ) {
-
-				this.doubleSided = true;
-
-			}
-
-		}
+		extractDoubleSided( this, element );
 
 		this.shader = null;
 
@@ -4205,6 +4201,26 @@ THREE.ColladaLoader = function () {
 
 	};
 
+	function extractDoubleSided( obj, element ) {
+
+		obj.doubleSided = false;
+
+		var node = COLLADA.evaluate( './/dae:extra//dae:double_sided', element, _nsResolver, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null );
+
+		if ( node ) {
+
+			node = node.iterateNext();
+
+			if ( node && parseInt( node.textContent, 10 ) === 1 ) {
+
+				obj.doubleSided = true;
+
+			}
+
+		}
+
+	};
+
 	// Up axis conversion
 
 	function setUpConversion() {