Преглед изворни кода

Fixing position reconstruction for deferred shaders so it works properly on both OpenGL and DX11
Renamed some camera methods more accurately

BearishSun пре 9 година
родитељ
комит
85757f8d40

+ 12 - 12
BansheeEngine/Include/BsCCamera.h

@@ -145,8 +145,8 @@ namespace BansheeEngine
 		/** @copydoc Camera::worldToScreenPoint */
 		Vector2I worldToScreenPoint(const Vector3& worldPoint) const { updateView(); return mInternal->worldToScreenPoint(worldPoint); }
 
-		/** @copydoc Camera::worldToClipPoint */
-		Vector2 worldToClipPoint(const Vector3& worldPoint) const { updateView(); return mInternal->worldToClipPoint(worldPoint); }
+		/** @copydoc Camera::worldToNdcPoint */
+		Vector2 worldToNdcPoint(const Vector3& worldPoint) const { updateView(); return mInternal->worldToNdcPoint(worldPoint); }
 
 		/** @copydoc Camera::worldToViewPoint */
 		Vector3 worldToViewPoint(const Vector3& worldPoint) const { updateView(); return mInternal->worldToViewPoint(worldPoint); }
@@ -157,8 +157,8 @@ namespace BansheeEngine
 		/** @copydoc Camera::screenToViewPoint */
 		Vector3 screenToViewPoint(const Vector2I& screenPoint, float depth = 0.5f) const { return mInternal->screenToViewPoint(screenPoint, depth); }
 
-		/** @copydoc Camera::screenToClipPoint */
-		Vector2 screenToClipPoint(const Vector2I& screenPoint) const { return mInternal->screenToClipPoint(screenPoint); }
+		/** @copydoc Camera::screenToNdcPoint */
+		Vector2 screenToNdcPoint(const Vector2I& screenPoint) const { return mInternal->screenToNdcPoint(screenPoint); }
 
 		/** @copydoc Camera::viewToWorldPoint */
 		Vector3 viewToWorldPoint(const Vector3& viewPoint) const { updateView(); return mInternal->viewToWorldPoint(viewPoint); }
@@ -166,17 +166,17 @@ namespace BansheeEngine
 		/** @copydoc Camera::viewToScreenPoint */
 		Vector2I viewToScreenPoint(const Vector3& viewPoint) const { return mInternal->viewToScreenPoint(viewPoint); }
 
-		/** @copydoc Camera::viewToClipPoint */
-		Vector2 viewToClipPoint(const Vector3& viewPoint) const { return mInternal->viewToClipPoint(viewPoint); }
+		/** @copydoc Camera::viewToNdcPoint */
+		Vector2 viewToNdcPoint(const Vector3& viewPoint) const { return mInternal->viewToNdcPoint(viewPoint); }
 
-		/** @copydoc Camera::clipToWorldPoint */
-		Vector3 clipToWorldPoint(const Vector2& clipPoint, float depth = 0.5f) const { updateView(); return mInternal->clipToWorldPoint(clipPoint, depth); }
+		/** @copydoc Camera::NdcToWorldPoint */
+		Vector3 ndcToWorldPoint(const Vector2& ndcPoint, float depth = 0.5f) const { updateView(); return mInternal->ndcToWorldPoint(ndcPoint, depth); }
 
-		/** @copydoc Camera::clipToViewPoint */
-		Vector3 clipToViewPoint(const Vector2& clipPoint, float depth = 0.5f) const { return mInternal->clipToViewPoint(clipPoint, depth); }
+		/** @copydoc Camera::NdcToViewPoint */
+		Vector3 ndcToViewPoint(const Vector2& ndcPoint, float depth = 0.5f) const { return mInternal->ndcToViewPoint(ndcPoint, depth); }
 
-		/** @copydoc Camera::clipToScreenPoint */
-		Vector2I clipToScreenPoint(const Vector2& clipPoint) const { return mInternal->clipToScreenPoint(clipPoint); }
+		/** @copydoc Camera::NdcToScreenPoint */
+		Vector2I ndcToScreenPoint(const Vector2& ndcPoint) const { return mInternal->ndcToScreenPoint(ndcPoint); }
 
 		/** @copydoc Camera::screenPointToRay */
 		Ray screenPointToRay(const Vector2I& screenPoint) const { updateView(); return mInternal->screenPointToRay(screenPoint); }

+ 16 - 16
BansheeEngine/Include/BsCamera.h

@@ -305,8 +305,8 @@ namespace BansheeEngine
 		 */
 		Vector2I worldToScreenPoint(const Vector3& worldPoint) const;
 
-		/**	Converts a point in world space to normalized clip coordinates (in [0, 1] range). */
-		Vector2 worldToClipPoint(const Vector3& worldPoint) const;
+		/**	Converts a point in world space to normalized device coordinates (in [0, 1] range). */
+		Vector2 worldToNdcPoint(const Vector3& worldPoint) const;
 
 		/** Converts a point in world space to point relative to camera's coordinate system (view space). */
 		Vector3 worldToViewPoint(const Vector3& worldPoint) const;
@@ -333,9 +333,9 @@ namespace BansheeEngine
 
 		/**
 		 * Converts a point in screen space (pixels corresponding to render target attached to the camera) to normalized 
-		 * clip coordinates (in [0, 1] range).
+		 * device coordinates (in [0, 1] range).
 		 */
