Browse Source

Fixed projectRayFrom2DCoordinate to support multiple cameras. Added getProjectionMatrix to Camera

Ivan Safrin 12 years ago
parent
commit
dc7a54d3ff

+ 4 - 1
Core/Contents/Include/PolyCamera.h

@@ -111,6 +111,8 @@ namespace Polycode {
 			bool hasFilterShader();
 			bool hasFilterShader();
 			void drawFilter(Texture *targetTexture = NULL, Number targetTextureWidth = 0.0, Number targetTextureHeight = 0.0, Texture *targetColorTexture = NULL, Texture *targetZTexture = NULL);
 			void drawFilter(Texture *targetTexture = NULL, Number targetTextureWidth = 0.0, Number targetTextureHeight = 0.0, Texture *targetColorTexture = NULL, Texture *targetZTexture = NULL);
 			
 			
+			Matrix4 getProjectionMatrix() const;
+			
 			/**
 			/**
 			* Sets the exposure for the camera. The exposure value can be passed to a shader for HDR rendering.
 			* Sets the exposure for the camera. The exposure value can be passed to a shader for HDR rendering.
 			* @param level The new exposure value.
 			* @param level The new exposure value.
@@ -156,12 +158,13 @@ namespace Polycode {
 			bool frustumCulling;
 			bool frustumCulling;
 		
 		
 			/**
 			/**
-			/* Shifts camera frustum by factor of the frustum size. (x=-1 will shift the frustum to the left by a whole screen width).
+			* Shifts camera frustum by factor of the frustum size. (x=-1 will shift the frustum to the left by a whole screen width).
 			*/
 			*/
 			Vector2 cameraShift;
 			Vector2 cameraShift;
 					
 					
 		protected:
 		protected:
 		
 		
+			Matrix4 projectionMatrix;
 					
 					
 			Number orthoSizeX;
 			Number orthoSizeX;
 			Number orthoSizeY;
 			Number orthoSizeY;

+ 1 - 1
Core/Contents/Include/PolyGLRenderer.h

@@ -153,7 +153,7 @@ namespace Polycode {
 		void enableScissor(bool val);
 		void enableScissor(bool val);
 		void setScissorBox(Polycode::Rectangle box);		
 		void setScissorBox(Polycode::Rectangle box);		
 		
 		
-		Vector3 projectRayFrom2DCoordinate(Number x, Number y);
+		Vector3 projectRayFrom2DCoordinate(Number x, Number y, Matrix4 cameraMatrix, Matrix4 projectionMatrix);
 		
 		
 		void setLineSize(Number lineSize);
 		void setLineSize(Number lineSize);
 		
 		

+ 2 - 2
Core/Contents/Include/PolyRenderer.h

@@ -243,7 +243,7 @@ namespace Polycode {
 		
 		
 		bool rayTriangleIntersect(Vector3 ray_origin, Vector3 ray_direction, Vector3 vert0, Vector3 vert1, Vector3 vert2, Vector3 *hitPoint);
 		bool rayTriangleIntersect(Vector3 ray_origin, Vector3 ray_direction, Vector3 vert0, Vector3 vert1, Vector3 vert2, Vector3 *hitPoint);
 		
 		
-		virtual Vector3 projectRayFrom2DCoordinate(Number x, Number y) = 0;
+		virtual Vector3 projectRayFrom2DCoordinate(Number x, Number y, Matrix4 cameraMatrix, Matrix4 projectionMatrix) = 0;
 		
 		
 		void enableShaders(bool flag);
 		void enableShaders(bool flag);
 		
 		
@@ -257,7 +257,7 @@ namespace Polycode {
 		
 		
 		void addShaderModule(PolycodeShaderModule *module);
 		void addShaderModule(PolycodeShaderModule *module);
 		
 		
-		virtual bool test2DCoordinateInPolygon(Number x, Number y, Polygon *poly, const Matrix4 &matrix, bool ortho, bool testBackfacing, bool billboardMode, bool reverseDirection = false, Matrix4 *adjustMatrix = NULL);
+		virtual bool test2DCoordinateInPolygon(Number x, Number y, Matrix4 cameraMatrix, Matrix4 projectionMatrix, Polygon *poly, const Matrix4 &matrix, bool ortho, bool testBackfacing, bool billboardMode, bool reverseDirection = false, Matrix4 *adjustMatrix = NULL);
 		
 		
 		virtual Matrix4 getProjectionMatrix() = 0;
 		virtual Matrix4 getProjectionMatrix() = 0;
 		virtual Matrix4 getModelviewMatrix() = 0;
 		virtual Matrix4 getModelviewMatrix() = 0;

+ 7 - 2
Core/Contents/Source/PolyCamera.cpp

@@ -375,15 +375,20 @@ void Camera::drawFilter(Texture *targetTexture, Number targetTextureWidth, Numbe
 	}
 	}
 }
 }
 
 
+Matrix4 Camera::getProjectionMatrix() const {
+	return projectionMatrix;
+}
+
 void Camera::doCameraTransform() {
 void Camera::doCameraTransform() {
 	Renderer *renderer = CoreServices::getInstance()->getRenderer();
 	Renderer *renderer = CoreServices::getInstance()->getRenderer();
 	if(!orthoMode) {
 	if(!orthoMode) {
 		renderer->setViewportShift(cameraShift.x, cameraShift.y);
 		renderer->setViewportShift(cameraShift.x, cameraShift.y);
 		renderer->setFOV(fov);
 		renderer->setFOV(fov);
-	}
-	
+	}	
 	renderer->setExposureLevel(exposureLevel);	
 	renderer->setExposureLevel(exposureLevel);	
 	
 	
+	projectionMatrix = renderer->getProjectionMatrix();
+	
 	if(matrixDirty) {
 	if(matrixDirty) {
 		rebuildTransformMatrix();
 		rebuildTransformMatrix();
 	}
 	}

+ 8 - 3
Core/Contents/Source/PolyGLRenderer.cpp

@@ -259,7 +259,7 @@ Vector3 OpenGLRenderer::Unproject(Number x, Number y) {
 	
 	
 }
 }
 
 
-Vector3 OpenGLRenderer::projectRayFrom2DCoordinate(Number x, Number y) {
+Vector3 OpenGLRenderer::projectRayFrom2DCoordinate(Number x, Number y, Matrix4 cameraMatrix, Matrix4 projectionMatrix) {
 	GLdouble nearPlane[3],farPlane[3];
 	GLdouble nearPlane[3],farPlane[3];
 	
 	
 	GLdouble mv[16];
 	GLdouble mv[16];
@@ -275,8 +275,13 @@ Vector3 OpenGLRenderer::projectRayFrom2DCoordinate(Number x, Number y) {
 	GLint vp[4];
 	GLint vp[4];
 	glGetIntegerv( GL_VIEWPORT, vp );
 	glGetIntegerv( GL_VIEWPORT, vp );
 	
 	
-	gluUnProject(x, yRes - y, 0.0, mv, sceneProjectionMatrix, vp,  &nearPlane[0], &nearPlane[1], &nearPlane[2]);
-	gluUnProject(x, yRes - y, 1.0, mv, sceneProjectionMatrix, vp,  &farPlane[0], &farPlane[1], &farPlane[2]);
+	GLdouble _sceneProjectionMatrix[16];
+	for(int i=0; i < 16; i++) {
+		_sceneProjectionMatrix[i] = projectionMatrix.ml[i];
+	}	
+	
+	gluUnProject(x, yRes - y, 0.0, mv, _sceneProjectionMatrix, vp,  &nearPlane[0], &nearPlane[1], &nearPlane[2]);
+	gluUnProject(x, yRes - y, 1.0, mv, _sceneProjectionMatrix, vp,  &farPlane[0], &farPlane[1], &farPlane[2]);
 	
 	
 	Vector3 nearVec(nearPlane[0], nearPlane[1], nearPlane[2]);
 	Vector3 nearVec(nearPlane[0], nearPlane[1], nearPlane[2]);
 	Vector3 farVec(farPlane[0], farPlane[1], farPlane[2]);
 	Vector3 farVec(farPlane[0], farPlane[1], farPlane[2]);

+ 2 - 2
Core/Contents/Source/PolyRenderer.cpp

@@ -84,7 +84,7 @@ void Renderer::setExposureLevel(Number level) {
 }
 }
 
 
 
 
-bool Renderer::test2DCoordinateInPolygon(Number x, Number y, Polycode::Polygon *poly, const Matrix4 &matrix, bool ortho, bool testBackfacing, bool billboardMode, bool reverseDirection, Matrix4 *adjustMatrix) {
+bool Renderer::test2DCoordinateInPolygon(Number x, Number y, Matrix4 cameraMatrix, Matrix4 projectionMatrix, Polycode::Polygon *poly, const Matrix4 &matrix, bool ortho, bool testBackfacing, bool billboardMode, bool reverseDirection, Matrix4 *adjustMatrix) {
 
 
 	Vector3 dirVec;
 	Vector3 dirVec;
 	Vector3 origin;
 	Vector3 origin;
@@ -96,7 +96,7 @@ bool Renderer::test2DCoordinateInPolygon(Number x, Number y, Polycode::Polygon *
 		dirVec = Vector3(0.0, 0.0, -1.0);
 		dirVec = Vector3(0.0, 0.0, -1.0);
 		dirVec = cameraMatrix.rotateVector(dirVec);	
 		dirVec = cameraMatrix.rotateVector(dirVec);	
 	} else {
 	} else {
-		dirVec = projectRayFrom2DCoordinate(x, y);
+		dirVec = projectRayFrom2DCoordinate(x, y, cameraMatrix, projectionMatrix);
 		origin = cameraMatrix.getPosition();	
 		origin = cameraMatrix.getPosition();	
 	}
 	}