|
|
http://picasaweb.google.com/lh/p ... sbQ?feat=directlink
- #include<hgl/win.h>
- #include<hgl/OpenGL.H>
- #include<hgl/FlowObject.H>
- #include<hgl/Matrix.H>
- #include<hgl/TileFont.H>
-
- const float corners[]= //????8??????
- {
- -25.0f, 25.0f, 25.0f,
- 25.0f, 25.0f, 25.0f,
- 25.0f,-25.0f, 25.0f,
- -25.0f,-25.0f, 25.0f,
- -25.0f, 25.0f,-25.0f,
- 25.0f, 25.0f,-25.0f,
- 25.0f,-25.0f,-25.0f,
- -25.0f,-25.0f,-25.0f
- };
-
- enum WORK_MODE //??????
- {
- wmMove=0, //??
- wmScale, //??
- wmRotate //??
- };
-
- wchar_t *WORK_NAME[]=
- {
- L"Move",
- L"Scale",
- L"Rotate"
- };
-
- using namespace hgl;
- class TestObject:public FlowObject
- {
- TileFont *fnt;
-
- Matrix m; //????????
- Vertex3f move,scale,rotate;
-
- Vertex3f coord[8];
- int index[24];
-
- WORK_MODE mode;
- wchar_t axis;
-
- bool use_hard;
-
- /* 4 5
- *---------------*
- /| /|
- 0 / | 1 / |
- *--+------------* |
- | | | |
- | | | | 6
- | *------------+--*
- | / 7 | /
- |/ |/
- *---------------*
- 3 2
- */
-
- private:
-
- void DrawBox()
- {
- int *p=index;
-
- for(int i=0;i<6;i++)
- {
- glBegin(GL_LINE_LOOP);
- for(int j=0;j<4;j++)
- glVertex3fv(coord[*p++]);
- glEnd();
- }
- }
-
- bool KeyDownProc(uint key)
- {
- switch(key)
- {
- case kbM:
- case kbT: mode =wmMove;break; // T/M ??????
- case kbS: mode =wmScale;break; // S ??????
- case kbR: mode =wmRotate;break; // R ??????
-
- case kbX: axis ='X';break; // X ??X?
- case kbY: axis ='Y';break; // Y ??Y?
- case kbZ: axis ='Z';break; // Z ??Z?
-
- case kbSpace:
- case kbEnter: move.Zero(); // ??/?? ????
- scale.One();
- rotate.Zero();
- break;
-
- case kbH: use_hard=!use_hard;break; // ????????
-
- default: return(false);
- }
-
- return(true);
- }
-
- bool KeyPressProc(uint key)
- {
- float value=0;
-
- if(key==kbMinus )value=-1;else // - ???
- if(key==kbEquals)value= 1;else // + ???
- return(false);
-
- float *p;
-
- if(mode==wmMove )p=move;else
- if(mode==wmScale ){value/=10.0f;p=scale;}else
- if(mode==wmRotate )p=rotate;else
- return(false);
-
- if(axis=='X')*(p+0)+=value;else
- if(axis=='Y')*(p+1)+=value;else
- if(axis=='Z')*(p+2)+=value;else
- return(false);
-
- return(true);
- }
-
- public:
-
- TestObject()
- {
- const int indexes[]=
- {
- 0,1,2,3,
- 4,5,1,0,
- 3,2,6,7,
- 5,4,7,6,
- 1,5,6,2,
- 4,0,3,7
- };
-
- memcpy(index,indexes,sizeof(indexes));
-
- #ifdef __BORLANDC__
- OnKeyDown =KeyDownProc; //????????
- OnKeyPress=KeyPressProc; //????????
- #else
- SetEventCall(OnKeyDown, this,TestObject::KeyDownProc); //????????
- SetEventCall(OnKeyPress,this,TestObject::KeyPressProc); //????????
- #endif//
-
- fnt=GetFont(); //??????
-
- move.Zero();
- scale.One();
- rotate.Zero();
-
- mode=wmMove;
- axis='X';
-
- OpenLineSmooth(); //??????
- }
-
- void Draw()
- {
- ClearScreen();
- To3DMode();
- glTranslatef(0,0,-200);
-
- CloseTexture();
- OpenBlend(GL_SRC_ALPHA,GL_ONE);
- glColor(1,1,1,1);
- {
- memcpy(coord,corners,sizeof(corners)); //???????????
-
- m.LoadIdentity(); //??????
-
- m.Translate(move.x,move.y,move.z); //????
- m.Scale(scale.x,scale.y,scale.z); //????
-
- m.Rotate(rotate.x,1,0,0); //???X???
- m.Rotate(rotate.y,0,1,0); //???Y???
- m.Rotate(rotate.z,0,0,1); //???Z???
-
- if(use_hard)
- {
- //????????
-
- glMultMatrixf(m); //????OpenGL??
- }
- else
- {
- //??????
-
- for(int i=0;i<8;i++)
- coord[i]*=m; //???????????
- }
-
- DrawBox(); //??box
- }
-
- //???????
-
- To2DMode();
- int row=0;
- int gap=14;
-
- fnt->DrawFormat(0,row,L"Move : %6.2f,%6.2f,%6.2f",move.x, move.y, move.z); row+=gap;
- fnt->DrawFormat(0,row,L"Scale : %6.2f,%6.2f,%6.2f",scale.x, scale.y, scale.z); row+=gap;
- fnt->DrawFormat(0,row,L"Rotate: %6.2f,%6.2f,%6.2f",rotate.x,rotate.y, rotate.z); row+=gap;
- row+=gap;
-
- fnt->DrawFormat(0,row,L"Matrix * Vertex : %s",use_hard?L"OpenGL Hardware":L"Software");row+=gap;
- fnt->DrawFormat(0,row,L"Work Mode: %s",WORK_NAME[mode]);row+=gap;
- fnt->DrawFormat(0,row,L"Work Asix: %c",axis); row+=gap;
- row+=gap;
-
- for(int i=0;i<4;i++)
- {
- float *p=m.m+i*4;
-
- fnt->DrawFormat(0,row,L"Matrix[%d]=%6.2f,%6.2f,%6.2f,%6.2f",i,p[0],p[1],p[2],p[3]);
- row+=gap;
- }
- row+=gap;
-
- for(int i=0;i<8;i++)
- {
- fnt->DrawFormat(0,row,L"Coord[i]=%6.2f,%6.2f,%6.2f",coord[i].x,coord[i].y,coord[i].z);
- row+=gap;
- }
- }
- };
-
- void GameMain(int,wchar_t **)
- {
- SystemInitInfo sii;
-
- sii.info.ProjectName=L"?????";
- sii.info.ProjectCode=L"Matrix Test";
-
- if(!Init(&sii))return; //?????
-
- SetStart(new TestObject); //??????
-
- RunApplication(); //??????
- }
复制代码 |
|