-		Vector2 screenToClipPoint(const Vector2I& screenPoint) const;
+		Vector2 screenToNdcPoint(const Vector2I& screenPoint) const;
 
 		/** Converts a point relative to camera's coordinate system (view space) into a point in world space. */
 		Vector3 viewToWorldPoint(const Vector3& viewPoint) const;
@@ -347,35 +347,35 @@ namespace BansheeEngine
 		Vector2I viewToScreenPoint(const Vector3& viewPoint) const;
 
 		/**
-		 * Converts a point relative to camera's coordinate system (view space) into normalized clip coordinates 
+		 * Converts a point relative to camera's coordinate system (view space) into normalized device coordinates 
 		 * (in [0, 1] range).
 		 */
-		Vector2 viewToClipPoint(const Vector3& viewPoint) const;
+		Vector2 viewToNdcPoint(const Vector3& viewPoint) const;
 
 		/**
-		 * Converts a point in normalized clip coordinates ([0, 1] range) to a point in world space.
+		 * Converts a point in normalized device coordinates ([0, 1] range) to a point in world space.
 		 *
-		 * @param[in]	clipPoint	Point to transform.
+		 * @param[in]	ndcPoint	Point to transform.
 		 * @param[in]	depth		Depth to place the world point at. The depth is applied to the vector going from camera
 		 *							origin to the point on the near plane.
 		 */
-		Vector3 clipToWorldPoint(const Vector2& clipPoint, float depth = 0.5f) const;
+		Vector3 ndcToWorldPoint(const Vector2& ndcPoint, float depth = 0.5f) const;
 
 		/**
-		 * Converts a point in normalized clip coordinates ([0, 1] range) to a point relative to camera's coordinate system
+		 * Converts a point in normalized device coordinates ([0, 1] range) to a point relative to camera's coordinate system
 		 * (view space).
 		 *
-		 * @param[in]	clipPoint	Point to transform.
+		 * @param[in]	ndcPoint	Point to transform.
 		 * @param[in]	depth		Depth to place the world point at. The depth is applied to the vector going from camera
 		 *							origin to the point on the near plane.
 		 */
-		Vector3 clipToViewPoint(const Vector2& clipPoint, float depth = 0.5f) const;
+		Vector3 ndcToViewPoint(const Vector2& ndcPoint, float depth = 0.5f) const;
 
 		/**
-		 * Converts a point in normalized clip coordinates ([0, 1] range) to a point in screen space (pixels corresponding
+		 * Converts a point in normalized device coordinates ([0, 1] range) to a point in screen space (pixels corresponding
 		 * to render target attached to the camera).
 		 */
-		Vector2I clipToScreenPoint(const Vector2& clipPoint) const;
+		Vector2I ndcToScreenPoint(const Vector2& ndcPoint) const;
 
 		/**
 		 * Converts a point in screen space (pixels corresponding to render target attached to the camera) to a ray in world
@@ -383,10 +383,10 @@ namespace BansheeEngine
 		 */
 		Ray screenPointToRay(const Vector2I& screenPoint) const;
 
-		/**	Projects a point from view to clip space. */
+		/**	Projects a point from view to normalized device space. */
 		Vector3 projectPoint(const Vector3& point) const;
 
-		/**	Un-projects a point in clip space to view space. */
+		/**	Un-projects a point in normalized device space to view space. */
 		Vector3 unprojectPoint(const Vector3& point) const;
 
         static const float INFINITE_FAR_PLANE_ADJUST; /**< Small constant used to reduce far plane projection to avoid inaccuracies. */

+ 26 - 26
BansheeEngine/Source/BsCamera.cpp

@@ -526,14 +526,14 @@ namespace BansheeEngine
 
 	Vector2I CameraBase::worldToScreenPoint(const Vector3& worldPoint) const
 	{
-		Vector2 clipPoint = worldToClipPoint(worldPoint);
-		return clipToScreenPoint(clipPoint);
+		Vector2 ndcPoint = worldToNdcPoint(worldPoint);
+		return ndcToScreenPoint(ndcPoint);
 	}
 
-	Vector2 CameraBase::worldToClipPoint(const Vector3& worldPoint) const
+	Vector2 CameraBase::worldToNdcPoint(const Vector3& worldPoint) const
 	{
 		Vector3 viewPoint = worldToViewPoint(worldPoint);
-		return viewToClipPoint(viewPoint);
+		return viewToNdcPoint(viewPoint);
 	}
 
 	Vector3 CameraBase::worldToViewPoint(const Vector3& worldPoint) const
@@ -543,25 +543,25 @@ namespace BansheeEngine
 
 	Vector3 CameraBase::screenToWorldPoint(const Vector2I& screenPoint, float depth) const
 	{
-		Vector2 clipPoint = screenToClipPoint(screenPoint);
-		return clipToWorldPoint(clipPoint, depth);
+		Vector2 ndcPoint = screenToNdcPoint(screenPoint);
+		return ndcToWorldPoint(ndcPoint, depth);
 	}
 
 	Vector3 CameraBase::screenToViewPoint(const Vector2I& screenPoint, float depth) const
 	{
-		Vector2 clipPoint = screenToClipPoint(screenPoint);
-		return clipToViewPoint(clipPoint, depth);
+		Vector2 ndcPoint = screenToNdcPoint(screenPoint);
+		return ndcToViewPoint(ndcPoint, depth);
 	}
 
