📄 show3d.cpp
字号:
}
void ProgramLoop (HWND hWnd)
{
if (ProgramIsTerminated) return;
if (WaitAWhile) return;
myViewport.glSetTime (timeGetTime());
if (camhflag) cameraheading += ANGLEROTATION;
if (camcflag) cameraclimb += ANGLEROTATION;
if (cambflag) camerabank += ANGLEROTATION;
if (camhflag || camcflag || cambflag)
SetCamera ();
if (objhflag) objectheading += ANGLEROTATION;
if (objcflag) objectclimb += ANGLEROTATION;
if (objbflag) objectbank += ANGLEROTATION;
glCreateTransformation (objectheading,objectclimb,objectbank, &myObjectMatrix);
myGraphics.StartFrame (currentflag & 1);
if (shadowflag) {
glProcessObjectShadow (&myViewport, &myObject.Object, 1.0, myAnimData);
}
else {
glProcessObject (&myViewport, &myObject.Object, 1.0, myAnimData, textureset);
// glProcessObjectClip (&myViewport, &myObject.Object, 1.0, myAnimData, textureset);
}
#if 0
if (pointlightflag) {
myObject.Object.objectCoordinate = &lightcoord;
glProcessObjectShadow (&myViewport, &myObject.Object, 0.1, myAnimData);
myObject.Object.objectCoordinate = &objcoord;
}
#endif
#ifdef USE_FULLSCREEN
sprintf ((char *) ShowTitle, "FrameRate = %.2f", CurrentFrameRate);
HDC hdc = GetDC (hWnd);
TextOut (hdc, 10, 10, (const char *) ShowTitle, strlen((const char *) ShowTitle));
ReleaseDC (hWnd, hdc);
#endif
myGraphics.FlipBuffer ();
}
void CheckKeyReleased (WPARAM wParam)
{
WORD scanCode;
scanCode = MapVirtualKey (wParam, 0);
switch (scanCode) {
case KEYLEFTSHIFT:
keypressed &= ~LEFTSHIFTBIT;
break;
case KEYRIGHTSHIFT:
keypressed &= ~RIGHTSHIFTBIT;
break;
}
}
GLint ProcessInput (WPARAM wParam, HWND hWnd)
{
WORD scanCode;
GLfloat stepsize;
GLint i, j;
if (smoothmode) {
stepsize = cameraRange / 200.0f;;
}
else stepsize = cameraRange / 32.0f;
scanCode = MapVirtualKey (wParam, 0);
switch (scanCode) {
case KEYF1:
textureset++;
break;
case KEYF2:
textureset--;
if (textureset < 0) textureset = 0;
break;
case KEYF3:
glEnableAnimationScript(myAnimData);
break;
case KEYF4:
glDisableAnimationScript(myAnimData);
break;
case KEYF:
shadowflag ^= 1;
break;
case KEY8:
colormode ^= 1;
if (colormode) {
myViewport.glEnableColorMode (GL_MAKE_COLOR_GREEN);
}
else {
myViewport.glDisableColorMode (GL_MAKE_COLOR_GREEN);
}
break;
case KEYL:
lightOn ^= 1;
if (lightOn) {
myViewport.glSetAmbientIntensity ( 0.3f );
myViewport.glSetDiffuseIntensity ( 0.7f );
} else {
myViewport.glSetAmbientIntensity ( 1.0f );
myViewport.glSetDiffuseIntensity ( 0.0f );
}
break;
case KEYESCAPE:
case KEYQ:
return (1);
case KEYLEFTSHIFT:
keypressed |= LEFTSHIFTBIT;
break;
case KEYRIGHTSHIFT:
keypressed |= RIGHTSHIFTBIT;
break;
case KEYBACKSLASH:
smoothmode ^= 1;
break;
case KEY9:
cameraangle += 64;
if (cameraangle > 7936) cameraangle = 7936; // max == 174.4 deg
SetCameraAngle ();
break;
case KEY0:
cameraangle -= 64;
if (cameraangle < 64) cameraangle = 64; // min == 1.40625 deg
SetCameraAngle ();
break;
case KEY1:
case KEY2:
case KEY3:
case KEY4:
case KEY5:
case KEY6:
if (keypressed & SHIFTBIT) {
switch (scanCode) {
case KEY1:
cameraheading -= ANGLEROTATION;
break;
case KEY2:
cameraheading += ANGLEROTATION;
break;
case KEY3:
cameraclimb -= ANGLEROTATION;
break;
case KEY4:
cameraclimb += ANGLEROTATION;
break;
case KEY5:
camerabank -= ANGLEROTATION;
break;
case KEY6:
camerabank += ANGLEROTATION;
break;
}
SetCamera ();
}
else {
switch (scanCode) {
case KEY1:
objectheading -= ANGLEROTATION;
break;
case KEY2:
objectheading += ANGLEROTATION;
break;
case KEY3:
objectclimb -= ANGLEROTATION;
break;
case KEY4:
objectclimb += ANGLEROTATION;
break;
case KEY5:
objectbank -= ANGLEROTATION;
break;
case KEY6:
objectbank += ANGLEROTATION;
break;
}
}
break;
case KEYH:
if (keypressed & SHIFTBIT) camhflag ^= 1;
else objhflag ^= 1;
break;
case KEYC:
if (keypressed & SHIFTBIT) camcflag ^= 1;
else objcflag ^= 1;
break;
case KEYB:
if (keypressed & SHIFTBIT) cambflag ^= 1;
else objbflag ^= 1;
break;
case KEYR:
textureset = 0;
cameraheading = cameraclimb = camerabank = 0;
cameraangle = 2730; // 59.98... degree viewing angle
SetCameraAngle ();
// Put the camera back at the starting point
cameraPosition.x = 0.0f;
cameraPosition.y = 0.0f;
cameraPosition.z = -cameraStartRange;
myViewport.glSetCameraPosition (&cameraPosition);
UpdateCameraRange();
objectheading = objectclimb = objectbank = 0;
bgcolor = 0xffffffff;
myContext -> SetState (MPR_STA_BG_COLOR, bgcolor);
myContext -> SetState (MPR_STA_FOG_COLOR, bgcolor);
myViewport.glSetDepthCueColor ((GLfloat) (bgcolor & 0xff) / 255.0,
(GLfloat) ((bgcolor >> 8) & 0xff) / 255.0,
(GLfloat) ((bgcolor >> 16) & 0xff) / 255.0);
break;
case KEYP:
if (keypressed & SHIFTBIT) {
currentflag ^= 4;
if (currentflag & 4) {
currentstate |= ENABLE_FILTERING_PERSPECTIVE_STATE;
currentflag |= 2;
}
else currentstate &= ~ENABLE_FILTERING_STATE;
}
else {
currentflag ^= 2;
if (currentflag & 2) currentstate |= ENABLE_PERSPECTIVE_STATE;
else if (currentflag & 4) {
currentstate &= ~ENABLE_FILTERING_PERSPECTIVE_STATE;
currentflag ^= 4;
}
else currentstate &= ~ENABLE_PERSPECTIVE_STATE;
}
myContext -> SetupMPRState (currentstate);
break;
case KEYT:
if (keypressed & SHIFTBIT)
myViewport.glToggleSurfaceDetail (GL_DETAIL_TRANSPARENT);
else myViewport.glToggleSurfaceDetail (GL_DETAIL_TEXTURE);
break;
case KEYS:
if (keypressed & SHIFTBIT)
myViewport.glToggleSurfaceDetail (GL_DETAIL_SHADING);
else myViewport.glDisableSurfaceDetail (GL_DETAIL_TEXTURE | GL_DETAIL_SMOOTH_SHADING);
break;
case KEYG:
if (keypressed & SHIFTBIT)
myViewport.glToggleSurfaceDetail (GL_DETAIL_GOURAUD);
else myViewport.glToggleSurfaceDetail (GL_DETAIL_SMOOTH_SHADING);
break;
case KEYMINUS:
case KEYPLUS:
case KEYLEFTBRACKET:
case KEYRIGHTBRACKET:
case KEYCOLON:
case KEYQUOTE:
j = 8;
if (keypressed & SHIFTBIT) j = 1;
switch (scanCode) {
case KEYMINUS:
i = (bgcolor >> 16) & 0xff; // blue
i = ((i - j) & 0xff) << 16;
bgcolor = (bgcolor & 0xff00ffff) | i;
break;
case KEYPLUS:
i = (bgcolor >> 16) & 0xff; // blue
i = ((i + j) & 0xff) << 16;
bgcolor = (bgcolor & 0xff00ffff) | i;
break;
case KEYLEFTBRACKET:
i = (bgcolor >> 8) & 0xff; // green
i = ((i - j) & 0xff) << 8;
bgcolor = (bgcolor & 0xffff00ff) | i;
break;
case KEYRIGHTBRACKET:
i = (bgcolor >> 8) & 0xff; // green
i = ((i + j) & 0xff) << 8;
bgcolor = (bgcolor & 0xffff00ff) | i;
break;
case KEYCOLON:
i = ((bgcolor & 0xff) - j) & 0xff; // red
bgcolor = (bgcolor & 0xffffff00) | i;
break;
case KEYQUOTE:
i = ((bgcolor & 0xff) + j) & 0xff; // red
bgcolor = (bgcolor & 0xffffff00) | i;
break;
}
myContext -> SetState (MPR_STA_BG_COLOR, bgcolor);
myContext -> SetState (MPR_STA_FOG_COLOR, bgcolor);
myViewport.glSetDepthCueColor ((GLfloat) (bgcolor & 0xff) / 255.0,
(GLfloat) ((bgcolor >> 8) & 0xff) / 255.0,
(GLfloat) ((bgcolor >> 16) & 0xff) / 255.0);
break;
case KEYLEFT:
case KEYRIGHT:
case KEYUP:
case KEYDOWN:
case KEYPAGEUP:
case KEYPAGEDOWN:
if (keypressed & SHIFTBIT) {
switch (scanCode) {
case KEYLEFT:
// lightcoord.x -= stepsize;
break;
case KEYRIGHT:
// lightcoord.x += stepsize;
break;
case KEYUP:
// lightcoord.z += stepsize;
break;
case KEYDOWN:
/// lightcoord.z -= stepsize;
break;
case KEYPAGEUP:
/// lightcoord.y -= stepsize;
break;
case KEYPAGEDOWN:
/// lightcoord.y += stepsize;
break;
}
myViewport.glSetLightDirection (&lightdir);
}
else {
switch (scanCode) {
case KEYLEFT:
cameraPosition.x -= stepsize;
break;
case KEYRIGHT:
cameraPosition.x += stepsize;
break;
case KEYUP:
cameraPosition.z += stepsize;
break;
case KEYDOWN:
cameraPosition.z -= stepsize;
break;
case KEYPAGEUP:
cameraPosition.y -= stepsize;
break;
case KEYPAGEDOWN:
cameraPosition.y += stepsize;
break;
}
myViewport.glSetCameraPosition (&cameraPosition);
UpdateCameraRange();
}
break;
case KEYTAB:
i = DialogBox (myInst, "IDD_LOAD3DOBJECT", hWnd, (FARPROC) Load3DObjectData);
if (i) {
if (LoadObjectFile ()) {
glDisplayMessage1 ((signed char *)"Can not Load object file! Program is aborted...\n");
ProgramIsTerminated = 1;
return 1;
}
}
break;
}
return 0;
}
GLubyte MessageBuffer[1000]; // up to 1000 characters of message
GLubyte *currentMessageBuffer;
/*
赏屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯屯
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -