perspective projection, part 1

This commit is contained in:
Vadim Lopatin 2015-11-03 16:46:32 +03:00
parent 01d39e0635
commit 1a8504fcd9
2 changed files with 47 additions and 7 deletions

View File

@ -59,7 +59,7 @@ class GLDrawBuf : DrawBuf, GLConfigCallback {
override void saveConfiguration() { override void saveConfiguration() {
} }
override void restoreConfiguration() { override void restoreConfiguration() {
glSupport.setOrthoProjection(_dx, _dy); glSupport.setOrthoProjection(Rect(0, 0, _dx, _dy));
} }
/// reserved for hardware-accelerated drawing - begins drawing batch /// reserved for hardware-accelerated drawing - begins drawing batch
@ -74,7 +74,7 @@ class GLDrawBuf : DrawBuf, GLConfigCallback {
/// reserved for hardware-accelerated drawing - ends drawing batch /// reserved for hardware-accelerated drawing - ends drawing batch
override void afterDrawing() { override void afterDrawing() {
glSupport.setOrthoProjection(_dx, _dy); glSupport.setOrthoProjection(Rect(0, 0, _dx, _dy));
_scene.draw(); _scene.draw();
glSupport.flushGL(); glSupport.flushGL();
destroy(_scene); destroy(_scene);

View File

@ -1089,13 +1089,53 @@ class GLSupport {
qtmatrix[y * 4 + x] = m[y][x]; qtmatrix[y * 4 + x] = m[y][x];
} }
void setOrthoProjection(int dx, int dy) { void QMatrix4x4_perspective(float angle, float aspect, float nearPlane, float farPlane)
bufferDx = dx; {
bufferDy = dy; import std.math;
QMatrix4x4_ortho(0, dx, 0, dy, 0.5f, 50.0f); // Bail out if the projection volume is zero-sized.
glViewport(0, 0, dx, dy); if (nearPlane == farPlane || aspect == 0.0f)
return;
// Construct the projection.
float[4][4] m;
float radians = (angle / 2.0f) * PI / 180.0f;
float sine = sin(radians);
if (sine == 0.0f)
return;
float cotan = cos(radians) / sine;
float clip = farPlane - nearPlane;
m[0][0] = cotan / aspect;
m[1][0] = 0.0f;
m[2][0] = 0.0f;
m[3][0] = 0.0f;
m[0][1] = 0.0f;
m[1][1] = cotan;
m[2][1] = 0.0f;
m[3][1] = 0.0f;
m[0][2] = 0.0f;
m[1][2] = 0.0f;
m[2][2] = -(nearPlane + farPlane) / clip;
m[3][2] = -(2.0f * nearPlane * farPlane) / clip;
m[0][3] = 0.0f;
m[1][3] = 0.0f;
m[2][3] = -1.0f;
m[3][3] = 0.0f;
for (int y = 0; y < 4; y++)
for (int x = 0; x < 4; x++)
qtmatrix[y * 4 + x] = m[y][x];
}
void setOrthoProjection(Rect view) {
bufferDx = view.width;
bufferDy = view.height;
QMatrix4x4_ortho(view.left, view.right, view.top, view.bottom, 0.5f, 50.0f);
glViewport(view.left, view.top, view.right, view.bottom);
checkError("glViewport"); checkError("glViewport");
} }
void setPerspectiveProjection(float fieldOfView, float aspectRatio, float nearPlane, float farPlane) {
// TODO
}
} }