-	Vector2 CameraBase::screenToClipPoint(const Vector2I& screenPoint) const
+	Vector2 CameraBase::screenToNdcPoint(const Vector2I& screenPoint) const
 	{
 		Rect2I viewport = getViewportRect();
 
-		Vector2 clipPoint;
-		clipPoint.x = (float)(((screenPoint.x - viewport.x) / (float)viewport.width) * 2.0f - 1.0f);
-		clipPoint.y = (float)((1.0f - ((screenPoint.y - viewport.y) / (float)viewport.height)) * 2.0f - 1.0f);
+		Vector2 ndcPoint;
+		ndcPoint.x = (float)(((screenPoint.x - viewport.x) / (float)viewport.width) * 2.0f - 1.0f);
+		ndcPoint.y = (float)((1.0f - ((screenPoint.y - viewport.y) / (float)viewport.height)) * 2.0f - 1.0f);
 
-		return clipPoint;
+		return ndcPoint;
 	}
 
 	Vector3 CameraBase::viewToWorldPoint(const Vector3& viewPoint) const
@@ -571,45 +571,45 @@ namespace BansheeEngine
 
 	Vector2I CameraBase::viewToScreenPoint(const Vector3& viewPoint) const
 	{
-		Vector2 clipPoint = viewToClipPoint(viewPoint);
-		return clipToScreenPoint(clipPoint);
+		Vector2 ndcPoint = viewToNdcPoint(viewPoint);
+		return ndcToScreenPoint(ndcPoint);
 	}
 
-	Vector2 CameraBase::viewToClipPoint(const Vector3& viewPoint) const
+	Vector2 CameraBase::viewToNdcPoint(const Vector3& viewPoint) const
 	{
 		Vector3 projPoint = projectPoint(viewPoint);
 
 		return Vector2(projPoint.x, projPoint.y);
 	}
 
-	Vector3 CameraBase::clipToWorldPoint(const Vector2& clipPoint, float depth) const
+	Vector3 CameraBase::ndcToWorldPoint(const Vector2& ndcPoint, float depth) const
 	{
-		Vector3 viewPoint = clipToViewPoint(clipPoint, depth);
+		Vector3 viewPoint = ndcToViewPoint(ndcPoint, depth);
 		return viewToWorldPoint(viewPoint);
 	}
 
-	Vector3 CameraBase::clipToViewPoint(const Vector2& clipPoint, float depth) const
+	Vector3 CameraBase::ndcToViewPoint(const Vector2& ndcPoint, float depth) const
 	{
-		return unprojectPoint(Vector3(clipPoint.x, clipPoint.y, depth));
+		return unprojectPoint(Vector3(ndcPoint.x, ndcPoint.y, depth));
 	}
 
