Procházet zdrojové kódy

Figuring out coordinates

Ivan Safrin před 12 roky
rodič
revize
b4fe98b72c

+ 2 - 0
Core/Contents/Include/PolyCamera.h

@@ -154,6 +154,8 @@ namespace Polycode {
 			*/
 			bool frustumCulling;
 			
+			bool topLeftOrtho;
+			
 		protected:
 		
 			Number orthoSizeX;

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

@@ -636,7 +636,7 @@ namespace Polycode {
 			
 			void doUpdates();				
 			virtual Matrix4 buildPositionMatrix();
-			virtual void adjustMatrixForChildren(){}
+			virtual void adjustMatrixForChildren();
 			void setRenderer(Renderer *renderer);						
 			
 			

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

@@ -130,7 +130,6 @@ namespace Polycode {
 		void drawArrays(int drawType);		
 				
 		void setOrthoMode(Number xSize=0.0f, Number ySize=0.0f, bool centered = false);
-		void _setOrthoMode(Number orthoSizeX, Number orthoSizeY);
 		void setPerspectiveMode();
 		
 		void enableBackfaceCulling(bool val);

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

@@ -116,7 +116,6 @@ namespace Polycode {
 				
 		virtual void loadIdentity() = 0;		
 		virtual void setOrthoMode(Number xSize=0.0f, Number ySize=0.0f, bool centered = false) = 0;
-		virtual void _setOrthoMode(Number orthoSizeX, Number orthoSizeY) = 0;
 		virtual void setPerspectiveMode() = 0;
 		
 		virtual void setTexture(Texture *texture) = 0;		

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

@@ -70,7 +70,7 @@ namespace Polycode {
 			
 			void updateFromLabel();
 			
-			Number scale;
+			Number labelScale;
 			Label *label;
 	};
 }

+ 1 - 0
Core/Contents/Include/Polycode.h

@@ -77,6 +77,7 @@
 #include "PolySound.h"
 #include "PolySoundManager.h"
 #include "PolySceneSound.h"
+#include "PolySceneImage.h"
 #include "PolyClient.h"
 #include "PolyPeer.h"
 #include "PolyServer.h"

+ 32 - 3
Core/Contents/Source/PolyEntity.cpp

@@ -63,6 +63,7 @@ Entity::Entity() : EventDispatcher() {
 	hasFocus = false;
 	snapToPixels = false;
 	tags = NULL;
+	positionMode = POSITION_CENTER;
 }
 
 Entity *Entity::getEntityById(String id, bool recursive) const {
@@ -305,10 +306,28 @@ Vector3 Entity::getChildCenter() const {
 
 
 Matrix4 Entity::buildPositionMatrix() {
+
 	Matrix4 posMatrix;
-	posMatrix.m[3][0] = position.x*matrixAdj;
-	posMatrix.m[3][1] = position.y*matrixAdj;
-	posMatrix.m[3][2] = position.z*matrixAdj;
+	switch(positionMode) {
+		case POSITION_TOPLEFT:
+			posMatrix.m[3][0] = (position.x+floor(bBox.x/2.0f)*scale.x)*matrixAdj;
+			posMatrix.m[3][1] = (position.y+floor(bBox.y/2.0f)*scale.y)*matrixAdj;
+			posMatrix.m[3][2] = position.z*matrixAdj;			
+		break;
+		case POSITION_CENTER:
+			posMatrix.m[3][0] = position.x*matrixAdj;
+			posMatrix.m[3][1] = position.y*matrixAdj;
+			posMatrix.m[3][2] = position.z*matrixAdj;
+		break;
+	}
+
+
+	if(snapToPixels) {
+		posMatrix.m[3][0] = round(posMatrix.m[3][0]);
+		posMatrix.m[3][1] = round(posMatrix.m[3][1]);
+		posMatrix.m[3][2] = round(posMatrix.m[3][2]);		
+	}
+
 	return posMatrix;
 }
 
@@ -514,6 +533,16 @@ void Entity::dirtyMatrix(bool val) {
 	matrixDirty = val;
 }
 
+void Entity::adjustMatrixForChildren() {
+	if(positionMode == POSITION_TOPLEFT) {
+		if(snapToPixels) {
+			renderer->translate2D((int)-floor(bBox.x/2.0f),(int)floor(bBox.y/2.0f));			
+		} else {
+			renderer->translate2D(-bBox.x/2.0f, -bBox.y/2.0f);	
+		}
+	}
+}
+
 void Entity::setRotationQuat(Number w, Number x, Number y, Number z) {
 	rotationQuat.w = w;
 	rotationQuat.x = x;

+ 7 - 22
Core/Contents/Source/PolyGLRenderer.cpp

@@ -498,23 +498,6 @@ void OpenGLRenderer::setFogProperties(int fogMode, Color color, Number density,
 	glFogf(GL_FOG_END, endDepth);
 }
 
-
-void OpenGLRenderer::_setOrthoMode(Number orthoSizeX, Number orthoSizeY) {
-	this->orthoSizeX = orthoSizeX;
-	this->orthoSizeY = orthoSizeY;
-	
-	if(!orthoMode) {
-		glMatrixMode(GL_PROJECTION);
-		glLoadIdentity();
-		glOrtho(-orthoSizeX*0.5,orthoSizeX*0.5,-orthoSizeY*0.5,orthoSizeY*0.5,-farPlane,farPlane);
-		orthoMode = true;
-	}
-	glGetDoublev( GL_PROJECTION_MATRIX, sceneProjectionMatrixOrtho);
-		
-	glMatrixMode(GL_MODELVIEW);	
-	glLoadIdentity();	
-}
-
 void OpenGLRenderer::setOrthoMode(Number xSize, Number ySize, bool centered) {
 	
 	if(xSize == 0)
@@ -523,17 +506,19 @@ void OpenGLRenderer::setOrthoMode(Number xSize, Number ySize, bool centered) {
 	if(ySize == 0)
 		ySize = yRes;
 		
-	setBlendingMode(BLEND_MODE_NORMAL);
-	glDisable(GL_LIGHTING);
+	this->orthoSizeX = xSize;
+	this->orthoSizeY = ySize;
+
 	glMatrixMode(GL_PROJECTION);
-	glDisable(GL_CULL_FACE);
 	glLoadIdentity();
 		
 	if(centered) {
-		glOrtho(-xSize*0.5,xSize*0.5,ySize*0.5,-ySize*0.5,-1.0f,1.0f);		
+		glOrtho(-xSize*0.5,xSize*0.5,-ySize*0.5,ySize*0.5,nearPlane,farPlane);		
 	} else {
-		glOrtho(0.0f,xSize,ySize,0,-1.0f,1.0f);
+		glOrtho(0.0f,xSize,ySize,0,nearPlane,farPlane);
 	}
+	glGetDoublev( GL_PROJECTION_MATRIX, sceneProjectionMatrixOrtho);
+		
 	orthoMode = true;
 	glMatrixMode(GL_MODELVIEW);	
 	glLoadIdentity();

+ 1 - 1
Core/Contents/Source/PolyScene.cpp

@@ -207,7 +207,7 @@ void Scene::Render(Camera *targetCamera) {
 	}	
 
 	if(targetCamera->getOrthoMode()) {
-		CoreServices::getInstance()->getRenderer()->_setOrthoMode(targetCamera->getOrthoSizeX(), targetCamera->getOrthoSizeY());
+		CoreServices::getInstance()->getRenderer()->setOrthoMode(targetCamera->getOrthoSizeX(), targetCamera->getOrthoSizeY(), !targetCamera->topLeftOrtho);
 	}
 		
 	targetCamera->doCameraTransform();

+ 6 - 6
Core/Contents/Source/PolySceneLabel.cpp

@@ -33,7 +33,7 @@ using namespace Polycode;
 
 SceneLabel::SceneLabel(const String& fontName, const String& text, int size, Number scale, int amode, bool premultiplyAlpha) : ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 1, 1) {
 	label = new Label(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), text, size, amode, premultiplyAlpha);
-	this->scale = scale;
+	this->labelScale = scale;
 	positionAtBaseline = true;
 	updateFromLabel();
 }
@@ -41,7 +41,7 @@ SceneLabel::SceneLabel(const String& fontName, const String& text, int size, Num
 SceneLabel::SceneLabel(const String& text, int size, const String& fontName, int amode, bool premultiplyAlpha) : ScenePrimitive(ScenePrimitive::TYPE_VPLANE, 1, 1){
 
 	label = new Label(CoreServices::getInstance()->getFontManager()->getFontByName(fontName), text, size, amode, premultiplyAlpha);
-	this->scale = 1.0;
+	this->labelScale = 1.0;
 	positionAtBaseline = true;
 	updateFromLabel();
 }
@@ -73,10 +73,10 @@ void SceneLabel::updateFromLabel() {
 
 	delete mesh;
 	mesh = new Mesh(Mesh::QUAD_MESH);
-	mesh->createVPlane(label->getWidth()*scale,label->getHeight()*scale);
+	mesh->createVPlane(label->getWidth()*labelScale,label->getHeight()*labelScale);
 	
-	bBox.x = label->getWidth()*scale;
-	bBox.y = label->getHeight()*scale;
+	bBox.x = label->getWidth()*labelScale;
+	bBox.y = label->getHeight()*labelScale;
 	bBox.z = 0;
 	
 	
@@ -85,7 +85,7 @@ void SceneLabel::updateFromLabel() {
 	
 	// TODO: resize it here
 	
-	bBoxRadius = label->getWidth()*scale;
+	bBoxRadius = label->getWidth()*labelScale;
 }
 
 void SceneLabel::Render() {