diff --git a/src/away3d/containers/ObjectContainer3D.as b/src/away3d/containers/ObjectContainer3D.as index 7891b9de1..eb890c107 100644 --- a/src/away3d/containers/ObjectContainer3D.as +++ b/src/away3d/containers/ObjectContainer3D.as @@ -340,7 +340,8 @@ package away3d.containers var m : Number; while (i < len) { - m = _children[i++].minX; + var child:ObjectContainer3D = _children[i++]; + m = child.minX + child.x; if (m < min) min = m; } @@ -359,7 +360,8 @@ package away3d.containers var m : Number; while (i < len) { - m = _children[i++].minY; + var child:ObjectContainer3D = _children[i++]; + m = child.minY + child.y; if (m < min) min = m; } @@ -378,7 +380,8 @@ package away3d.containers var m : Number; while (i < len) { - m = _children[i++].minZ; + var child:ObjectContainer3D = _children[i++]; + m = child.minZ + child.z; if (m < min) min = m; } @@ -398,7 +401,8 @@ package away3d.containers var m : Number; while (i < len) { - m = _children[i++].maxX; + var child:ObjectContainer3D = _children[i++]; + m = child.maxX + child.x; if (m > max) max = m; } @@ -417,7 +421,8 @@ package away3d.containers var m : Number; while (i < len) { - m = _children[i++].maxY; + var child:ObjectContainer3D = _children[i++]; + m = child.maxY + child.y; if (m > max) max = m; } @@ -436,7 +441,8 @@ package away3d.containers var m : Number; while (i < len) { - m = _children[i++].maxZ; + var child:ObjectContainer3D = _children[i++]; + m = child.maxZ + child.z; if (m > max) max = m; } @@ -599,6 +605,24 @@ package away3d.containers if (childIndex == -1) throw new Error("Parameter is not a child of the caller"); + removeChildInternal(childIndex, child); + } + + + /** + * Removes a 3d object from the child array of the container + * + * @param index Index of 3d object to be removed + */ + public function removeChildAt(index:uint):void + { + var child:ObjectContainer3D = _children[index]; + + removeChildInternal(index, child); + } + + private function removeChildInternal(childIndex:uint, child:ObjectContainer3D):void + { // index is important because getChildAt needs to be regular. _children.splice(childIndex, 1); diff --git a/src/away3d/containers/Scene3D.as b/src/away3d/containers/Scene3D.as index 91350db21..7afdc8e46 100644 --- a/src/away3d/containers/Scene3D.as +++ b/src/away3d/containers/Scene3D.as @@ -90,6 +90,16 @@ package away3d.containers _sceneGraphRoot.removeChild(child); } + /** + * Removes a child from the scene's root. + * @param index Index of child to be removed from the scene. + */ + public function removeChildAt(index : uint) : void + { + _sceneGraphRoot.removeChildAt(index); + } + + /** * Retrieves the child with the given index * @param index The index for the child to be retrieved. diff --git a/src/away3d/core/base/CompactSubGeometry.as b/src/away3d/core/base/CompactSubGeometry.as index 060480f6b..767d2cca9 100644 --- a/src/away3d/core/base/CompactSubGeometry.as +++ b/src/away3d/core/base/CompactSubGeometry.as @@ -55,6 +55,11 @@ package away3d.core.base var numVertices : int = _vertexData.length / 13; if (numVertices != _numVertices) disposeVertexBuffers(_vertexBuffer); _numVertices = numVertices; + + if (_numVertices == 0) + { + throw new Error("Bad data: geometry can't have zero triangles"); + } invalidateBuffers(_vertexDataInvalid); diff --git a/src/away3d/core/base/SubGeometryBase.as b/src/away3d/core/base/SubGeometryBase.as index e29e00217..b62ef3e14 100644 --- a/src/away3d/core/base/SubGeometryBase.as +++ b/src/away3d/core/base/SubGeometryBase.as @@ -673,6 +673,7 @@ package away3d.core.base vector.y = normals[i1]; vector.z = normals[i2]; vector = invTranspose.deltaTransformVector(vector); + vector.normalize(); normals[ni0] = vector.x; normals[i1] = vector.y; normals[i2] = vector.z; @@ -688,6 +689,7 @@ package away3d.core.base vector.y = tangents[i1]; vector.z = tangents[i2]; vector = invTranspose.deltaTransformVector(vector); + vector.normalize(); tangents[ti0] = vector.x; tangents[i1] = vector.y; tangents[i2] = vector.z; diff --git a/src/away3d/core/managers/Mouse3DManager.as b/src/away3d/core/managers/Mouse3DManager.as index eff186561..7110c7285 100644 --- a/src/away3d/core/managers/Mouse3DManager.as +++ b/src/away3d/core/managers/Mouse3DManager.as @@ -53,7 +53,6 @@ package away3d.core.managers public function updateCollider(view : View3D) : void { - _previousCollidingObject = _collidingObject; if (view == _activeView && (_forceMouseMove || _updateDirty)) { // If forceMouseMove is off, and no 2D mouse events dirtied the update, don't update either. _collidingObject = _mousePicker.getViewCollision(view.mouseX, view.mouseY, view); @@ -94,6 +93,8 @@ package away3d.core.managers dispatcher.dispatchEvent(event); } _queuedEvents.length = 0; + + _previousCollidingObject = _collidingObject; } // --------------------------------------------------------------------- diff --git a/src/away3d/loaders/parsers/OBJParser.as b/src/away3d/loaders/parsers/OBJParser.as index 644d7cb91..6682e7f6c 100644 --- a/src/away3d/loaders/parsers/OBJParser.as +++ b/src/away3d/loaders/parsers/OBJParser.as @@ -355,10 +355,12 @@ package away3d.loaders.parsers translateVertexData(face, j+1, vertices, uvs, indices, normals); } } - - subs = GeomUtil.fromVectors(vertices, indices, uvs, normals, null, null, null); - for (i=0; i 0) + { + subs = GeomUtil.fromVectors(vertices, indices, uvs, normals, null, null, null); + for (i=0; i