-	Vector2I CameraBase::clipToScreenPoint(const Vector2& clipPoint) const
+	Vector2I CameraBase::ndcToScreenPoint(const Vector2& ndcPoint) const
 	{
 		Rect2I viewport = getViewportRect();
 
 		Vector2I screenPoint;
-		screenPoint.x = Math::roundToInt(viewport.x + ((clipPoint.x + 1.0f) * 0.5f) * viewport.width);
-		screenPoint.y = Math::roundToInt(viewport.y + (1.0f - (clipPoint.y + 1.0f) * 0.5f) * viewport.height);
+		screenPoint.x = Math::roundToInt(viewport.x + ((ndcPoint.x + 1.0f) * 0.5f) * viewport.width);
+		screenPoint.y = Math::roundToInt(viewport.y + (1.0f - (ndcPoint.y + 1.0f) * 0.5f) * viewport.height);
 
 		return screenPoint;
 	}
 
 	Ray CameraBase::screenPointToRay(const Vector2I& screenPoint) const
 	{
-		Vector2 clipPoint = screenToClipPoint(screenPoint);
+		Vector2 ndcPoint = screenToNdcPoint(screenPoint);
 
-		Vector3 near = unprojectPoint(Vector3(clipPoint.x, clipPoint.y, mNearDist));
-		Vector3 far = unprojectPoint(Vector3(clipPoint.x, clipPoint.y, mNearDist + 1.0f));
+		Vector3 near = unprojectPoint(Vector3(ndcPoint.x, ndcPoint.y, mNearDist));
+		Vector3 far = unprojectPoint(Vector3(ndcPoint.x, ndcPoint.y, mNearDist + 1.0f));
 
 		Ray ray(near, Vector3::normalize(far - near));
 		ray.transformAffine(getViewMatrix().inverseAffine());

+ 1 - 1
BansheePhysX/Include/BsPhysXMaterial.h

@@ -12,7 +12,7 @@ namespace BansheeEngine
 	 *  @{
 	 */
 
-	/** PhysX implementation of a PhysicsMesh. */
+	/** PhysX implementation of a PhysicsMaterial. */
 	class PhysXMaterial : public PhysicsMaterial
 	{
 	public:

+ 4 - 3
Doxyfile

@@ -780,7 +780,8 @@ INPUT                  = C:\Projects\BansheeEngineDev\BansheeEngine\BansheeUtili
                          BansheeCore/Include \
                          BansheeCore/Source \
                          BansheeEngine/Include \
-                         BansheeEngine/Source
+                         BansheeEngine/Source \
+                         Documentation/Manuals/Native
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
@@ -1442,7 +1443,7 @@ ECLIPSE_DOC_ID         = org.doxygen.Project
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
-DISABLE_INDEX          = YES
+DISABLE_INDEX          = NO
 
 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
 # structure should be generated to display hierarchical information. If the tag
@@ -1459,7 +1460,7 @@ DISABLE_INDEX          = YES
 # The default value is: NO.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
-GENERATE_TREEVIEW      = YES
+GENERATE_TREEVIEW      = NO
 
 # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
 # doxygen will group on one line in the generated HTML documentation.

+ 23 - 23
MBansheeEngine/Camera.cs

@@ -242,11 +242,11 @@ namespace BansheeEngine
         public Vector2I WorldToScreen(Vector3 value) { return native.WorldToScreen(value); }
 
         /// <summary>
-        /// Converts a point in world space to clip space coordinates.
+        /// Converts a point in world space to normalized device coordinates.
         /// </summary>
         /// <param name="value">3D point in world space.</param>
-        /// <returns>2D point in normalized coordinates ([0, 1] range), relative to the camera's viewport.</returns>
-        public Vector2 WorldToClip(Vector3 value) { return native.WorldToClip(value); }
+        /// <returns>2D point in normalized device coordinates ([0, 1] range), relative to the camera's viewport.</returns>
+        public Vector2 WorldToNDC(Vector3 value) { return native.WorldToNDC(value); }
 
         /// <summary>
         /// Converts a point in world space to view space coordinates.
@@ -274,11 +274,11 @@ namespace BansheeEngine
         public Vector3 ScreenToView(Vector2I value, float depth = 0.5f) { return native.ScreenToView(value, depth); }
 
         /// <summary>
-        /// Converts a point in screen space to a point in normalized clip space.
+        /// Converts a point in screen space to a point in normalized device coordinates.
         /// </summary>
         /// <param name="value">2D point on the render target attached to the camera, in pixels.</param>
-        /// <returns>2D point in normalized cliped space ([0, 1] range), relative to the camera's viewport.</returns>
-        public Vector2 ScreenToClip(Vector2I value) { return native.ScreenToClip(value); }
+        /// <returns>2D point in normalized device coordinates ([0, 1] range), relative to the camera's viewport.</returns>
+        public Vector2 ScreenToNDC(Vector2I value) { return native.ScreenToNDC(value); }
 
         /// <summary>
         /// Converts a point relative to camera's coordinate system (view space) into a point in world space.
@@ -295,38 +295,38 @@ namespace BansheeEngine
         public Vector2I ViewToScreen(Vector3 value) { return native.ViewToScreen(value); }
 
         /// <summary>
-        /// Converts a point relative to camera's coordinate system (view space) to normalized clip space.
+        /// Converts a point relative to camera's coordinate system (view space) to normalized device coordinates.
         /// </summary>
         /// <param name="value">3D point in view space.</param>
-        /// <returns>2D point in normalized cliped space ([0, 1] range), relative to the camera's viewport.</returns>
-        public Vector2 ViewToClip(Vector3 value) { return native.ViewToClip(value); }
+        /// <returns>2D point in normalized device coordinates ([0, 1] range), relative to the camera's viewport.</returns>
+        public Vector2 ViewToNDC(Vector3 value) { return native.ViewToNDC(value); }
 
         /// <summary>
-        /// Converts a point relative to camera's viewport in normalized clip space ([0, 1] range) into a point in 
+        /// Converts a point relative to camera's viewport in normalized device coordinates ([0, 1] range) into a point in 
         /// world space.
         /// </summary>
-        /// <param name="value">2D point in normalized clip space.</param>
+        /// <param name="value">2D point in normalized device coordinates.</param>
         /// <param name="depth">Depth at which place the world point at. The depth is applied to the vector going from
         ///                     camera origin to the point on the near plane.</param>
         /// <returns>3D point in world space.</returns>
-        public Vector3 ClipToWorld(Vector2 value, float depth = 0.5f) { return native.ClipToWorld(value, depth); }
+        public Vector3 NDCToWorld(Vector2 value, float depth = 0.5f) { return native.NDCToWorld(value, depth); }
 
         /// <summary>
-        /// Converts a point relative to camera's viewport in normalized clip space ([0, 1] range) into a point in 
+        /// Converts a point relative to camera's viewport in normalized device coordinates ([0, 1] range) into a point in 
         /// view space.
         /// </summary>
-        /// <param name="value">2D point in normalized clip space.</param>
+        /// <param name="value">2D point in normalized device coordinates.</param>
         /// <param name="depth">Depth at which place the world point at. The depth is applied to the vector going from
         ///                     camera origin to the point on the near plane.</param>
         /// <returns>3D point in view space.</returns>
-        public Vector3 ClipToView(Vector2 value, float depth = 0.5f) { return native.ClipToView(value, depth); }
+        public Vector3 NDCToView(Vector2 value, float depth = 0.5f) { return native.NDCToView(value, depth); }
 
         /// <summary>
-        /// Converts a point relative to camera's viewport in normalized clip space ([0, 1] range) to screen space.
+        /// Converts a point relative to camera's viewport in normalized device coordinates ([0, 1] range) to screen space.
         /// </summary>
-        /// <param name="value">2D point in normalized clip space.</param>
+        /// <param name="value">2D point in normalized device coordinates.</param>
         /// <returns>2D point on the render target attached to the camera, in pixels.</returns>
-        public Vector2I ClipToScreen(Vector2 value) { return native.ClipToScreen(value); }
+        public Vector2I NDCToScreen(Vector2 value) { return native.NDCToScreen(value); }
 
         /// <summary>
         /// Converts a point in screen space in a ray in world space.
@@ -337,18 +337,18 @@ namespace BansheeEngine
         public Ray ScreenToWorldRay(Vector2I value) { return native.ScreenToWorldRay(value); }
 
         /// <summary>
-        /// Projects a point in view space to a point in clip space. Similar to <see cref="ViewToClip"/> but preserves
-        /// the depth component.
+        /// Projects a point in view space to a point in normalized device coordinates. Similar to <see cref="ViewToNDC"/> 
+        /// but preserves the depth component.
         /// </summary>
         /// <param name="value">3D point in view space.</param>
-        /// <returns>3D point in normalized cliped space ([0, 1] range), relative to the camera's viewport. Z value
+        /// <returns>3D point in normalized device coordinates ([0, 1] range), relative to the camera's viewport. Z value
         ///          range depends on active render API.</returns>
         public Vector3 ProjectPoint(Vector3 value) { return native.ProjectPoint(value); }
 
         /// <summary>
-        /// Un-rpojects a point in clip space to a point in view space.
+        /// Un-rpojects a point in normalized device coordinates to a point in view space.
         /// </summary>
-        /// <param name="value">3D point in normalized cliped space ([0, 1] range), relative to the camera's viewport. 
+        /// <param name="value">3D point in normalized device coordinates ([0, 1] range), relative to the camera's viewport. 
         ///                     Z value range depends on active render API.</param>
         /// <returns>3D point in view space.</returns>
         public Vector3 UnprojectPoint(Vector3 value) { return native.UnprojectPoint(value); }

+ 18 - 18
MBansheeEngine/NativeCamera.cs

@@ -213,10 +213,10 @@ namespace BansheeEngine
             return output;
         }
 
-        internal Vector2 WorldToClip(Vector3 value)
+        internal Vector2 WorldToNDC(Vector3 value)
         {
             Vector2 output;
-            Internal_WorldToClip(mCachedPtr, ref value, out output);
+            Internal_WorldToNDC(mCachedPtr, ref value, out output);
             return output;
         }
 
@@ -241,10 +241,10 @@ namespace BansheeEngine
             return output;
         }
 
-        internal Vector2 ScreenToClip(Vector2I value)
+        internal Vector2 ScreenToNDC(Vector2I value)
         {
             Vector2 output;
-            Internal_ScreenToClip(mCachedPtr, ref value, out output);
+            Internal_ScreenToNDC(mCachedPtr, ref value, out output);
             return output;
         }
 
@@ -262,31 +262,31 @@ namespace BansheeEngine
             return output;
         }
 
