Przeglądaj źródła

Added cameraShift parameter to Camera, added setViewportShift to Renderer. Added pausePhysics boolean to PhysicsScene

Ivan Safrin 12 lat temu
rodzic
commit
469c757993

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

@@ -23,6 +23,7 @@
 
 #pragma once
 #include "PolyGlobals.h"
+#include "PolyVector2.h"
 #include "PolySceneEntity.h"
 
 namespace Polycode {
@@ -147,15 +148,21 @@ namespace Polycode {
 			/**
 			* Returns the shader material applied to the camera.
 			*/			
-			Material *getScreenShaderMaterial() { return filterShaderMaterial; }
+			Material *getScreenShaderMaterial() { return filterShaderMaterial; }	
 			
 			/**
 			* Toggles the frustum culling of the camera. (Defaults to true).
 			*/
 			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).
+			*/
+			Vector2 cameraShift;
+					
 		protected:
 		
+					
 			Number orthoSizeX;
 			Number orthoSizeY;
 					
@@ -164,8 +171,6 @@ namespace Polycode {
 			Number fov;
 			Number frustumPlanes[6][4];
 			Scene *parentScene;
-		
-			bool fovSet;
 
 			Material *filterShaderMaterial;			
 			Texture *originalSceneTexture;			

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

@@ -172,7 +172,7 @@ namespace Polycode {
 		Matrix4 getProjectionMatrix();
 		Matrix4 getModelviewMatrix();		
 		void setModelviewMatrix(Matrix4 m);	
-		void multModelviewMatrix(Matrix4 m);
+		void multModelviewMatrix(Matrix4 m);		
 		
 		void enableDepthTest(bool val);
 		void enableDepthWrite(bool val);

+ 4 - 0
Core/Contents/Include/PolyRenderer.h

@@ -250,6 +250,8 @@ namespace Polycode {
 		Number getViewportWidth();
 		Number getViewportHeight();		
 		
+		void setViewportShift(Number shiftX, Number shiftY);
+		
 		void *getDataPointerForName(const String &name);
 		void setRendererShaderParams(Shader *shader, ShaderBinding *binding);
 		
@@ -315,6 +317,8 @@ namespace Polycode {
 	
 		Number viewportWidth;
 		Number viewportHeight;
+		
+		Vector2 viewportShift;
 			
 		bool cullingFrontFaces;
 				

+ 11 - 12
Core/Contents/Source/PolyCamera.cpp

@@ -41,8 +41,7 @@ Camera::Camera(Scene *parentScene) : SceneEntity() {
 	originalSceneTexture = NULL;
 	zBufferSceneTexture = NULL;
 	exposureLevel = 1.0f;
-	_hasFilterShader = false;	
-	fovSet = false;
+	_hasFilterShader = false;
 	frustumCulling = true;
 }
 
@@ -66,7 +65,6 @@ Number Camera::getExposureLevel() {
 
 void Camera::setFOV(Number fov) {
 	this->fov = fov;
-	fovSet = true;
 }
 
 Number Camera::getFOV() {
@@ -304,7 +302,6 @@ void Camera::setLightDepthTexture(Texture *texture) {
 		localShaderOptions[i]->clearTexture("PolyLight0ZBuffer");
 		localShaderOptions[i]->addTexture("PolyLight0ZBuffer", texture);
 	}
-
 }
 
 void Camera::drawFilter(Texture *targetTexture, Number targetTextureWidth, Number targetTextureHeight, Texture *targetColorTexture, Texture *targetZTexture) {
@@ -376,21 +373,23 @@ void Camera::drawFilter(Texture *targetTexture, Number targetTextureWidth, Numbe
 		CoreServices::getInstance()->getRenderer()->clearShader();
 		CoreServices::getInstance()->getRenderer()->loadIdentity();
 	}
-
 }
 
 void Camera::doCameraTransform() {
-
-	if(fovSet)
-			CoreServices::getInstance()->getRenderer()->setFOV(fov);
-	CoreServices::getInstance()->getRenderer()->setExposureLevel(exposureLevel);
-
+	Renderer *renderer = CoreServices::getInstance()->getRenderer();
+	if(!orthoMode) {
+		renderer->setViewportShift(cameraShift.x, cameraShift.y);
+		renderer->setFOV(fov);
+	}
+	
+	renderer->setExposureLevel(exposureLevel);	
+	
 	if(matrixDirty) {
 		rebuildTransformMatrix();
 	}
 
 	Matrix4 camMatrix = getConcatenatedMatrix();
-	CoreServices::getInstance()->getRenderer()->setCameraMatrix(camMatrix);	
+	renderer->setCameraMatrix(camMatrix);	
 	camMatrix = camMatrix.Inverse();
-	CoreServices::getInstance()->getRenderer()->multModelviewMatrix(camMatrix);		
+	renderer->multModelviewMatrix(camMatrix);		
 }

+ 10 - 5
Core/Contents/Source/PolyGLRenderer.cpp

@@ -24,6 +24,7 @@
 #include "PolyString.h"
 #include "PolyLogger.h"
 #include "PolyTexture.h"
+#include "PolyVector2.h"
 #include "PolyGLTexture.h"
 #include "PolyCubemap.h"
 #include "PolyGLCubemap.h"
@@ -166,9 +167,8 @@ void OpenGLRenderer::Resize(int xRes, int yRes) {
 	
     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
-	gluPerspective(fov,(GLfloat)xRes/(GLfloat)yRes,nearPlane,farPlane);
-	glViewport(0, 0, xRes, yRes);
-	setScissorBox(Rectangle(0, 0, xRes, yRes));
+
+	resetViewport();
 	
 	glMatrixMode(GL_MODELVIEW);
 	glLineWidth(1);
@@ -221,9 +221,14 @@ void OpenGLRenderer::setLineSmooth(bool val) {
 void OpenGLRenderer::resetViewport() {
 	glMatrixMode(GL_PROJECTION);
 	glLoadIdentity();
-	gluPerspective(fov,(GLfloat)viewportWidth/(GLfloat)viewportHeight,nearPlane,farPlane);	
+	//gluPerspective(fov,(GLfloat)viewportWidth/(GLfloat)viewportHeight,nearPlane,farPlane);		
+    Number fW, fH;
+    fH = tan( fov / 360.0 * PI ) * nearPlane;
+    fW = fH * ((GLfloat)viewportWidth/(GLfloat)viewportHeight);
+	glFrustum(-fW + (viewportShift.x*fW*2.0), fW + (viewportShift.x*fW*2.0), -fH + (viewportShift.y*fH*2.0), fH + (viewportShift.y*fH*2.0), nearPlane, farPlane);
+	
 	glViewport(0, 0, viewportWidth, viewportHeight);
-	glScissor(0, 0, viewportWidth, viewportHeight);
+	glScissor(0, 0,  viewportWidth, viewportHeight);
 	glMatrixMode(GL_MODELVIEW);	
 	glGetDoublev( GL_PROJECTION_MATRIX, sceneProjectionMatrix);
 }

+ 6 - 0
Core/Contents/Source/PolyRenderer.cpp

@@ -304,6 +304,12 @@ Polycode::Rectangle Renderer::getScissorBox() {
 	return scissorBox;
 }
 
+void Renderer::setViewportShift(Number shiftX, Number shiftY) {
+	viewportShift.x = shiftX;
+	viewportShift.y = shiftY;
+	resetViewport();
+}
+
 bool Renderer::isScissorEnabled() {
 	return scissorEnabled;
 }

+ 2 - 0
Modules/Contents/3DPhysics/Include/PolyPhysicsScene.h

@@ -135,9 +135,11 @@ namespace Polycode {
 			//@}
 			// ----------------------------------------------------------------------------------------------------------------
 
+		bool pausePhysics;
 		
 	protected:
 		
+		bool paused;
 		int maxSubSteps;
 		void initPhysicsScene(Vector3 size);		
 		

+ 3 - 1
Modules/Contents/3DPhysics/Source/PolyPhysicsScene.cpp

@@ -44,6 +44,7 @@ PhysicsSceneEvent::~PhysicsSceneEvent() {
 
 PhysicsScene::PhysicsScene(int maxSubSteps, Vector3 size, bool virtualScene) : CollisionScene(size, virtualScene, true), physicsWorld(NULL), solver(NULL), broadphase(NULL), ghostPairCallback(NULL) {
 	this->maxSubSteps = maxSubSteps;
+	pausePhysics = false;	
 	initPhysicsScene(size);	
 }
 
@@ -142,7 +143,7 @@ void PhysicsScene::processWorldCollisions() {
 }
 
 void PhysicsScene::Update() {
-	
+	if(!pausePhysics) {
 	for(int i=0; i < physicsChildren.size(); i++) {
 //		if(physicsChildren[i]->enabled)
 			physicsChildren[i]->Update();
@@ -155,6 +156,7 @@ void PhysicsScene::Update() {
 	} else {
 		physicsWorld->stepSimulation(elapsed);		
 	}
+	}
 	CollisionScene::Update();
 	
 }