Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/ghost/test/gears/GHOST_Test.cpp')
-rw-r--r--intern/ghost/test/gears/GHOST_Test.cpp1201
1 files changed, 599 insertions, 602 deletions
diff --git a/intern/ghost/test/gears/GHOST_Test.cpp b/intern/ghost/test/gears/GHOST_Test.cpp
index 23564faf38d..76386fb114a 100644
--- a/intern/ghost/test/gears/GHOST_Test.cpp
+++ b/intern/ghost/test/gears/GHOST_Test.cpp
@@ -34,13 +34,13 @@
# include <atlbase.h>
# include <GL/gl.h>
-# else // WIN32
- // __APPLE__ is defined
+# else // WIN32 \
+ // __APPLE__ is defined
# include <AGL/gl.h>
-# endif // WIN32
-#else // defined(WIN32) || defined(__APPLE__)
+# endif // WIN32
+#else // defined(WIN32) || defined(__APPLE__)
# include <GL/gl.h>
-#endif // defined(WIN32) || defined(__APPLE__)
+#endif // defined(WIN32) || defined(__APPLE__)
#include "STR_String.h"
#include "GHOST_Rect.h"
@@ -49,290 +49,302 @@
#include "GHOST_IEvent.h"
#include "GHOST_IEventConsumer.h"
-
-#define LEFT_EYE 0
+#define LEFT_EYE 0
#define RIGHT_EYE 1
static bool nVidiaWindows; // very dirty but hey, it's for testing only
static void gearsTimerProc(GHOST_ITimerTask *task, GHOST_TUns64 time);
-static class Application * fApp;
+static class Application *fApp;
static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
static GLfloat fAngle = 0.0;
static GHOST_ISystem *fSystem = 0;
-
-void StereoProjection(float left, float right, float bottom, float top, float nearplane, float farplane,
- float zero_plane, float dist,
+void StereoProjection(float left,
+ float right,
+ float bottom,
+ float top,
+ float nearplane,
+ float farplane,
+ float zero_plane,
+ float dist,
float eye);
-
static void testTimerProc(GHOST_ITimerTask * /*task*/, GHOST_TUns64 time)
{
- std::cout << "timer1, time=" << (int)time << "\n";
+ std::cout << "timer1, time=" << (int)time << "\n";
}
-
-static void gearGL(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, GLint teeth, GLfloat tooth_depth)
+static void gearGL(
+ GLfloat inner_radius, GLfloat outer_radius, GLfloat width, GLint teeth, GLfloat tooth_depth)
{
- GLint i;
- GLfloat r0, r1, r2;
- GLfloat angle, da;
- GLfloat u, v, len;
-
- r0 = inner_radius;
- r1 = outer_radius - tooth_depth / 2.0;
- r2 = outer_radius + tooth_depth / 2.0;
-
- const double pi = 3.14159264;
- da = 2.0 * pi / teeth / 4.0;
-
- glShadeModel(GL_FLAT);
- glNormal3f(0.0, 0.0, 1.0);
-
- /* draw front face */
- glBegin(GL_QUAD_STRIP);
- for (i = 0; i <= teeth; i++) {
- angle = i * 2.0 * pi / teeth;
- glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
- glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
- glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
- glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
- }
- glEnd();
-
- /* draw front sides of teeth */
- glBegin(GL_QUADS);
- da = 2.0 * pi / teeth / 4.0;
- for (i = 0; i < teeth; i++) {
- angle = i * 2.0 * pi / teeth;
- glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
- glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
- glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
- glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
- }
- glEnd();
-
- glNormal3f(0.0, 0.0, -1.0);
-
- /* draw back face */
- glBegin(GL_QUAD_STRIP);
- for (i = 0; i <= teeth; i++) {
- angle = i * 2.0 * pi / teeth;
- glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
- glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
- glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
- glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
- }
- glEnd();
-
- /* draw back sides of teeth */
- glBegin(GL_QUADS);
- da = 2.0 * pi / teeth / 4.0;
- for (i = 0; i < teeth; i++) {
- angle = i * 2.0 * pi / teeth;
- glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
- glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
- glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
- glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
- }
- glEnd();
-
- /* draw outward faces of teeth */
- glBegin(GL_QUAD_STRIP);
- for (i = 0; i < teeth; i++) {
- angle = i * 2.0 * pi / teeth;
- glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
- glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
- u = r2 * cos(angle + da) - r1 *cos(angle);
- v = r2 * sin(angle + da) - r1 *sin(angle);
- len = sqrt(u * u + v * v);
- u /= len;
- v /= len;
- glNormal3f(v, -u, 0.0);
- glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
- glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
- glNormal3f(cos(angle), sin(angle), 0.0);
- glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
- glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
- u = r1 * cos(angle + 3 * da) - r2 *cos(angle + 2 * da);
- v = r1 * sin(angle + 3 * da) - r2 *sin(angle + 2 * da);
- glNormal3f(v, -u, 0.0);
- glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
- glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
- glNormal3f(cos(angle), sin(angle), 0.0);
- }
- glVertex3f(r1 * cos(0.0), r1 * sin(0.0), width * 0.5);
- glVertex3f(r1 * cos(0.0), r1 * sin(0.0), -width * 0.5);
- glEnd();
-
- glShadeModel(GL_SMOOTH);
-
- /* draw inside radius cylinder */
- glBegin(GL_QUAD_STRIP);
- for (i = 0; i <= teeth; i++) {
- angle = i * 2.0 * pi / teeth;
- glNormal3f(-cos(angle), -sin(angle), 0.0);
- glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
- glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
- }
- glEnd();
+ GLint i;
+ GLfloat r0, r1, r2;
+ GLfloat angle, da;
+ GLfloat u, v, len;
+
+ r0 = inner_radius;
+ r1 = outer_radius - tooth_depth / 2.0;
+ r2 = outer_radius + tooth_depth / 2.0;
+
+ const double pi = 3.14159264;
+ da = 2.0 * pi / teeth / 4.0;
+
+ glShadeModel(GL_FLAT);
+ glNormal3f(0.0, 0.0, 1.0);
+
+ /* draw front face */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++) {
+ angle = i * 2.0 * pi / teeth;
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+ }
+ glEnd();
+
+ /* draw front sides of teeth */
+ glBegin(GL_QUADS);
+ da = 2.0 * pi / teeth / 4.0;
+ for (i = 0; i < teeth; i++) {
+ angle = i * 2.0 * pi / teeth;
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+ }
+ glEnd();
+
+ glNormal3f(0.0, 0.0, -1.0);
+
+ /* draw back face */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++) {
+ angle = i * 2.0 * pi / teeth;
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+ }
+ glEnd();
+
+ /* draw back sides of teeth */
+ glBegin(GL_QUADS);
+ da = 2.0 * pi / teeth / 4.0;
+ for (i = 0; i < teeth; i++) {
+ angle = i * 2.0 * pi / teeth;
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+ }
+ glEnd();
+
+ /* draw outward faces of teeth */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i < teeth; i++) {
+ angle = i * 2.0 * pi / teeth;
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+ u = r2 * cos(angle + da) - r1 * cos(angle);
+ v = r2 * sin(angle + da) - r1 * sin(angle);
+ len = sqrt(u * u + v * v);
+ u /= len;
+ v /= len;
+ glNormal3f(v, -u, 0.0);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+ glNormal3f(cos(angle), sin(angle), 0.0);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
+ u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
+ v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
+ glNormal3f(v, -u, 0.0);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+ glNormal3f(cos(angle), sin(angle), 0.0);
+ }
+ glVertex3f(r1 * cos(0.0), r1 * sin(0.0), width * 0.5);
+ glVertex3f(r1 * cos(0.0), r1 * sin(0.0), -width * 0.5);
+ glEnd();
+
+ glShadeModel(GL_SMOOTH);
+
+ /* draw inside radius cylinder */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++) {
+ angle = i * 2.0 * pi / teeth;
+ glNormal3f(-cos(angle), -sin(angle), 0.0);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+ }
+ glEnd();
}
-
-
static void drawGearGL(int id)
{
- static GLfloat pos[4] = { 5.0f, 5.0f, 10.0f, 1.0f };
- static GLfloat ared[4] = { 0.8f, 0.1f, 0.0f, 1.0f };
- static GLfloat agreen[4] = { 0.0f, 0.8f, 0.2f, 1.0f };
- static GLfloat ablue[4] = { 0.2f, 0.2f, 1.0f, 1.0f };
-
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glEnable(GL_CULL_FACE);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
-
- switch (id)
- {
- case 1:
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ared);
- gearGL(1.0f, 4.0f, 1.0f, 20, 0.7f);
- break;
- case 2:
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, agreen);
- gearGL(0.5f, 2.0f, 2.0f, 10, 0.7f);
- break;
- case 3:
- glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ablue);
- gearGL(1.3f, 2.0f, 0.5f, 10, 0.7f);
- break;
- default:
- break;
- }
- glEnable(GL_NORMALIZE);
+ static GLfloat pos[4] = {5.0f, 5.0f, 10.0f, 1.0f};
+ static GLfloat ared[4] = {0.8f, 0.1f, 0.0f, 1.0f};
+ static GLfloat agreen[4] = {0.0f, 0.8f, 0.2f, 1.0f};
+ static GLfloat ablue[4] = {0.2f, 0.2f, 1.0f, 1.0f};
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+
+ switch (id) {
+ case 1:
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ared);
+ gearGL(1.0f, 4.0f, 1.0f, 20, 0.7f);
+ break;
+ case 2:
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, agreen);
+ gearGL(0.5f, 2.0f, 2.0f, 10, 0.7f);
+ break;
+ case 3:
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, ablue);
+ gearGL(1.3f, 2.0f, 0.5f, 10, 0.7f);
+ break;
+ default:
+ break;
+ }
+ glEnable(GL_NORMALIZE);
}
-
void RenderCamera()
{
- glRotatef(view_rotx, 1.0, 0.0, 0.0);
- glRotatef(view_roty, 0.0, 1.0, 0.0);
- glRotatef(view_rotz, 0.0, 0.0, 1.0);
+ glRotatef(view_rotx, 1.0, 0.0, 0.0);
+ glRotatef(view_roty, 0.0, 1.0, 0.0);
+ glRotatef(view_rotz, 0.0, 0.0, 1.0);
}
-
void RenderScene()
{
- glPushMatrix();
- glTranslatef(-3.0, -2.0, 0.0);
- glRotatef(fAngle, 0.0, 0.0, 1.0);
- drawGearGL(1);
- glPopMatrix();
-
- glPushMatrix();
- glTranslatef(3.1f, -2.0f, 0.0f);
- glRotatef(-2.0 * fAngle - 9.0, 0.0, 0.0, 1.0);
- drawGearGL(2);
- glPopMatrix();
-
- glPushMatrix();
- glTranslatef(-3.1f, 2.2f, -1.8f);
- glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
- glRotatef(2.0 * fAngle - 2.0, 0.0, 0.0, 1.0);
- drawGearGL(3);
- glPopMatrix();
+ glPushMatrix();
+ glTranslatef(-3.0, -2.0, 0.0);
+ glRotatef(fAngle, 0.0, 0.0, 1.0);
+ drawGearGL(1);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(3.1f, -2.0f, 0.0f);
+ glRotatef(-2.0 * fAngle - 9.0, 0.0, 0.0, 1.0);
+ drawGearGL(2);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(-3.1f, 2.2f, -1.8f);
+ glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
+ glRotatef(2.0 * fAngle - 2.0, 0.0, 0.0, 1.0);
+ drawGearGL(3);
+ glPopMatrix();
}
-
static void View(GHOST_IWindow *window, bool stereo, int eye = 0)
{
- window->activateDrawingContext();
- GHOST_Rect bnds;
- int noOfScanlines = 0, lowerScanline = 0;
- /* hard coded for testing purposes, display device dependent */
- int verticalBlankingInterval = 32;
- float left, right, bottom, top;
- float nearplane, farplane, zeroPlane, distance;
- float eyeSeparation = 0.62f;
- window->getClientBounds(bnds);
-
- // viewport
- if (stereo)
- {
- if (nVidiaWindows)
- {
- // handled by nVidia driver so act as normal (explicitly put here since
- // it -is- stereo)
- glViewport(0, 0, bnds.getWidth(), bnds.getHeight());
- }
- else { // generic cross platform above-below stereo
- noOfScanlines = (bnds.getHeight() - verticalBlankingInterval) / 2;
- switch (eye)
- {
- case LEFT_EYE:
- // upper half of window
- lowerScanline = bnds.getHeight() - noOfScanlines;
- break;
- case RIGHT_EYE:
- // lower half of window
- lowerScanline = 0;
- break;
- }
- }
- }
- else {
- noOfScanlines = bnds.getHeight();
- lowerScanline = 0;
- }
-
- glViewport(0, lowerScanline, bnds.getWidth(), noOfScanlines);
-
- // projection
- left = -6.0;
- right = 6.0;
- bottom = -4.8f;
- top = 4.8f;
- nearplane = 5.0;
- farplane = 60.0;
-
- if (stereo)
- {
- zeroPlane = 0.0;
- distance = 14.5;
- switch (eye)
- {
- case LEFT_EYE:
- StereoProjection(left, right, bottom, top, nearplane, farplane, zeroPlane, distance, -eyeSeparation / 2.0);
- break;
- case RIGHT_EYE:
- StereoProjection(left, right, bottom, top, nearplane, farplane, zeroPlane, distance, eyeSeparation / 2.0);
- break;
- }
- }
- else {
-// left = -w;
-// right = w;
-// bottom = -h;
-// top = h;
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glFrustum(left, right, bottom, top, 5.0, 60.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glTranslatef(0.0, 0.0, -40.0);
-
- }
-
- glClearColor(.2f, 0.0f, 0.0f, 0.0f);
+ window->activateDrawingContext();
+ GHOST_Rect bnds;
+ int noOfScanlines = 0, lowerScanline = 0;
+ /* hard coded for testing purposes, display device dependent */
+ int verticalBlankingInterval = 32;
+ float left, right, bottom, top;
+ float nearplane, farplane, zeroPlane, distance;
+ float eyeSeparation = 0.62f;
+ window->getClientBounds(bnds);
+
+ // viewport
+ if (stereo) {
+ if (nVidiaWindows) {
+ // handled by nVidia driver so act as normal (explicitly put here since
+ // it -is- stereo)
+ glViewport(0, 0, bnds.getWidth(), bnds.getHeight());
+ }
+ else { // generic cross platform above-below stereo
+ noOfScanlines = (bnds.getHeight() - verticalBlankingInterval) / 2;
+ switch (eye) {
+ case LEFT_EYE:
+ // upper half of window
+ lowerScanline = bnds.getHeight() - noOfScanlines;
+ break;
+ case RIGHT_EYE:
+ // lower half of window
+ lowerScanline = 0;
+ break;
+ }
+ }
+ }
+ else {
+ noOfScanlines = bnds.getHeight();
+ lowerScanline = 0;
+ }
+
+ glViewport(0, lowerScanline, bnds.getWidth(), noOfScanlines);
+
+ // projection
+ left = -6.0;
+ right = 6.0;
+ bottom = -4.8f;
+ top = 4.8f;
+ nearplane = 5.0;
+ farplane = 60.0;
+
+ if (stereo) {
+ zeroPlane = 0.0;
+ distance = 14.5;
+ switch (eye) {
+ case LEFT_EYE:
+ StereoProjection(left,
+ right,
+ bottom,
+ top,
+ nearplane,
+ farplane,
+ zeroPlane,
+ distance,
+ -eyeSeparation / 2.0);
+ break;
+ case RIGHT_EYE:
+ StereoProjection(left,
+ right,
+ bottom,
+ top,
+ nearplane,
+ farplane,
+ zeroPlane,
+ distance,
+ eyeSeparation / 2.0);
+ break;
+ }
+ }
+ else {
+ // left = -w;
+ // right = w;
+ // bottom = -h;
+ // top = h;
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(left, right, bottom, top, 5.0, 60.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -40.0);
+ }
+
+ glClearColor(.2f, 0.0f, 0.0f, 0.0f);
}
-
-void StereoProjection(float left, float right, float bottom, float top, float nearplane, float farplane,
- float zero_plane, float dist,
- float eye)
+void StereoProjection(float left,
+ float right,
+ float bottom,
+ float top,
+ float nearplane,
+ float farplane,
+ float zero_plane,
+ float dist,
+ float eye)
/* Perform the perspective projection for one eye's subfield.
* The projection is in the direction of the negative z axis.
*
@@ -357,395 +369,380 @@ void StereoProjection(float left, float right, float bottom, float top, float ne
* negative for the left eye subfield.
*/
{
- float xmid, ymid, clip_near, clip_far, topw, bottomw, leftw, rightw,
- dx, dy, n_over_d;
+ float xmid, ymid, clip_near, clip_far, topw, bottomw, leftw, rightw, dx, dy, n_over_d;
- dx = right - left;
- dy = top - bottom;
+ dx = right - left;
+ dy = top - bottom;
- xmid = (right + left) / 2.0;
- ymid = (top + bottom) / 2.0;
+ xmid = (right + left) / 2.0;
+ ymid = (top + bottom) / 2.0;
- clip_near = dist + zero_plane - nearplane;
- clip_far = dist + zero_plane - farplane;
+ clip_near = dist + zero_plane - nearplane;
+ clip_far = dist + zero_plane - farplane;
- n_over_d = clip_near / dist;
+ n_over_d = clip_near / dist;
- topw = n_over_d * dy / 2.0;
- bottomw = -topw;
- rightw = n_over_d * (dx / 2.0 - eye);
- leftw = n_over_d * (-dx / 2.0 - eye);
+ topw = n_over_d * dy / 2.0;
+ bottomw = -topw;
+ rightw = n_over_d * (dx / 2.0 - eye);
+ leftw = n_over_d * (-dx / 2.0 - eye);
- /* Need to be in projection mode for this. */
- glLoadIdentity();
- glFrustum(leftw, rightw, bottomw, topw, clip_near, clip_far);
+ /* Need to be in projection mode for this. */
+ glLoadIdentity();
+ glFrustum(leftw, rightw, bottomw, topw, clip_near, clip_far);
- glTranslatef(-xmid - eye, -ymid, -zero_plane - dist);
- return;
+ glTranslatef(-xmid - eye, -ymid, -zero_plane - dist);
+ return;
} /* stereoproj */
-
class Application : public GHOST_IEventConsumer {
-public:
- Application(GHOST_ISystem *system);
- ~Application(void);
- virtual bool processEvent(GHOST_IEvent *event);
-
- GHOST_ISystem *m_system;
- GHOST_IWindow *m_mainWindow;
- GHOST_IWindow *m_secondaryWindow;
- GHOST_IWindow *m_fullScreenWindow;
- GHOST_ITimerTask *m_gearsTimer, *m_testTimer;
- GHOST_TStandardCursor m_cursor;
- bool m_exitRequested;
-
- bool stereo;
+ public:
+ Application(GHOST_ISystem *system);
+ ~Application(void);
+ virtual bool processEvent(GHOST_IEvent *event);
+
+ GHOST_ISystem *m_system;
+ GHOST_IWindow *m_mainWindow;
+ GHOST_IWindow *m_secondaryWindow;
+ GHOST_IWindow *m_fullScreenWindow;
+ GHOST_ITimerTask *m_gearsTimer, *m_testTimer;
+ GHOST_TStandardCursor m_cursor;
+ bool m_exitRequested;
+
+ bool stereo;
};
-
Application::Application(GHOST_ISystem *system)
- : m_system(system), m_mainWindow(0), m_secondaryWindow(0), m_fullScreenWindow(0),
- m_gearsTimer(0), m_testTimer(0), m_cursor(GHOST_kStandardCursorFirstCursor),
- m_exitRequested(false), stereo(false)
+ : m_system(system),
+ m_mainWindow(0),
+ m_secondaryWindow(0),
+ m_fullScreenWindow(0),
+ m_gearsTimer(0),
+ m_testTimer(0),
+ m_cursor(GHOST_kStandardCursorFirstCursor),
+ m_exitRequested(false),
+ stereo(false)
{
- GHOST_GLSettings glSettings = {0};
- fApp = this;
-
- // Create the main window
- STR_String title1("gears - main window");
- m_mainWindow = system->createWindow(
- title1,
- 10, 64, 320, 200,
- GHOST_kWindowStateNormal,
- GHOST_kDrawingContextTypeOpenGL,
- glSettings);
-
- if (!m_mainWindow) {
- std::cout << "could not create main window\n";
- exit(-1);
- }
-
- // Create a secondary window
- STR_String title2("gears - secondary window");
- m_secondaryWindow = system->createWindow(
- title2,
- 340, 64, 320, 200,
- GHOST_kWindowStateNormal,
- GHOST_kDrawingContextTypeOpenGL,
- glSettings);
- if (!m_secondaryWindow) {
- std::cout << "could not create secondary window\n";
- exit(-1);
- }
-
- // Install a timer to have the gears running
- m_gearsTimer = system->installTimer(0 /*delay*/, 20 /*interval*/, gearsTimerProc, m_mainWindow);
+ GHOST_GLSettings glSettings = {0};
+ fApp = this;
+
+ // Create the main window
+ STR_String title1("gears - main window");
+ m_mainWindow = system->createWindow(title1,
+ 10,
+ 64,
+ 320,
+ 200,
+ GHOST_kWindowStateNormal,
+ GHOST_kDrawingContextTypeOpenGL,
+ glSettings);
+
+ if (!m_mainWindow) {
+ std::cout << "could not create main window\n";
+ exit(-1);
+ }
+
+ // Create a secondary window
+ STR_String title2("gears - secondary window");
+ m_secondaryWindow = system->createWindow(title2,
+ 340,
+ 64,
+ 320,
+ 200,
+ GHOST_kWindowStateNormal,
+ GHOST_kDrawingContextTypeOpenGL,
+ glSettings);
+ if (!m_secondaryWindow) {
+ std::cout << "could not create secondary window\n";
+ exit(-1);
+ }
+
+ // Install a timer to have the gears running
+ m_gearsTimer = system->installTimer(0 /*delay*/, 20 /*interval*/, gearsTimerProc, m_mainWindow);
}
-
Application::~Application(void)
{
- // Dispose windows
- if (m_system->validWindow(m_mainWindow)) {
- m_system->disposeWindow(m_mainWindow);
- }
- if (m_system->validWindow(m_secondaryWindow)) {
- m_system->disposeWindow(m_secondaryWindow);
- }
+ // Dispose windows
+ if (m_system->validWindow(m_mainWindow)) {
+ m_system->disposeWindow(m_mainWindow);
+ }
+ if (m_system->validWindow(m_secondaryWindow)) {
+ m_system->disposeWindow(m_secondaryWindow);
+ }
}
-
bool Application::processEvent(GHOST_IEvent *event)
{
- GHOST_IWindow *window = event->getWindow();
- bool handled = true;
+ GHOST_IWindow *window = event->getWindow();
+ bool handled = true;
- switch (event->getType()) {
+ switch (event->getType()) {
#if 0
- case GHOST_kEventUnknown:
- break;
- case GHOST_kEventCursorButton:
- std::cout << "GHOST_kEventCursorButton"; break;
- case GHOST_kEventCursorMove:
- std::cout << "GHOST_kEventCursorMove"; break;
+ case GHOST_kEventUnknown:
+ break;
+ case GHOST_kEventCursorButton:
+ std::cout << "GHOST_kEventCursorButton"; break;
+ case GHOST_kEventCursorMove:
+ std::cout << "GHOST_kEventCursorMove"; break;
#endif
- case GHOST_kEventWheel:
- {
- GHOST_TEventWheelData *wheelData = (GHOST_TEventWheelData *) event->getData();
- if (wheelData->z > 0)
- {
- view_rotz += 5.f;
- }
- else {
- view_rotz -= 5.f;
- }
- }
- break;
-
- case GHOST_kEventKeyUp:
- break;
-
- case GHOST_kEventKeyDown:
- {
- GHOST_TEventKeyData *keyData = (GHOST_TEventKeyData *) event->getData();
- switch (keyData->key) {
- case GHOST_kKeyC:
- {
- int cursor = m_cursor;
- cursor++;
- if (cursor >= GHOST_kStandardCursorNumCursors) {
- cursor = GHOST_kStandardCursorFirstCursor;
- }
- m_cursor = (GHOST_TStandardCursor)cursor;
- window->setCursorShape(m_cursor);
- }
- break;
-
- case GHOST_kKeyE:
- {
- int x = 200, y = 200;
- m_system->setCursorPosition(x, y);
- break;
- }
-
- case GHOST_kKeyF:
- if (!m_system->getFullScreen()) {
- // Begin fullscreen mode
- GHOST_DisplaySetting setting;
-
- setting.bpp = 16;
- setting.frequency = 50;
- setting.xPixels = 640;
- setting.yPixels = 480;
- m_system->beginFullScreen(setting, &m_fullScreenWindow, false /* stereo flag */);
- }
- else {
- m_system->endFullScreen();
- m_fullScreenWindow = 0;
- }
- break;
-
- case GHOST_kKeyH:
- window->setCursorVisibility(!window->getCursorVisibility());
- break;
-
- case GHOST_kKeyM:
- {
- bool down = false;
- m_system->getModifierKeyState(GHOST_kModifierKeyLeftShift, down);
- if (down) {
- std::cout << "left shift down\n";
- }
- m_system->getModifierKeyState(GHOST_kModifierKeyRightShift, down);
- if (down) {
- std::cout << "right shift down\n";
- }
- m_system->getModifierKeyState(GHOST_kModifierKeyLeftAlt, down);
- if (down) {
- std::cout << "left Alt down\n";
- }
- m_system->getModifierKeyState(GHOST_kModifierKeyRightAlt, down);
- if (down) {
- std::cout << "right Alt down\n";
- }
- m_system->getModifierKeyState(GHOST_kModifierKeyLeftControl, down);
- if (down) {
- std::cout << "left control down\n";
- }
- m_system->getModifierKeyState(GHOST_kModifierKeyRightControl, down);
- if (down) {
- std::cout << "right control down\n";
- }
- }
- break;
-
- case GHOST_kKeyQ:
- if (m_system->getFullScreen())
- {
- m_system->endFullScreen();
- m_fullScreenWindow = 0;
- }
- m_exitRequested = true;
- break;
-
- case GHOST_kKeyS: // toggle mono and stereo
- if (stereo)
- stereo = false;
- else
- stereo = true;
- break;
-
- case GHOST_kKeyT:
- if (!m_testTimer) {
- m_testTimer = m_system->installTimer(0, 1000, testTimerProc);
- }
-
- else {
- m_system->removeTimer(m_testTimer);
- m_testTimer = 0;
- }
-
- break;
-
- case GHOST_kKeyW:
- if (m_mainWindow)
- {
- STR_String title;
- m_mainWindow->getTitle(title);
- title += "-";
- m_mainWindow->setTitle(title);
-
- }
- break;
-
- default:
- break;
- }
- }
- break;
-
- case GHOST_kEventWindowClose:
- {
- GHOST_IWindow *window2 = event->getWindow();
- if (window2 == m_mainWindow) {
- m_exitRequested = true;
- }
- else {
- m_system->disposeWindow(window2);
- }
- }
- break;
-
- case GHOST_kEventWindowActivate:
- handled = false;
- break;
-
- case GHOST_kEventWindowDeactivate:
- handled = false;
- break;
-
- case GHOST_kEventWindowUpdate:
- {
- GHOST_IWindow *window2 = event->getWindow();
- if (!m_system->validWindow(window2))
- break;
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- if (stereo)
- {
- View(window2, stereo, LEFT_EYE);
- glPushMatrix();
- RenderCamera();
- RenderScene();
- glPopMatrix();
-
- View(window2, stereo, RIGHT_EYE);
- glPushMatrix();
- RenderCamera();
- RenderScene();
- glPopMatrix();
- }
- else {
- View(window2, stereo);
- glPushMatrix();
- RenderCamera();
- RenderScene();
- glPopMatrix();
- }
- window2->swapBuffers();
- }
- break;
-
- default:
- handled = false;
- break;
- }
- return handled;
+ case GHOST_kEventWheel: {
+ GHOST_TEventWheelData *wheelData = (GHOST_TEventWheelData *)event->getData();
+ if (wheelData->z > 0) {
+ view_rotz += 5.f;
+ }
+ else {
+ view_rotz -= 5.f;
+ }
+ } break;
+
+ case GHOST_kEventKeyUp:
+ break;
+
+ case GHOST_kEventKeyDown: {
+ GHOST_TEventKeyData *keyData = (GHOST_TEventKeyData *)event->getData();
+ switch (keyData->key) {
+ case GHOST_kKeyC: {
+ int cursor = m_cursor;
+ cursor++;
+ if (cursor >= GHOST_kStandardCursorNumCursors) {
+ cursor = GHOST_kStandardCursorFirstCursor;
+ }
+ m_cursor = (GHOST_TStandardCursor)cursor;
+ window->setCursorShape(m_cursor);
+ } break;
+
+ case GHOST_kKeyE: {
+ int x = 200, y = 200;
+ m_system->setCursorPosition(x, y);
+ break;
+ }
+
+ case GHOST_kKeyF:
+ if (!m_system->getFullScreen()) {
+ // Begin fullscreen mode
+ GHOST_DisplaySetting setting;
+
+ setting.bpp = 16;
+ setting.frequency = 50;
+ setting.xPixels = 640;
+ setting.yPixels = 480;
+ m_system->beginFullScreen(setting, &m_fullScreenWindow, false /* stereo flag */);
+ }
+ else {
+ m_system->endFullScreen();
+ m_fullScreenWindow = 0;
+ }
+ break;
+
+ case GHOST_kKeyH:
+ window->setCursorVisibility(!window->getCursorVisibility());
+ break;
+
+ case GHOST_kKeyM: {
+ bool down = false;
+ m_system->getModifierKeyState(GHOST_kModifierKeyLeftShift, down);
+ if (down) {
+ std::cout << "left shift down\n";
+ }
+ m_system->getModifierKeyState(GHOST_kModifierKeyRightShift, down);
+ if (down) {
+ std::cout << "right shift down\n";
+ }
+ m_system->getModifierKeyState(GHOST_kModifierKeyLeftAlt, down);
+ if (down) {
+ std::cout << "left Alt down\n";
+ }
+ m_system->getModifierKeyState(GHOST_kModifierKeyRightAlt, down);
+ if (down) {
+ std::cout << "right Alt down\n";
+ }
+ m_system->getModifierKeyState(GHOST_kModifierKeyLeftControl, down);
+ if (down) {
+ std::cout << "left control down\n";
+ }
+ m_system->getModifierKeyState(GHOST_kModifierKeyRightControl, down);
+ if (down) {
+ std::cout << "right control down\n";
+ }
+ } break;
+
+ case GHOST_kKeyQ:
+ if (m_system->getFullScreen()) {
+ m_system->endFullScreen();
+ m_fullScreenWindow = 0;
+ }
+ m_exitRequested = true;
+ break;
+
+ case GHOST_kKeyS: // toggle mono and stereo
+ if (stereo)
+ stereo = false;
+ else
+ stereo = true;
+ break;
+
+ case GHOST_kKeyT:
+ if (!m_testTimer) {
+ m_testTimer = m_system->installTimer(0, 1000, testTimerProc);
+ }
+
+ else {
+ m_system->removeTimer(m_testTimer);
+ m_testTimer = 0;
+ }
+
+ break;
+
+ case GHOST_kKeyW:
+ if (m_mainWindow) {
+ STR_String title;
+ m_mainWindow->getTitle(title);
+ title += "-";
+ m_mainWindow->setTitle(title);
+ }
+ break;
+
+ default:
+ break;
+ }
+ } break;
+
+ case GHOST_kEventWindowClose: {
+ GHOST_IWindow *window2 = event->getWindow();
+ if (window2 == m_mainWindow) {
+ m_exitRequested = true;
+ }
+ else {
+ m_system->disposeWindow(window2);
+ }
+ } break;
+
+ case GHOST_kEventWindowActivate:
+ handled = false;
+ break;
+
+ case GHOST_kEventWindowDeactivate:
+ handled = false;
+ break;
+
+ case GHOST_kEventWindowUpdate: {
+ GHOST_IWindow *window2 = event->getWindow();
+ if (!m_system->validWindow(window2))
+ break;
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (stereo) {
+ View(window2, stereo, LEFT_EYE);
+ glPushMatrix();
+ RenderCamera();
+ RenderScene();
+ glPopMatrix();
+
+ View(window2, stereo, RIGHT_EYE);
+ glPushMatrix();
+ RenderCamera();
+ RenderScene();
+ glPopMatrix();
+ }
+ else {
+ View(window2, stereo);
+ glPushMatrix();
+ RenderCamera();
+ RenderScene();
+ glPopMatrix();
+ }
+ window2->swapBuffers();
+ } break;
+
+ default:
+ handled = false;
+ break;
+ }
+ return handled;
}
-
int main(int /*argc*/, char ** /*argv*/)
{
- nVidiaWindows = false;
-// nVidiaWindows = true;
+ nVidiaWindows = false;
+ // nVidiaWindows = true;
#ifdef WIN32
- /* Set a couple of settings in the registry for the nVidia detonator driver.
- * So this is very specific...
- */
- if (nVidiaWindows)
- {
- LONG lresult;
- HKEY hkey = 0;
- DWORD dwd = 0;
- //unsigned char buffer[128];
-
- CRegKey regkey;
- //DWORD keyValue;
-// lresult = regkey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\NVIDIA Corporation\\Global\\Stereo3D\\StereoEnable");
- lresult = regkey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\NVIDIA Corporation\\Global\\Stereo3D\\StereoEnable",
- KEY_ALL_ACCESS);
-
- if (lresult == ERROR_SUCCESS)
- printf("Successfully opened key\n");
-#if 0
- lresult = regkey.QueryValue(&keyValue, "StereoEnable");
- if (lresult == ERROR_SUCCESS)
- printf("Successfully queried key\n");
-#endif
- lresult = regkey.SetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\NVIDIA Corporation\\Global\\Stereo3D\\StereoEnable",
- "1");
- if (lresult == ERROR_SUCCESS)
- printf("Successfully set value for key\n");
- regkey.Close();
- if (lresult == ERROR_SUCCESS)
- printf("Successfully closed key\n");
-// regkey.Write("2");
- }
+ /* Set a couple of settings in the registry for the nVidia detonator driver.
+ * So this is very specific...
+ */
+ if (nVidiaWindows) {
+ LONG lresult;
+ HKEY hkey = 0;
+ DWORD dwd = 0;
+ //unsigned char buffer[128];
+
+ CRegKey regkey;
+ //DWORD keyValue;
+ // lresult = regkey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE\\NVIDIA Corporation\\Global\\Stereo3D\\StereoEnable");
+ lresult = regkey.Open(HKEY_LOCAL_MACHINE,
+ "SOFTWARE\\NVIDIA Corporation\\Global\\Stereo3D\\StereoEnable",
+ KEY_ALL_ACCESS);
+
+ if (lresult == ERROR_SUCCESS)
+ printf("Successfully opened key\n");
+# if 0
+ lresult = regkey.QueryValue(&keyValue, "StereoEnable");
+ if (lresult == ERROR_SUCCESS)
+ printf("Successfully queried key\n");
+# endif
+ lresult = regkey.SetValue(
+ HKEY_LOCAL_MACHINE, "SOFTWARE\\NVIDIA Corporation\\Global\\Stereo3D\\StereoEnable", "1");
+ if (lresult == ERROR_SUCCESS)
+ printf("Successfully set value for key\n");
+ regkey.Close();
+ if (lresult == ERROR_SUCCESS)
+ printf("Successfully closed key\n");
+ // regkey.Write("2");
+ }
#endif // WIN32
- // Create the system
- GHOST_ISystem::createSystem();
- fSystem = GHOST_ISystem::getSystem();
+ // Create the system
+ GHOST_ISystem::createSystem();
+ fSystem = GHOST_ISystem::getSystem();
- if (fSystem) {
- // Create an application object
- Application app(fSystem);
+ if (fSystem) {
+ // Create an application object
+ Application app(fSystem);
- // Add the application as event consumer
- fSystem->addEventConsumer(&app);
+ // Add the application as event consumer
+ fSystem->addEventConsumer(&app);
- // Enter main loop
- while (!app.m_exitRequested) {
- //printf("main: loop\n");
- fSystem->processEvents(true);
- fSystem->dispatchEvents();
- }
+ // Enter main loop
+ while (!app.m_exitRequested) {
+ //printf("main: loop\n");
+ fSystem->processEvents(true);
+ fSystem->dispatchEvents();
+ }
- // Remove so ghost doesn't do a double free
- fSystem->removeEventConsumer(&app);
- }
+ // Remove so ghost doesn't do a double free
+ fSystem->removeEventConsumer(&app);
+ }
- // Dispose the system
- GHOST_ISystem::disposeSystem();
+ // Dispose the system
+ GHOST_ISystem::disposeSystem();
- return 0;
+ return 0;
}
-
static void gearsTimerProc(GHOST_ITimerTask *task, GHOST_TUns64 /*time*/)
{
- fAngle += 2.0;
- view_roty += 1.0;
- GHOST_IWindow *window = (GHOST_IWindow *)task->getUserData();
- if (fApp->m_fullScreenWindow) {
- // Running full screen
- fApp->m_fullScreenWindow->invalidate();
- }
- else {
- if (fSystem->validWindow(window)) {
- window->invalidate();
- }
- }
+ fAngle += 2.0;
+ view_roty += 1.0;
+ GHOST_IWindow *window = (GHOST_IWindow *)task->getUserData();
+ if (fApp->m_fullScreenWindow) {
+ // Running full screen
+ fApp->m_fullScreenWindow->invalidate();
+ }
+ else {
+ if (fSystem->validWindow(window)) {
+ window->invalidate();
+ }
+ }
}