-        internal Vector2 ViewToClip(Vector3 value)
+        internal Vector2 ViewToNDC(Vector3 value)
         {
             Vector2 output;
-            Internal_ViewToClip(mCachedPtr, ref value, out output);
+            Internal_ViewToNDC(mCachedPtr, ref value, out output);
             return output;
         }
 
-        internal Vector3 ClipToWorld(Vector2 value, float depth)
+        internal Vector3 NDCToWorld(Vector2 value, float depth)
         {
             Vector3 output;
-            Internal_ClipToWorld(mCachedPtr, ref value, depth, out output);
+            Internal_NDCToWorld(mCachedPtr, ref value, depth, out output);
             return output;
         }
 
-        internal Vector3 ClipToView(Vector2 value, float depth)
+        internal Vector3 NDCToView(Vector2 value, float depth)
         {
             Vector3 output;
-            Internal_ClipToView(mCachedPtr, ref value, depth, out output);
+            Internal_NDCToView(mCachedPtr, ref value, depth, out output);
             return output;
         }
 
-        internal Vector2I ClipToScreen(Vector2 value)
+        internal Vector2I NDCToScreen(Vector2 value)
         {
             Vector2I output;
-            Internal_ClipToScreen(mCachedPtr, ref value, out output);
+            Internal_NDCToScreen(mCachedPtr, ref value, out output);
             return output;
         }
 
@@ -421,7 +421,7 @@ namespace BansheeEngine
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_WorldToScreen(IntPtr instance, ref Vector3 value, out Vector2I output);
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private static extern void Internal_WorldToClip(IntPtr instance, ref Vector3 value, out Vector2 output);
+        private static extern void Internal_WorldToNDC(IntPtr instance, ref Vector3 value, out Vector2 output);
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_WorldToView(IntPtr instance, ref Vector3 value, out Vector3 output);
 
@@ -430,21 +430,21 @@ namespace BansheeEngine
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_ScreenToView(IntPtr instance, ref Vector2I value, float depth, out Vector3 output);
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private static extern void Internal_ScreenToClip(IntPtr instance, ref Vector2I value, out Vector2 output);
+        private static extern void Internal_ScreenToNDC(IntPtr instance, ref Vector2I value, out Vector2 output);
 
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_ViewToWorld(IntPtr instance, ref Vector3 value, out Vector3 output);
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_ViewToScreen(IntPtr instance, ref Vector3 value, out Vector2I output);
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private static extern void Internal_ViewToClip(IntPtr instance, ref Vector3 value, out Vector2 output);
+        private static extern void Internal_ViewToNDC(IntPtr instance, ref Vector3 value, out Vector2 output);
 
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private static extern void Internal_ClipToWorld(IntPtr instance, ref Vector2 value, float depth, out Vector3 output);
+        private static extern void Internal_NDCToWorld(IntPtr instance, ref Vector2 value, float depth, out Vector3 output);
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private static extern void Internal_ClipToView(IntPtr instance, ref Vector2 value, float depth, out Vector3 output);
+        private static extern void Internal_NDCToView(IntPtr instance, ref Vector2 value, float depth, out Vector3 output);
         [MethodImpl(MethodImplOptions.InternalCall)]
