00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "gzGizmo3DLibrary.h"
00024
00025 #include <ctype.h>
00026
00027
00028
00029
00030
00031 class CubeApp : public gzApplication
00032 {
00033 public:
00034
00035 CubeApp();
00036 ~CubeApp();
00037 void Create(gzBool bOrthoCamera, gzBool bFullScreen, gzBool bTwoSideLighting);
00038 void onIdle();
00039
00040 private:
00041 gzNode *MakeCube();
00042
00043 gzWindow *m_win;
00044 gzReal m_angle;
00045 gzTransform *m_redTransform;
00046 gzTransform *m_greenTransform;
00047 int m_frame;
00048 };
00049
00050
00051 int main(int argc, char *argv[])
00052 {
00053 gzStartUpGizmo();
00054
00055 gzBool bOrthoCamera = FALSE;
00056 gzBool bFullScreen = FALSE;
00057 gzBool bTwoSideLighting = FALSE;
00058
00059 if(argc > 1)
00060 {
00061 argv++;
00062 argc--;
00063 while(argc > 0)
00064 {
00065 if(argv[0][0] == '-')
00066 {
00067 switch(toupper(argv[0][1]))
00068 {
00069 case 'F':
00070 bFullScreen = TRUE;
00071 break;
00072 case 'O':
00073 bOrthoCamera = TRUE;
00074 break;
00075 case '2':
00076 bTwoSideLighting = TRUE;
00077 break;
00078 }
00079 }
00080 argv++;
00081 argc--;
00082 }
00083 }
00084
00085
00086 CubeApp app;
00087 try
00088 {
00089
00090 app.Create(bOrthoCamera, bFullScreen, bTwoSideLighting);
00091
00092
00093 app.run();
00094
00095 }
00096 catch(gzBaseError &error)
00097 {
00098 error.reportError();
00099 }
00100
00101 gzShutDownGizmo();
00102
00103 return 0;
00104 }
00105
00106 CubeApp::CubeApp()
00107 : m_win(NULL), m_frame(0), m_angle(0)
00108 {
00109 }
00110
00111 CubeApp::~CubeApp()
00112 {
00113 if(m_win)
00114 delete m_win;
00115 }
00116
00117
00118 void CubeApp::Create(gzBool bOrthoCamera, gzBool bFullScreen, gzBool bTwoSideLighting)
00119 {
00120
00121
00122 gzGraphicsEngine::useEngine(GZ_ENGINE_OPENGL);
00123
00124
00125 gzScene *scene=new gzScene();
00126
00127 #ifdef GZ_DEBUG // Add axis in debug mode
00128 scene->addNode(new gzGeometryAxis(10,1));
00129 #endif
00130
00131
00132 gzEnvironment * env = new gzEnvironment();
00133
00134 gzLight *pointlight = new gzLight();
00135
00136 pointlight->setPosition(0, 0, 0);
00137
00138 env->addLight(pointlight);
00139
00140
00141 scene->addNode(env);
00142
00143
00144 gzState *state=new gzState;
00145
00146 state->setMode(GZ_STATE_POLYGON_MODE,GZ_STATE_ON);
00147
00148 state->setBackPolygonMode(GZ_POLYGON_MODE_FILL);
00149
00150
00151 env->setState(state);
00152
00153
00154
00155
00156
00157
00158 gzMaterial *redMaterial = new gzMaterial();
00159
00160 redMaterial->setAmbient(0.16f , 0.16f, 0.16f , 0.5f);
00161
00162 redMaterial->setSpecular(1.0f, 1.0f, 1.0f,1.0f);
00163
00164 redMaterial->setDiffuse(0.8f, 0.1f, 0.1f, 0.5f);
00165
00166 redMaterial->setEmission(0 , 0, 0, 0.5f);
00167
00168 redMaterial->setShininess(16);
00169
00170
00171 gzState* redState=new gzState;
00172
00173 redState->setMaterial(redMaterial);
00174
00175 redState->setMode(GZ_STATE_MATERIAL,GZ_STATE_ON);
00176
00177 redState->setBlendFunction( GZ_BLEND_SRC_ALPHA, GZ_BLEND_ONE_MINUS_SRC_ALPHA);
00178
00179 redState->setMode(GZ_STATE_BLENDING,GZ_STATE_ON);
00180 redState->setSeparateFrontAndBackRender(TRUE);
00181
00182
00183 gzNode *cubeShape = MakeCube();
00184
00185
00186 m_redTransform=new gzTransform;
00187
00188 m_redTransform->setTranslation(0.0f, 0.0f, -5.0f);
00189
00190 m_redTransform->setState(redState);
00191
00192 m_redTransform->addNode(cubeShape);
00193
00194 env->addNode(m_redTransform);
00195
00196
00197
00198
00199
00200
00201 gzMaterial *greenMaterial = new gzMaterial();
00202
00203 greenMaterial->setAmbient(0.16f , 0.16f, 0.16f , 0.5f);
00204
00205 greenMaterial->setDiffuse(0.1f, 0.8f, 0.1f, 0.5f);
00206
00207 greenMaterial->setEmission(0 , 0, 0, 0.5f);
00208
00209 greenMaterial->setShininess(16);
00210
00211
00212 gzState* greenState=new gzState;
00213
00214 greenState->setMaterial(greenMaterial);
00215
00216 greenState->setMode(GZ_STATE_MATERIAL,GZ_STATE_ON);
00217
00218
00219 m_greenTransform=new gzTransform;
00220
00221 m_greenTransform->setState(greenState);
00222
00223 m_greenTransform->setTranslation(0.5f, 0.1f, -6.0f);
00224
00225
00226 m_greenTransform->addNode(cubeShape);
00227
00228 env->addNode(m_greenTransform);
00229
00230 gzGraphicsFormat *format=NULL;
00231 if (bFullScreen)
00232 {
00233
00234 format = new gzGraphicsFormat;
00235 format->useFullScreen(TRUE);
00236 format->setFullScreenWidth(800);
00237 }
00238
00239
00240
00241
00242
00243 m_win=new gzWindow("Cube",NULL, format);
00244
00245
00246 if (!bFullScreen)
00247 m_win->setSize(600, 600);
00248
00249 if (bTwoSideLighting)
00250 gzEnvironment::setTwoSideLighting(m_win->getContext(),TRUE);
00251
00252
00253 gzCamera *cam;
00254
00255 if (bOrthoCamera)
00256 {
00257
00258 gzOrthoCamera *orthoCam = new gzOrthoCamera;
00259
00260 orthoCam->setWidth(4.0f);
00261 orthoCam->setHeight(4.0f);
00262 cam = orthoCam;
00263 }
00264 else
00265 {
00266
00267 gzPerspCamera *perspCam = new gzPerspCamera;
00268 cam = perspCam;
00269 }
00270
00271
00272 cam->setPosition(0,0,8);
00273
00274 cam->setScene(scene);
00275
00276 m_win->setCamera(cam);
00277
00278 m_win->refreshWindow();
00279 }
00280
00281
00282 void CubeApp::onIdle()
00283 {
00284
00285 m_angle+=(gzReal)0.2;
00286
00287 if (m_angle > 360)
00288 m_angle = 0;
00289
00290
00291 m_redTransform->setRotation(gzVec3(1.0f, 1.0f, 0.0f), m_angle);
00292 m_greenTransform->setRotation(gzVec3(0.5f, 0.1f, 1.0f), m_angle);
00293
00294
00295 m_win->refreshWindow();
00296
00297 if (m_frame++>700)
00298 {
00299
00300 printf("Frame Rate:%d\n",(int)m_win->getFrameRate());
00301 m_frame=0;
00302 }
00303 }
00304
00305
00306 gzNode *CubeApp::MakeCube()
00307 {
00308
00309 static gzVec3 cubeCoords[] =
00310 {
00311 gzVec3(-1,-1,-1),gzVec3(1,-1,-1),gzVec3(1,1,-1),gzVec3(-1,1,-1),
00312 gzVec3(-1,-1,1),gzVec3(1,-1,1),gzVec3(1,1,1),gzVec3(-1,1,1)
00313 };
00314
00315
00316
00317 static gzULong indexList[] =
00318 {
00319 1,0,3,
00320 3,2,1,
00321 4,5,6,
00322 6,7,4,
00323 5,1,2,
00324 2,6,5,
00325 0,4,7,
00326 7,3,0,
00327 7,6,2,
00328 2,3,7,
00329 0,1,5,
00330 5,4,0
00331 };
00332
00333
00334 static gzULong numberOfTris=sizeof(indexList)/3/sizeof(gzULong);
00335
00336
00337 gzTriGeometry *shape = new gzTriGeometry();
00338
00339 shape->setSize(numberOfTris);
00340
00341
00342
00343
00344
00345
00346
00347 for (gzULong i = 0; i < numberOfTris; i++)
00348 {
00349
00350 shape->setTri(i,cubeCoords[indexList[i*3]],cubeCoords[indexList[i*3+1]],cubeCoords[indexList[i*3+2]]);
00351 }
00352
00353 gzGeometryOptimizer::optimize(shape);
00354
00355
00356 return shape;
00357 }