- Visual C++源码
- Visual Basic源码
- C++ Builder源码
- Java源码
- Delphi源码
- C/C++源码
- PHP源码
- Perl源码
- Python源码
- Asm源码
- Pascal源码
- Borland C++源码
- Others源码
- SQL源码
- VBScript源码
- JavaScript源码
- ASP/ASPX源码
- C#源码
- Flash/ActionScript源码
- matlab源码
- PowerBuilder源码
- LabView源码
- Flex源码
- MathCAD源码
- VBA源码
- IDL源码
- Lisp/Scheme源码
- VHDL源码
- Objective-C源码
- Fortran源码
- tcl/tk源码
- QT源码
main.cpp
资源名称:chap03.rar [点击查看]
上传用户:gzqinmao
上传日期:2022-07-13
资源大小:472k
文件大小:4k
源码类别:
OpenGL
开发平台:
Visual C++
- #include <stdio.h>
- #include <conio.h>
- #include "Gut.h"
- #include "GutInput.h"
- #include "GutTimer.h"
- #include "render_dx9.h"
- #include "render_dx10.h"
- #include "render_opengl.h"
- #include "render_data.h"
- GutTimer g_Timer;
- void GetUserInput(void)
- {
- // 读取鼠标
- GutMouseInfo mouse;
- GutReadMouse(&mouse);
- // 读取键盘
- char keyboard_state[256];
- GutReadKeyboard(keyboard_state);
- // 获得画完前一个画面到现在所经历的时间
- float time_diff = g_Timer.Stop();
- g_Timer.Restart();
- float moving_speed = 2.0f * time_diff;
- float rotation_speed = 1.0 * time_diff;
- // 要累积下对X和Y轴的旋转角度
- static float ry = 0.0f;
- static float rx = 0.0f;
- // 如果左击,就旋转镜头
- if ( mouse.button[0] )
- {
- ry -= mouse.x * rotation_speed;
- rx -= mouse.y * rotation_speed;
- }
- Matrix4x4 rotate_matrix;
- rotate_matrix.RotateY_Replace(ry);
- rotate_matrix.RotateX(rx);
- // 在右手坐标系里, 镜面的法线是转换矩阵的-Z轴
- Vector4 camera_facing = -rotate_matrix[2];
- // 获得镜面右边的方向
- Vector4 camera_right = rotate_matrix[0];
- // 按下W或方向键向上
- if ( keyboard_state[GUTKEY_W] || keyboard_state[GUTKEY_UP] )
- {
- g_eye += camera_facing * moving_speed;
- }
- // 按下S或方向键向下
- if ( keyboard_state[GUTKEY_S] || keyboard_state[GUTKEY_DOWN] )
- {
- g_eye -= camera_facing * moving_speed;
- }
- // 按下A或方向键向左
- if ( keyboard_state[GUTKEY_A] || keyboard_state[GUTKEY_LEFT] )
- {
- g_eye -= camera_right * moving_speed;
- }
- // 按下D或方向键向右
- if ( keyboard_state[GUTKEY_D] || keyboard_state[GUTKEY_RIGHT] )
- {
- g_eye += camera_right * moving_speed;
- }
- // 计算出镜头对准的点, 生成镜头转换矩阵时会用到.
- g_lookat = g_eye + camera_facing;
- // 因为是对2个轴转动, 需要更新镜头朝上的轴
- g_up = Vector3CrossProduct(camera_right, camera_facing);
- }
- void main(int argc, char *argv[])
- {
- // 默认使用DirectX 9来绘图
- char *device = "dx9";
- void (*render)(void) = RenderFrameDX9;
- bool (*init_resource)(void) = InitResourceDX9;
- bool (*release_resource)(void) = ReleaseResourceDX9;
- void (*resize_func)(int width, int height) = ResizeWindowDX9;
- #ifdef _ENABLE_DX10_
- printf("Pressn(1) for Direct3D9n(2) for OpenGLn(3) for Direc3D10n");
- #else
- printf("Pressn(1) for Direct3D9n(2) for OpenGLn");
- #endif
- int c = getche();
- switch(c)
- {
- default:
- case '1':
- render = RenderFrameDX9;
- init_resource = InitResourceDX9;
- release_resource = ReleaseResourceDX9;
- resize_func = ResizeWindowDX9;
- break;
- case '2':
- device = "opengl";
- init_resource = InitResourceOpenGL;
- release_resource = ReleaseResourceOpenGL;
- render = RenderFrameOpenGL;
- resize_func = ResizeWindowOpenGL;
- break;
- #ifdef _ENABLE_DX10_
- case '3':
- device = "dx10";
- init_resource = InitResourceDX10;
- release_resource = ReleaseResourceDX10;
- render = RenderFrameDX10;
- resize_func = ResizeWindowDX10;
- break;
- #endif
- }
- GutResizeFunc( resize_func );
- // 在(100,100)的位置打开一个大小为(512x512)的窗口
- GutCreateWindow(100, 100, 512, 512, device);
- // 做OpenGL或DirectX初始化
- if ( !GutInitGraphicsDevice(device) )
- {
- printf("Failed to initialize %s devicen", device);
- exit(0);
- }
- g_view_matrix.Identity();
- GutInputInit();
- float color[]={1.0f, 0.0f, 0.0f, 1.0f};
- CreateSphere(3.0f, &g_pSphereVertices, &g_pSphereIndices, color);
- // 载入shader
- if ( !init_resource() )
- {
- release_resource();
- printf("Failed to load resourcesn");
- exit(0);
- }
- // 主循环
- while( GutProcessMessage() )
- {
- GetUserInput();
- render();
- }
- // 释放shader
- release_resource();
- //
- delete [] g_pSphereVertices;
- delete [] g_pSphereIndices;
- // 关闭OpenGL/DirectX绘图设备
- GutReleaseGraphicsDevice();
- }