Browse Source

Added Camera.ProjectToViewport and Camera.UnprojectFromViewport.

Mark Sibly 8 years ago
parent
commit
20076b7a5d

+ 26 - 0
modules/mojo3d/graphics/camera.monkey2

@@ -116,6 +116,32 @@ Class Camera Extends Entity
 		Return _projMatrix
 	End
 	
+	#rem monkeydoc Converts a point from world coordinates to viewport coordinates.
+	#end
+	Method ProjectToViewport:Vec2f( worldVertex:Vec3f )
+
+		Local clip_coords:=ProjectionMatrix * InverseMatrix * New Vec4f( worldVertex,1.0 )
+		
+		Local ndc_coords:=clip_coords.XY/clip_coords.w
+		
+		Local vp_coords:=Cast<Vec2f>( Viewport.Size ) * (ndc_coords * 0.5 + 0.5)
+	
+		Return vp_coords
+	End
+	
+	#rem monkeydoc Converts a point from viewport coordinates to world coordinates.
+	#end
+	Method UnprojectFromViewport:Vec3f( viewportCoords:Vec2f )
+	
+		Local vp_coords:=viewportCoords / Cast<Vec2f>( Viewport.Size ) * 2.0 - 1.0
+	
+		Local clip_coords:=New Mat4f( Matrix ) * -ProjectionMatrix * New Vec4f( vp_coords,-1.0,1.0 )
+		
+		Local world_coords:=clip_coords.XYZ/clip_coords.w
+		
+		Return world_coords
+	End
+	
 	Protected
 
 	#rem monkeydoc @hidden

+ 2 - 2
modules/mojo3d/graphics/shaders/skybox.glsl

@@ -11,7 +11,7 @@ void main(){
 
 	v_ClipPosition=a_Position * 2.0 - 1.0;
 
-	gl_Position=vec4( v_ClipPosition,0.0,1.0 );
+	gl_Position=vec4( v_ClipPosition,1.0,1.0 );
 }
 
 //@fragment
@@ -24,7 +24,7 @@ uniform mat4 r_InverseProjectionMatrix;
 
 void main(){
 
-	vec4 clip=r_InverseProjectionMatrix * vec4( v_ClipPosition,0.0,1.0 );
+	vec4 clip=r_InverseProjectionMatrix * vec4( v_ClipPosition,1.0,1.0 );
 
 	vec3 tv=r_EnvMatrix * (clip.xyz/clip.w);