Skip to content

Commit 0f94852

Browse files
committed
Fixed ortho mode and 3d picking from camera in ortho
1 parent 54c63c1 commit 0f94852

9 files changed

Lines changed: 129 additions & 63 deletions

File tree

Core/Contents/Include/PolyCamera.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,12 @@ namespace Polycode {
6464
*/
6565
bool canSee(SceneEntity *entity);
6666

67-
void setOrthoMode(bool mode);
67+
void setOrthoMode(bool mode, Number orthoSizeX = 1.0, Number orthoSizeY = 1.0);
6868
bool getOrthoMode();
6969

70+
Number getOrthoSizeX();
71+
Number getOrthoSizeY();
72+
7073
/**
7174
* Sets the field of view (FOV) for the camera. The larger the field of view, the more the camera can see, the smaller it is, the more zoomed in it is.
7275
* @param fov The new FOV value.
@@ -125,6 +128,9 @@ namespace Polycode {
125128

126129
protected:
127130

131+
Number orthoSizeX;
132+
Number orthoSizeY;
133+
128134
Number exposureLevel;
129135
bool orthoMode;
130136
Number fov;

Core/Contents/Include/PolyCoreServices.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,9 @@ namespace Polycode {
146146
* @see Config
147147
*/
148148
Config *getConfig();
149-
149+
150+
bool drawScreensFirst;
151+
150152
~CoreServices();
151153

152154
protected:
@@ -155,6 +157,7 @@ namespace Polycode {
155157

156158
private:
157159

160+
158161
static CoreServices* overrideInstance;
159162
static std::map <long, CoreServices*> instanceMap;
160163
static CoreMutex *renderMutex;

Core/Contents/Include/PolyGLRenderer.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ namespace Polycode {
126126
void drawArrays(int drawType);
127127

128128
void setOrthoMode(Number xSize=0.0f, Number ySize=0.0f);
129-
void _setOrthoMode();
129+
void _setOrthoMode(Number orthoSizeX, Number orthoSizeY);
130130
void setPerspectiveMode();
131131

132132
void enableBackfaceCulling(bool val);
@@ -181,10 +181,7 @@ namespace Polycode {
181181
void drawScreenQuad(Number qx, Number qy);
182182

183183
void pushMatrix();
184-
void popMatrix();
185-
186-
bool test2DCoordinate(Number x, Number y, Polycode::Polygon *poly, const Matrix4 &matrix, bool billboardMode);
187-
184+
void popMatrix();
188185

189186
Vector3 Unproject(Number x, Number y);
190187

@@ -202,7 +199,7 @@ namespace Polycode {
202199
int verticesToDraw;
203200

204201
GLdouble sceneProjectionMatrix[16];
205-
202+
GLdouble sceneProjectionMatrixOrtho[16];
206203

207204
};
208205
}

Core/Contents/Include/PolyRenderer.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ namespace Polycode {
103103

104104
virtual void loadIdentity() = 0;
105105
virtual void setOrthoMode(Number xSize=0.0f, Number ySize=0.0f) = 0;
106-
virtual void _setOrthoMode() = 0;
106+
virtual void _setOrthoMode(Number orthoSizeX, Number orthoSizeY) = 0;
107107
virtual void setPerspectiveMode() = 0;
108108

109109
virtual void setTexture(Texture *texture) = 0;
@@ -212,7 +212,7 @@ namespace Polycode {
212212

213213
void addShaderModule(PolycodeShaderModule *module);
214214

215-
virtual bool test2DCoordinate(Number x, Number y, Polygon *poly, const Matrix4 &matrix, bool billboardMode) = 0;
215+
virtual bool test2DCoordinateInPolygon(Number x, Number y, Polygon *poly, const Matrix4 &matrix, bool testBackfacing, bool ortho, bool billboardMode);
216216

217217
virtual Matrix4 getProjectionMatrix() = 0;
218218
virtual Matrix4 getModelviewMatrix() = 0;
@@ -290,6 +290,9 @@ namespace Polycode {
290290
bool shadersEnabled;
291291
Number fov;
292292

293+
Number orthoSizeX;
294+
Number orthoSizeY;
295+
293296
bool lightingEnabled;
294297

295298
bool orthoMode;

Core/Contents/Source/PolyCamera.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,25 @@ bool Camera::isSphereInFrustrum(Vector3 pos, Number fRadius) {
8585
return true;
8686
}
8787

88-
void Camera::setOrthoMode(bool mode) {
88+
void Camera::setOrthoMode(bool mode, Number orthoSizeX, Number orthoSizeY) {
89+
this->orthoSizeX = orthoSizeX;
90+
this->orthoSizeY = orthoSizeY;
8991
orthoMode = mode;
9092
}
9193

9294
bool Camera::getOrthoMode() {
9395
return orthoMode;
9496
}
9597

98+
Number Camera::getOrthoSizeX() {
99+
return orthoSizeX;
100+
}
101+
102+
Number Camera::getOrthoSizeY() {
103+
return orthoSizeY;
104+
}
105+
106+
96107
void Camera::buildFrustrumPlanes() {
97108

98109
Matrix4 p;

Core/Contents/Source/PolyCoreServices.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ CoreServices* CoreServices::getInstance() {
6464

6565
//#ifdef _WINDOWS
6666
overrideInstance = new CoreServices;
67+
overrideInstance->drawScreensFirst = false;
6768
Logger::log("Creating new core services instance...\n");
6869
return overrideInstance;
6970
//#else
@@ -211,12 +212,22 @@ void CoreServices::Update(int elapsed) {
211212
timerManager->Update();
212213
tweenManager->Update();
213214
materialManager->Update(elapsed);
214-
renderer->setPerspectiveMode();
215-
sceneManager->UpdateVirtual();
216-
renderer->clearScreen();
217-
sceneManager->Update();
218-
// renderer->setOrthoMode();
219-
screenManager->Update();
215+
216+
if(drawScreensFirst) {
217+
renderer->clearScreen();
218+
renderer->setPerspectiveMode();
219+
sceneManager->UpdateVirtual();
220+
renderer->clearScreen();
221+
screenManager->Update();
222+
renderer->setPerspectiveMode();
223+
sceneManager->Update();
224+
} else {
225+
renderer->setPerspectiveMode();
226+
sceneManager->UpdateVirtual();
227+
renderer->clearScreen();
228+
sceneManager->Update();
229+
screenManager->Update();
230+
}
220231
}
221232

222233
SoundManager *CoreServices::getSoundManager() {

Core/Contents/Source/PolyGLRenderer.cpp

Lines changed: 7 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -265,45 +265,6 @@ Vector3 OpenGLRenderer::projectRayFrom2DCoordinate(Number x, Number y) {
265265
return dirVec;
266266
}
267267

268-
bool OpenGLRenderer::test2DCoordinate(Number x, Number y, Polycode::Polygon *poly, const Matrix4 &matrix, bool billboardMode) {
269-
GLdouble nearPlane[3],farPlane[3];
270-
271-
GLdouble mv[16];
272-
Matrix4 camInverse = cameraMatrix.inverse();
273-
Matrix4 cmv;
274-
cmv.identity();
275-
cmv = cmv * camInverse;
276-
277-
for(int i=0; i < 16; i++) {
278-
mv[i] = cmv.ml[i];
279-
}
280-
281-
GLint vp[4];
282-
glGetIntegerv( GL_VIEWPORT, vp );
283-
284-
gluUnProject(x, yRes - y, 0.0, mv, sceneProjectionMatrix, vp, &nearPlane[0], &nearPlane[1], &nearPlane[2]);
285-
gluUnProject(x, yRes - y, 1.0, mv, sceneProjectionMatrix, vp, &farPlane[0], &farPlane[1], &farPlane[2]);
286-
287-
Vector3 nearVec(nearPlane[0], nearPlane[1], nearPlane[2]);
288-
Vector3 farVec(farPlane[0], farPlane[1], farPlane[2]);
289-
290-
Vector3 dirVec = farVec - nearVec;
291-
dirVec.Normalize();
292-
293-
Vector3 hitPoint;
294-
295-
Matrix4 fullMatrix = matrix;
296-
297-
if(poly->getVertexCount() == 3) {
298-
return rayTriangleIntersect(Vector3(0,0,0), dirVec, fullMatrix * (*poly->getVertex(0)), fullMatrix * (*poly->getVertex(1)), fullMatrix * (*poly->getVertex(2)), &hitPoint);
299-
} else if(poly->getVertexCount() == 4) {
300-
return (rayTriangleIntersect(Vector3(0,0,0), dirVec, fullMatrix * (*poly->getVertex(2)), fullMatrix * (*poly->getVertex(1)), fullMatrix * (*poly->getVertex(0)), &hitPoint) ||
301-
rayTriangleIntersect(Vector3(0,0,0), dirVec, fullMatrix * (*poly->getVertex(0)), fullMatrix * (*poly->getVertex(3)), fullMatrix * (*poly->getVertex(2)), &hitPoint));
302-
} else {
303-
return false;
304-
}
305-
}
306-
307268
void OpenGLRenderer::enableDepthWrite(bool val) {
308269
if(val)
309270
glDepthMask(GL_TRUE);
@@ -490,14 +451,19 @@ void OpenGLRenderer::setFogProperties(int fogMode, Color color, Number density,
490451
}
491452

492453

493-
void OpenGLRenderer::_setOrthoMode() {
454+
void OpenGLRenderer::_setOrthoMode(Number orthoSizeX, Number orthoSizeY) {
455+
this->orthoSizeX = orthoSizeX;
456+
this->orthoSizeY = orthoSizeY;
457+
494458
if(!orthoMode) {
495459
glMatrixMode(GL_PROJECTION);
496460
glPushMatrix();
497461
glLoadIdentity();
498-
glOrtho(-1,1,-1,1,nearPlane,farPlane);
462+
glOrtho(-orthoSizeX*0.5,orthoSizeX*0.5,-orthoSizeY*0.5,orthoSizeY*0.5,-farPlane,farPlane);
499463
orthoMode = true;
500464
}
465+
glGetDoublev( GL_PROJECTION_MATRIX, sceneProjectionMatrixOrtho);
466+
501467
glMatrixMode(GL_MODELVIEW);
502468
glLoadIdentity();
503469
}

Core/Contents/Source/PolyRenderer.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,77 @@ void Renderer::setExposureLevel(Number level) {
7777
exposureLevel = level;
7878
}
7979

80+
81+
bool Renderer::test2DCoordinateInPolygon(Number x, Number y, Polycode::Polygon *poly, const Matrix4 &matrix, bool ortho, bool testBackfacing, bool billboardMode) {
82+
83+
Vector3 dirVec;
84+
Vector3 origin;
85+
86+
if(ortho) {
87+
origin = Vector3(((x/(Number)xRes)*orthoSizeX) - (orthoSizeX*0.5), (((yRes-y)/(Number)yRes)*orthoSizeY) - (orthoSizeY*0.5), 0.0);
88+
origin = cameraMatrix * origin;
89+
90+
dirVec = Vector3(0.0, 0.0, -1.0);
91+
dirVec = cameraMatrix.rotateVector(dirVec);
92+
} else {
93+
dirVec = projectRayFrom2DCoordinate(x, y);
94+
origin = cameraMatrix.getPosition();
95+
}
96+
97+
Vector3 hitPoint;
98+
99+
Matrix4 fullMatrix = matrix;
100+
101+
if(billboardMode) {
102+
Matrix4 camInverse = cameraMatrix.inverse();
103+
fullMatrix = fullMatrix * camInverse;
104+
105+
fullMatrix.m[0][0] = 1;
106+
fullMatrix.m[0][1] = 0;
107+
fullMatrix.m[0][2] = 0;
108+
109+
fullMatrix.m[1][0] = 0;
110+
fullMatrix.m[1][1] = 1;
111+
fullMatrix.m[1][2] = 0;
112+
113+
fullMatrix.m[2][0] = 0;
114+
fullMatrix.m[2][1] = 0;
115+
fullMatrix.m[2][2] = 1;
116+
117+
origin = camInverse * origin;
118+
dirVec = camInverse.rotateVector(dirVec);
119+
}
120+
121+
bool retStatus = false;
122+
123+
124+
if(poly->getVertexCount() == 3) {
125+
retStatus = rayTriangleIntersect(origin, dirVec, fullMatrix * (*poly->getVertex(0)), fullMatrix * (*poly->getVertex(1)), fullMatrix * (*poly->getVertex(2)), &hitPoint);
126+
if(testBackfacing && !retStatus) {
127+
retStatus = rayTriangleIntersect(origin, dirVec, fullMatrix * (*poly->getVertex(2)), fullMatrix * (*poly->getVertex(1)), fullMatrix * (*poly->getVertex(0)), &hitPoint);
128+
129+
}
130+
} else if(poly->getVertexCount() == 4) {
131+
retStatus = (rayTriangleIntersect(origin, dirVec, fullMatrix * (*poly->getVertex(2)), fullMatrix * (*poly->getVertex(1)), fullMatrix * (*poly->getVertex(0)), &hitPoint) ||
132+
rayTriangleIntersect(origin, dirVec, fullMatrix * (*poly->getVertex(0)), fullMatrix * (*poly->getVertex(3)), fullMatrix * (*poly->getVertex(2)), &hitPoint));
133+
if(testBackfacing && !retStatus) {
134+
retStatus = (rayTriangleIntersect(origin, dirVec, fullMatrix * (*poly->getVertex(0)), fullMatrix * (*poly->getVertex(1)), fullMatrix * (*poly->getVertex(2)), &hitPoint) ||
135+
rayTriangleIntersect(origin, dirVec, fullMatrix * (*poly->getVertex(2)), fullMatrix * (*poly->getVertex(3)), fullMatrix * (*poly->getVertex(0)), &hitPoint));
136+
137+
}
138+
} else {
139+
retStatus = false;
140+
}
141+
142+
return retStatus;
143+
}
144+
80145
bool Renderer::rayTriangleIntersect(Vector3 ray_origin, Vector3 ray_direction, Vector3 vert0, Vector3 vert1, Vector3 vert2, Vector3 *hitPoint)
81146
{
147+
148+
// printf("TESTING RAY\nORIGIN: %f,%f,%f\nDIR: %f,%f,%f\nVERT0: %f,%f,%f\nnVERT1: %f,%f,%f\nnVERT2: %f,%f,%f\n", ray_origin.x, ray_origin.y, ray_origin.z, ray_direction.x, ray_direction.y, ray_direction.z, vert0.x, vert0.y, vert0.z, vert1.x, vert1.y, vert1.z, vert2.x, vert2.y, vert2.z);
149+
150+
82151
Number t,u,v;
83152
t = 0; u = 0; v = 0;
84153

Core/Contents/Source/PolyScene.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -225,13 +225,13 @@ void Scene::Render(Camera *targetCamera) {
225225
}
226226
CoreServices::getInstance()->getRenderer()->addLight(light->getLightImportance(), position, direction, light->getLightType(), light->lightColor, light->specularLightColor, light->getConstantAttenuation(), light->getLinearAttenuation(), light->getQuadraticAttenuation(), light->getIntensity(), light->getSpotlightCutoff(), light->getSpotlightExponent(), light->areShadowsEnabled(), matrixPtr, shadowMapTexture);
227227
}
228-
229-
targetCamera->doCameraTransform();
230-
targetCamera->buildFrustrumPlanes();
231-
228+
232229
if(targetCamera->getOrthoMode()) {
233-
CoreServices::getInstance()->getRenderer()->_setOrthoMode();
230+
CoreServices::getInstance()->getRenderer()->_setOrthoMode(targetCamera->getOrthoSizeX(), targetCamera->getOrthoSizeY());
234231
}
232+
233+
targetCamera->doCameraTransform();
234+
targetCamera->buildFrustrumPlanes();
235235

236236
CoreServices::getInstance()->getRenderer()->enableFog(fogEnabled);
237237
if(fogEnabled) {

0 commit comments

Comments
 (0)