 		 * of the actual ray/geometry hit point.
 		 * @param hitUV An optional reference to a Point object to fill with the (u, v) texture coordinates
 		 * of the actual ray/geometry hit point.
+		 * @param hitNormal An optional reference to a Vector4 object to fill the normal of the intersection
+		 * point if any.
 		 * 
 		 * @return The triangle ID (the ID of the first index of the triangle in the IndexStream) that was
 		 * hit by the specified ray, -1 otherwise.

			
			var lambda			: Vector4		= new Vector4();
			
			for (var verticeIndex : uint = 0; verticeIndex < numVertices; verticeIndex += 3)
			{
				indicesData.position = verticeIndex * 2;
				
				xyzData.position = indicesData.readUnsignedShort() * xyzVertexSize + offset
				var v0X : Number = xyzData.readFloat();
				var v0Y : Number = xyzData.readFloat();
				var v0Z : Number = xyzData.readFloat();

				xyzData.position = indicesData.readUnsignedShort() * xyzVertexSize + offset;
				var v1X : Number = xyzData.readFloat();
				var v1Y : Number = xyzData.readFloat();
				var v1Z : Number = xyzData.readFloat();
				
				xyzData.position = indicesData.readUnsignedShort() * xyzVertexSize + offset;
				var v2X : Number = xyzData.readFloat();
				var v2Y : Number = xyzData.readFloat();
				var v2Z : Number = xyzData.readFloat();


				var edge1X : Number = v1X - v0X;
				var edge1Y : Number = v1Y - v0Y;
				var edge1Z : Number = v1Z - v0Z;
				
				var edge2X : Number = v2X - v0X;
				var edge2Y : Number = v2Y - v0Y;
				var edge2Z : Number = v2Z - v0Z;				
				
				// cross product
				var pvecX : Number = localDirectionY * edge2Z - edge2Y * localDirectionZ;

					if (uvStream != xyzStream)
						uvStream.unlock(false);
				}
				
				if (hitNormal)
				{
					// length
					var edge1Length		: Number	= Math.sqrt(edge1X * edge1X + edge1Y * edge1Y + edge1Z * edge1Z);
					var edge2Length		: Number	= Math.sqrt(edge2X * edge2X + edge2Y * edge2Y + edge2Z * edge2Z);
					
					// normalize
					edge1X /= edge1Length;
					edge1Y /= edge1Length;
					edge1Z /= edge1Length;
					edge2X /= edge2Length;
					edge2Y /= edge2Length;
					edge2Z /= edge2Length;
					
					// cross product
					hitNormal.x = edge1Y * edge2Z - edge1Z * edge2Y;
					hitNormal.y = edge1Z * edge2X - edge1X * edge2Z;
					hitNormal.z = edge1X * edge2Y - edge1Y * edge2X;
				}
			}
			
			_indexStream.unlock(false);