-        private static extern void Internal_ClipToScreen(IntPtr instance, ref Vector2 value, out Vector2I output);
+        private static extern void Internal_NDCToScreen(IntPtr instance, ref Vector2 value, out Vector2I output);
 
         [MethodImpl(MethodImplOptions.InternalCall)]
         private static extern void Internal_ScreenToWorldRay(IntPtr instance, ref Vector2I value, out Ray output);

+ 3 - 2
RenderBeast/Include/BsRenderBeast.h

@@ -50,6 +50,7 @@ namespace BansheeEngine
 		Matrix4 viewProj;
 		Matrix4 invProj;
 		Matrix4 invViewProj;
+		Matrix4 screenToWorld;
 		Vector2 deviceZToWorldZ;
 		Vector4 clipToUVScaleOffset;
 	};
@@ -202,9 +203,9 @@ namespace BansheeEngine
 		 * 			
 		 * @param[in]	projMatrix	Projection matrix that was used to create the device Z value to transform.
 		 * @return					Returns two values that can be used to transform device z to world z using this formula:
-		 * 							z = deviceZ * x - y.
+		 * 							z = (deviceZ + y) * x.
 		 */
-		static Vector2 getDeviceZTransform();
+		static Vector2 getDeviceZTransform(const Matrix4& projMatrix);
 
 		/**
 		 * Populates the provided camera shader data object with data from the provided camera. The object can then be used

+ 1 - 0
RenderBeast/Include/BsStaticRenderableHandler.h

@@ -24,6 +24,7 @@ namespace BansheeEngine
 		BS_PARAM_BLOCK_ENTRY(Matrix4, gMatProj)
 		BS_PARAM_BLOCK_ENTRY(Matrix4, gMatInvProj)
 		BS_PARAM_BLOCK_ENTRY(Matrix4, gMatInvViewProj)
+		BS_PARAM_BLOCK_ENTRY(Matrix4, gMatScreenToWorld)
 		BS_PARAM_BLOCK_ENTRY(Vector2, gDeviceZToWorldZ)
 		BS_PARAM_BLOCK_ENTRY(Vector4, gClipToUVScaleOffset)
 	BS_PARAM_BLOCK_END

+ 45 - 6
RenderBeast/Source/BsRenderBeast.cpp

@@ -797,13 +797,39 @@ namespace BansheeEngine
 		cameraData.transparentQueue->sort();
 	}
 
-	Vector2 RenderBeast::getDeviceZTransform()
+	Vector2 RenderBeast::getDeviceZTransform(const Matrix4& projMatrix)
 	{
+		// Returns a set of values that will transform depth buffer values (e.g. [0, 1] in DX, [-1, 1] in GL) to a distance
+		// in world space. This involes applying the inverse projection transform to the depth value. When you multiply
+		// a vector with the projection matrix you get [clipX, clipY, Az + B, C * z], where we don't care about clipX/clipY.
+		// A is [2, 2], B is [2, 3] and C is [3, 2] elements of the projection matrix (only ones that matter for our depth 
+		// value). The hardware will also automatically divide the z value with w to get the depth, therefore the final 
+		// formula is:
+		// depth = (Az + B) / (C * z)
+
+		// To get the z coordinate back we simply do the opposite: 
+		// z = B / (depth * C - A)
+
+		// However some APIs will also do a transformation on the depth values before storing them to the texture 
+		// (e.g. OpenGL will transform from [-1, 1] to [0, 1]). And we need to reverse that as well. Therefore the final 
+		// formula is:
+		// z = B / ((depth * (maxDepth - minDepth) + minDepth) * C - A)
+
+		// Are we reorganize it because it needs to fit the "(1.0f / (depth + y)) * x" format used in the shader:
+		// z = 1.0f / (depth + minDepth/(maxDepth - minDepth) - A/((maxDepth - minDepth) * C)) * B/((maxDepth - minDepth) * C)
+
 		RenderAPICore& rapi = RenderAPICore::instance();
 
+		float depthRange = rapi.getMaximumDepthInputValue() - rapi.getMinimumDepthInputValue();
+		float minDepth = rapi.getMinimumDepthInputValue();
+
+		float a = projMatrix[2][2];
+		float b = projMatrix[2][3];
+		float c = projMatrix[3][2];
+
 		Vector2 output;
-		output.x = 1.0f / (rapi.getMaximumDepthInputValue() - rapi.getMinimumDepthInputValue());
-		output.y = -rapi.getMinimumDepthInputValue() * output.x;
+		output.x = b / (depthRange * c);
+		output.y = minDepth / depthRange - a / (depthRange * c);
 
 		return output;
 	}
@@ -815,10 +841,23 @@ namespace BansheeEngine
 		data.view = camera.getViewMatrix();
 		data.viewProj = data.proj * data.view;
 		data.invProj = data.proj.inverse();
-		data.invViewProj = data.viewProj.inverse();
+		data.invViewProj = data.viewProj.inverse(); // Note: Calculate inverses separately (better precision possibly)
+
+		// Construct a special inverse view-projection matrix that had projection entries that affect z and w eliminated.
+		// Used to transform a vector(clip_x, clip_y, view_z, view_w), where clip_x/clip_y are in clip space, and 
+		// view_z/view_w in view space, into world space.
+
+		// Only projects z/w coordinates
+		Matrix4 projZ = Matrix4::IDENTITY;
+		projZ[2][2] = data.proj[2][2];
+		projZ[2][3] = data.proj[2][3];
+		projZ[3][2] = data.proj[3][2];
+		projZ[3][3] = 0.0f;
+
+		data.screenToWorld = data.invViewProj * projZ;
 		data.viewDir = camera.getForward();
 		data.viewOrigin = camera.getPosition();
-		data.deviceZToWorldZ = getDeviceZTransform();
+		data.deviceZToWorldZ = getDeviceZTransform(data.proj);
 
 		SPtr<ViewportCore> viewport = camera.getViewport();
 		SPtr<RenderTargetCore> rt = viewport->getTarget();
@@ -832,7 +871,7 @@ namespace BansheeEngine
 		RenderAPICore& rapi = RenderAPICore::instance();
 
 		data.clipToUVScaleOffset.x = halfWidth / rtWidth;
-		data.clipToUVScaleOffset.y = -halfHeight / rtHeight;
+		data.clipToUVScaleOffset.y = halfHeight / rtHeight; // TODO - Negate for DX11
 		data.clipToUVScaleOffset.z = viewport->getX() / rtWidth + (halfWidth + rapi.getHorizontalTexelOffset()) / rtWidth;
 		data.clipToUVScaleOffset.w = viewport->getY() / rtHeight + (halfHeight + rapi.getVerticalTexelOffset()) / rtHeight;
 

+ 1 - 0
RenderBeast/Source/BsStaticRenderableHandler.cpp

@@ -120,6 +120,7 @@ namespace BansheeEngine
 		mPerCameraParams.gMatViewProj.set(cameraData.viewProj);
 		mPerCameraParams.gMatInvProj.set(cameraData.invProj);
 		mPerCameraParams.gMatInvViewProj.set(cameraData.invViewProj);
+		mPerCameraParams.gMatScreenToWorld.set(cameraData.screenToWorld);
 		mPerCameraParams.gDeviceZToWorldZ.set(cameraData.deviceZToWorldZ);
 		mPerCameraParams.gClipToUVScaleOffset.set(cameraData.clipToUVScaleOffset);
 	}

+ 6 - 6
SBansheeEngine/Include/BsScriptCamera.h

@@ -106,20 +106,20 @@ namespace BansheeEngine
 		static int internal_GetHeightPixels(ScriptCamera* instance);
 
 		static void internal_WorldToScreen(ScriptCamera* instance, Vector3* value, Vector2I* output);
-		static void internal_WorldToClip(ScriptCamera* instance, Vector3* value, Vector2* output);
+		static void internal_WorldToNDC(ScriptCamera* instance, Vector3* value, Vector2* output);
 		static void internal_WorldToView(ScriptCamera* instance, Vector3* value, Vector3* output);
 
 		static void internal_ScreenToWorld(ScriptCamera* instance, Vector2I* value, float depth, Vector3* output);
 		static void internal_ScreenToView(ScriptCamera* instance, Vector2I* value, float depth, Vector3* output);
-		static void internal_ScreenToClip(ScriptCamera* instance, Vector2I* value, Vector2* output);
+		static void internal_ScreenToNDC(ScriptCamera* instance, Vector2I* value, Vector2* output);
 
 		static void internal_ViewToWorld(ScriptCamera* instance, Vector3* value, Vector3* output);
 		static void internal_ViewToScreen(ScriptCamera* instance, Vector3* value, Vector2I* output);
-		static void internal_ViewToClip(ScriptCamera* instance, Vector3* value, Vector2* output);
+		static void internal_ViewToNDC(ScriptCamera* instance, Vector3* value, Vector2* output);
 
-		static void internal_ClipToWorld(ScriptCamera* instance, Vector2* value, float depth, Vector3* output);
-		static void internal_ClipToView(ScriptCamera* instance, Vector2* value, float depth, Vector3* output);
-		static void internal_ClipToScreen(ScriptCamera* instance, Vector2* value, Vector2I* output);
+		static void internal_NDCToWorld(ScriptCamera* instance, Vector2* value, float depth, Vector3* output);
+		static void internal_NDCToView(ScriptCamera* instance, Vector2* value, float depth, Vector3* output);
+		static void internal_NDCToScreen(ScriptCamera* instance, Vector2* value, Vector2I* output);
 
 		static void internal_ScreenToWorldRay(ScriptCamera* instance, Vector2I* value, Ray* output);
 		static void internal_ProjectPoint(ScriptCamera* instance, Vector3* value, Vector3* output);

+ 18 - 18
SBansheeEngine/Source/BsScriptCamera.cpp

@@ -81,20 +81,20 @@ namespace BansheeEngine
 		metaData.scriptClass->addInternalCall("Internal_GetHeightPixels", &ScriptCamera::internal_GetHeightPixels);
 
 		metaData.scriptClass->addInternalCall("Internal_WorldToScreen", &ScriptCamera::internal_WorldToScreen);
-		metaData.scriptClass->addInternalCall("Internal_WorldToClip", &ScriptCamera::internal_WorldToClip);
+		metaData.scriptClass->addInternalCall("Internal_WorldToNDC", &ScriptCamera::internal_WorldToNDC);
 		metaData.scriptClass->addInternalCall("Internal_WorldToView", &ScriptCamera::internal_WorldToView);
 
 		metaData.scriptClass->addInternalCall("Internal_ScreenToWorld", &ScriptCamera::internal_ScreenToWorld);
 		metaData.scriptClass->addInternalCall("Internal_ScreenToView", &ScriptCamera::internal_ScreenToView);
-		metaData.scriptClass->addInternalCall("Internal_ScreenToClip", &ScriptCamera::internal_ScreenToClip);
+		metaData.scriptClass->addInternalCall("Internal_ScreenToNDC", &ScriptCamera::internal_ScreenToNDC);
 
 		metaData.scriptClass->addInternalCall("Internal_ViewToWorld", &ScriptCamera::internal_ViewToWorld);
 		metaData.scriptClass->addInternalCall("Internal_ViewToScreen", &ScriptCamera::internal_ViewToScreen);
-		metaData.scriptClass->addInternalCall("Internal_ViewToClip", &ScriptCamera::internal_ViewToClip);
+		metaData.scriptClass->addInternalCall("Internal_ViewToNDC", &ScriptCamera::internal_ViewToNDC);
 
-		metaData.scriptClass->addInternalCall("Internal_ClipToWorld", &ScriptCamera::internal_ClipToWorld);
-		metaData.scriptClass->addInternalCall("Internal_ClipToView", &ScriptCamera::internal_ClipToView);
-		metaData.scriptClass->addInternalCall("Internal_ClipToScreen", &ScriptCamera::internal_ClipToScreen);
+		metaData.scriptClass->addInternalCall("Internal_NDCToWorld", &ScriptCamera::internal_NDCToWorld);
+		metaData.scriptClass->addInternalCall("Internal_NDCToView", &ScriptCamera::internal_NDCToView);
+		metaData.scriptClass->addInternalCall("Internal_NDCToScreen", &ScriptCamera::internal_NDCToScreen);
 
 		metaData.scriptClass->addInternalCall("Internal_ScreenToWorldRay", &ScriptCamera::internal_ScreenToWorldRay);
 		metaData.scriptClass->addInternalCall("Internal_ProjectPoint", &ScriptCamera::internal_ProjectPoint);
@@ -325,9 +325,9 @@ namespace BansheeEngine
 		*output = instance->mCamera->worldToScreenPoint(*value);
 	}
 
-	void ScriptCamera::internal_WorldToClip(ScriptCamera* instance, Vector3* value, Vector2* output)
+	void ScriptCamera::internal_WorldToNDC(ScriptCamera* instance, Vector3* value, Vector2* output)
 	{
-		*output = instance->mCamera->worldToClipPoint(*value);
+		*output = instance->mCamera->worldToNdcPoint(*value);
 	}
 
 	void ScriptCamera::internal_WorldToView(ScriptCamera* instance, Vector3* value, Vector3* output)
@@ -345,9 +345,9 @@ namespace BansheeEngine
 		*output = instance->mCamera->screenToViewPoint(*value, depth);
 	}
 
-	void ScriptCamera::internal_ScreenToClip(ScriptCamera* instance, Vector2I* value, Vector2* output)
+	void ScriptCamera::internal_ScreenToNDC(ScriptCamera* instance, Vector2I* value, Vector2* output)
 	{
-		*output = instance->mCamera->screenToClipPoint(*value);
+		*output = instance->mCamera->screenToNdcPoint(*value);
 	}
 
 	void ScriptCamera::internal_ViewToWorld(ScriptCamera* instance, Vector3* value, Vector3* output)
@@ -360,24 +360,24 @@ namespace BansheeEngine
 		*output = instance->mCamera->viewToScreenPoint(*value);
 	}
 
-	void ScriptCamera::internal_ViewToClip(ScriptCamera* instance, Vector3* value, Vector2* output)
+	void ScriptCamera::internal_ViewToNDC(ScriptCamera* instance, Vector3* value, Vector2* output)
 	{
-		*output = instance->mCamera->viewToClipPoint(*value);
+		*output = instance->mCamera->viewToNdcPoint(*value);
 	}
 
-	void ScriptCamera::internal_ClipToWorld(ScriptCamera* instance, Vector2* value, float depth, Vector3* output)
+	void ScriptCamera::internal_NDCToWorld(ScriptCamera* instance, Vector2* value, float depth, Vector3* output)
 	{
-		*output = instance->mCamera->clipToWorldPoint(*value, depth);
+		*output = instance->mCamera->ndcToWorldPoint(*value, depth);
 	}
 
-	void ScriptCamera::internal_ClipToView(ScriptCamera* instance, Vector2* value, float depth, Vector3* output)
+	void ScriptCamera::internal_NDCToView(ScriptCamera* instance, Vector2* value, float depth, Vector3* output)
 	{
-		*output = instance->mCamera->clipToViewPoint(*value, depth);
+		*output = instance->mCamera->ndcToViewPoint(*value, depth);
 	}
 
-	void ScriptCamera::internal_ClipToScreen(ScriptCamera* instance, Vector2* value, Vector2I* output)
+	void ScriptCamera::internal_NDCToScreen(ScriptCamera* instance, Vector2* value, Vector2I* output)
 	{
-		*output = instance->mCamera->clipToScreenPoint(*value);
+		*output = instance->mCamera->ndcToScreenPoint(*value);
 	}
 
 	void ScriptCamera::internal_ScreenToWorldRay(ScriptCamera* instance, Vector2I* value, Ray* output)