CInputManager.cpp
上传用户:jinmajixie
上传日期:2022-07-12
资源大小:435k
文件大小:12k
源码类别:

OpenGL

开发平台:

Visual C++

  1. #include "main.h"
  2. /*******************************************************************************
  3. * INPUT MANAGER
  4. *******************************************************************************/
  5. ////////////////////////////////////////////////////////////////////////////////
  6. CInputManager::CInputManager()
  7. {
  8. mouse_initialized = true;
  9. mouse_active = true;
  10. filter = true;
  11. window_center_x = 1024/2;
  12. window_center_y = 768/2;
  13. sensitivity = 0.5f;
  14. yaw = 0.5f;
  15. pitch = 0.5f;
  16. action = 0;
  17. rotation = &nullv;
  18. position = &nullv;
  19. lookat = &nullv;
  20. mcontrol_x = &nullv.x;
  21. mcontrol_y = &nullv.x;
  22. // scene_m = NULL;
  23. // ssp = NULL;
  24. }
  25. ////////////////////////////////////////////////////////////////////////////////
  26. void CInputManager::Init(CTerrainEdit *te)
  27. {
  28. if (te != 0)
  29. mouse_initialized = true;
  30. tedit = te;
  31. }
  32. /*
  33. void CInputManager::Init(CSceneManager *s, CSystemStuff *sp)
  34. {
  35. scene_m = s;
  36. ssp = sp;
  37. SetMousePointers(scene_m->cp->rotation_p, &scene_m->cp->look_vector);
  38. }
  39. */
  40. ////////////////////////////////////////////////////////////////////////////////
  41. void CInputManager::SetMousePointers(CVector *p, CVector *r, CVector *l)
  42. {
  43. if (r == NULL || l == NULL || p == NULL)
  44. {
  45. err("CInput", "null pointer");
  46. return;
  47. }
  48. position = p;
  49. rotation = r;
  50. lookat = l;
  51. mouse_initialized = true;
  52. rotate_camera = true;
  53. }
  54. ////////////////////////////////////////////////////////////////////////////////
  55. ////////////////////////////////////////////////////////////////////////////////
  56. ////////////////////////////////////////////////////////////////////////////////
  57. void CInputManager::MouseMove()
  58. {
  59. if (!mouse_initialized)
  60. {
  61. errf("mouse not initialized", "!!!");
  62. return;
  63. }
  64. if (rotate_camera) CameraRotation();
  65. switch (action)
  66. {
  67. case 0:
  68. FloatModify();
  69. break;
  70. case 1:
  71. MovingObject();
  72. break;
  73. default: err("bad action in CInput"); break;
  74. }
  75. if (mx || my) SetCursorPos(window_center_x, window_center_y);
  76. }
  77. ////////////////////////////////////////////////////////////////////////////////
  78. void CInputManager::KeyDown(WPARAM k)
  79. {
  80. keys[k] = true;
  81. }
  82. void CInputManager::KeyUp(WPARAM k)
  83. {
  84. keys[k] = false;
  85. }
  86. void CInputManager::ProcessInput()
  87. {
  88. if (keys['C'])
  89. {
  90. rotate_camera = !rotate_camera;
  91. keys['C'] = false;
  92. }
  93. if (keys[VK_ESCAPE]) PostQuitMessage(0);
  94. }
  95. ////////////////////////////////////////////////////////////////////////////////
  96. ////////////////////////////////////////////////////////////////////////////////
  97. void CInputManager::MovingObject()
  98. {
  99. mx = my = 0;
  100. float mouse_x, mouse_y;
  101. if (!mouse_active) return;
  102. if (!GetCursorPos(&current_pos)) return;
  103. mx = current_pos.x - window_center_x;
  104. my = current_pos.y - window_center_y;
  105. if (filter) // zistit na co to je
  106. {
  107. mouse_x = (mx + old_mouse_x) * 0.5f;
  108. mouse_y = (my + old_mouse_y) * 0.5f;
  109. }
  110. else
  111. {
  112. mouse_x = mx;
  113. mouse_y = my;
  114. }
  115. old_mouse_x = mx;
  116. old_mouse_y = my;
  117. mouse_x *= sensitivity;
  118. mouse_y *= sensitivity;
  119. float add_z = yaw * mouse_x;
  120. if (rotation->y - add_z > 45 && add_z > 0)
  121. {
  122. rotation->y -= add_z;
  123. }
  124. if (rotation->y - add_z  < 135 && add_z < 0)
  125. {
  126. rotation->y -= add_z;
  127. }
  128. if (rotation->x >= 360) rotation->x -= 360;
  129. if (rotation->x < 0) rotation->x += 360;
  130. float add_y = pitch * mouse_y * -1;
  131. if (rotation->z - add_y > 20 && add_y > 0)
  132. {
  133. rotation->z -= add_y;
  134. }
  135. if (rotation->z - add_y  < 70 && add_y < 0)
  136. {
  137. rotation->z -= add_y;
  138. }
  139. lookat->x -= add_z;
  140. lookat->z += add_y;
  141. /*
  142. lookat->z = sin(rotation->x/div180byPI);
  143. lookat->x = cos(rotation->x/div180byPI);
  144. float xy = sqrt(rotation->x*rotation->x+rotation->y*rotation->y);
  145. lookat->y = tan(rotation->y/div180byPI);
  146. */
  147. // errfi("lookat", lookat->x*1000, lookat->y*1000, lookat->z*1000);
  148. }
  149. ////////////////////////////////////////////////////////////////////////////////
  150. ////////////////////////////////////////////////////////////////////////////////
  151. ////////////////////////////////////////////////////////////////////////////////
  152. void CInputManager::CameraRotation()
  153. {
  154. mx = my = 0;
  155. float mouse_x, mouse_y;
  156. if (!mouse_active) return;
  157. if (!GetCursorPos(&current_pos)) return;
  158. mx = current_pos.x - window_center_x;
  159. my = current_pos.y - window_center_y;
  160. if (filter) // zistit na co to je
  161. {
  162. mouse_x = (mx + old_mouse_x) * 0.5f;
  163. mouse_y = (my + old_mouse_y) * 0.5f;
  164. }
  165. else
  166. {
  167. mouse_x = mx;
  168. mouse_y = my;
  169. }
  170. old_mouse_x = mx;
  171. old_mouse_y = my;
  172. mouse_x *= sensitivity;
  173. mouse_y *= sensitivity;
  174. float add_x = yaw * mouse_x;
  175. rotation->x += add_x;
  176. // errfi("rotation", rotation->x, rotation->y, rotation->z);
  177. if (rotation->x >= 360) rotation->x -= 360;
  178. if (rotation->x < 0) rotation->x += 360;
  179. float add_y = pitch * mouse_y;
  180. rotation->y -= add_y;
  181. /*
  182. if (rotation->y - add_y > -90 && add_y > 0)
  183. {
  184. rotation->y -= add_y;
  185. }
  186. if (rotation->y - add_y  < 90 && add_y < 0)
  187. {
  188. rotation->y -= add_y;
  189. }
  190. */
  191. lookat->z = sin(rotation->x/div180byPI);
  192. lookat->x = cos(rotation->x/div180byPI);
  193. float xy = sqrt(rotation->x*rotation->x+rotation->y*rotation->y);
  194. lookat->y = tan(rotation->y/div180byPI);
  195. // errfi("lookat", lookat->x*1000, lookat->y*1000, lookat->z*1000);
  196. }
  197. ////////////////////////////////////////////////////////////////////////////////
  198. ////////////////////////////////////////////////////////////////////////////////
  199. ////////////////////////////////////////////////////////////////////////////////
  200. ////////////////////////////////////////////////////////////////////////////////
  201. void CInputManager::FloatModify()
  202. {
  203. mx = my = 0;
  204. float mouse_x, mouse_y;
  205. if (!mouse_active) return;
  206. if (!GetCursorPos(&current_pos)) return;
  207. mx = current_pos.x - window_center_x;
  208. my = current_pos.y - window_center_y;
  209. if (filter) // zistit na co to je
  210. {
  211. mouse_x = (mx + old_mouse_x) * 0.5f;
  212. mouse_y = (my + old_mouse_y) * 0.5f;
  213. }
  214. else
  215. {
  216. mouse_x = mx;
  217. mouse_y = my;
  218. }
  219. old_mouse_x = mx;
  220. old_mouse_y = my;
  221. mouse_x *= sensitivity;
  222. mouse_y *= sensitivity;
  223. float add_x = yaw * mouse_x * 1;
  224. float add_y = pitch * mouse_y * -1;
  225. *mcontrol_x += add_x;
  226. *mcontrol_y += add_y;
  227. if (*mcontrol_x < 0) *mcontrol_x = 0;
  228. if (*mcontrol_y < 0) *mcontrol_y = 0;
  229. if (*mcontrol_x > 128) *mcontrol_x = 128;
  230. if (*mcontrol_y > 128) *mcontrol_y = 128;
  231. }
  232. ////////////////////////////////////////////////////////////////////////////////
  233. ////////////////////////////////////////////////////////////////////////////////
  234. ////////////////////////////////////////////////////////////////////////////////
  235. //void CInputManager::ProcessInput()
  236. //{
  237. /*
  238. if (keys[VK_ESCAPE])
  239. {
  240. menu = !menu;
  241. if (menu)
  242. {
  243. float colour[4] = {-10.0, -10.0, -10.0, 0.5};
  244. glLightfv(GL_LIGHT0, GL_AMBIENT, colour);
  245. glEnable(GL_BLEND);
  246. }
  247. else
  248. {
  249. glLightfv(GL_LIGHT0, GL_AMBIENT, scene.ambient_colour);
  250. glDisable(GL_BLEND);
  251. }
  252. keys[VK_ESCAPE] = false;
  253. }
  254. if (keys['7'])
  255. {
  256. scene.ambient_colour[0] += 0.05f;
  257. scene.ambient_colour[1] += 0.05f;
  258. scene.ambient_colour[2] += 0.05f;
  259. scene.fog_colour[0] = scene.ambient_colour[0]*dif*0.45;
  260. scene.fog_colour[1] = scene.ambient_colour[1]*dif*0.55;
  261. scene.fog_colour[2] = scene.ambient_colour[2]*dif*0.72;
  262. glFogfv(GL_FOG_COLOR, scene.fog_colour);
  263. glLightfv(GL_LIGHT0, GL_AMBIENT, scene.ambient_colour);
  264. }
  265. if (keys['U'])
  266. {
  267. scene.ambient_colour[0] -= 0.05f;
  268. scene.ambient_colour[1] -= 0.05f;
  269. scene.ambient_colour[2] -= 0.05f;
  270. scene.fog_colour[0] = scene.ambient_colour[0]*dif*0.45;
  271. scene.fog_colour[1] = scene.ambient_colour[1]*dif*0.55;
  272. scene.fog_colour[2] = scene.ambient_colour[2]*dif*0.72;
  273. glFogfv(GL_FOG_COLOR, scene.fog_colour);
  274. glLightfv(GL_LIGHT0, GL_AMBIENT, scene.ambient_colour);
  275. }
  276. if (!menu)
  277. {
  278. // if (selected)
  279. // {
  280. if (keys[VK_UP]) statics.obj[last_collision].position.z += spd/10;
  281. if (keys[VK_DOWN]) statics.obj[last_collision].position.z -= spd/10;
  282. if (keys[VK_LEFT]) statics.obj[last_collision].position.x += spd/10;
  283. if (keys[VK_RIGHT]) statics.obj[last_collision].position.x -= spd/10;
  284. if (keys[VK_PRIOR]) statics.obj[last_collision].rotation.y += spd/10;
  285. if (keys[VK_NEXT]) statics.obj[last_collision].rotation.y -= spd/10;
  286. if (keys[VK_INSERT])
  287. {  }
  288. if (keys[VK_DELETE])
  289. {  }
  290. // } // selected
  291. // else
  292. {
  293. // if (keys[VK_UP]) statics.obj[15].rotation.x += spd/10;
  294. // if (keys[VK_DOWN]) statics.obj[15].rotation.x -= spd/10;
  295. // if (keys[VK_LEFT]) statics.obj[15].rotation.z += spd/10;
  296. // if (keys[VK_RIGHT]) statics.obj[15].rotation.z -= spd/10;
  297. // if (keys[VK_PRIOR]) statics.obj[15].rotation.y += spd/10;
  298. // if (keys[VK_NEXT]) statics.obj[15].rotation.y -= spd/10;
  299. }
  300. if (keys['1']) cam.max_speed = 0.1;
  301. if (keys['2']) cam.max_speed = 1.0;
  302. if (keys['3']) cam.max_speed = 5.0;
  303. if (keys['4']) cam.max_speed = 30.0;
  304. if (keys['H']) { help = !help; keys['H'] = false; }
  305. if (keys['R'])
  306. {
  307. selected = !selected;
  308. keys['R'] = false;
  309. }
  310. if (keys[VK_F5])
  311. {
  312. SaveWorld();
  313. keys[VK_F5]=false;
  314. }
  315. if (keys[VK_F9])
  316. {
  317. LoadWorld();
  318. keys[VK_F9]=false;
  319. }
  320. if (keys[' '])
  321. {
  322. cam.Jump();
  323. }
  324. if (keys['W'])
  325. {
  326. cam.Accelerate();
  327. }
  328. if (keys['S'])
  329. {
  330. cam.Deccelerate();
  331. }
  332. if (keys['A'])
  333. {
  334. cam.StrafeLeft();
  335. }
  336. if (keys['D'])
  337. {
  338. cam.StrafeRight();
  339. }
  340. if (keys['E']) { cam.velocity.y += spd/1000; }
  341. if (keys['Q']) { cam.velocity.y -= spd/1000; }
  342. if (keys['F'])
  343. {
  344. for (int i = 0 ; i < 128 ; i++)
  345. {
  346. CVector q(cam.GetLookVector());
  347. CVector vect(q);
  348. vect.Normal();
  349. vect.NoiseAngle();
  350. vect *= 5;
  351. int idn = 12+rand()%1;
  352. sel_obj = CreateDynamicObject(idn, cam.position+q, vect, true);
  353. gui.AddFadeText(dynamics.obj[sel_obj].model_id, 300, 200, 3);
  354. // sel_obj = CreateDynamicObject("arrow", cam.position+q, vect, false);
  355. }
  356. keys['F'] = false;
  357. }
  358. if (keys[VK_F15])
  359. {
  360. // if (arrow_released)
  361. // {
  362. // gui.AddFadeText(":: using arrow", 30, 100, 1);
  363. CVector q;
  364. q = 3;
  365. q *= cam.GetLookVector();
  366. sel_obj = CreateDynamicObject("arrow", q, q, false);
  367. // }
  368. brmbrm();
  369. arrow_released = false;
  370. }
  371. if (!keys[VK_F15])
  372. {
  373. // brmbrm();
  374. arrow_released = true;
  375. }
  376. if (keys['G'])
  377. {
  378. CVector accel(0.0, 0.01, 0.0);
  379. dynamics.obj[sel_obj].velocity += accel;
  380. }
  381. if (keys[VK_CONTROL])
  382. {
  383. cam.ToggleDuck();
  384. keys[VK_CONTROL] = false;
  385. }
  386. if (keys['C'])
  387. {
  388. show_collision = !show_collision;
  389. keys['C'] = false;
  390. }
  391. if (keys[VK_TAB])
  392. {
  393. culled = !culled;
  394. for (int i = 0 ; i < dynamics.count ; i++)
  395. dynamics.obj[i].culled = culled;
  396. for (int i = 0 ; i < statics.count ; i++)
  397. statics.obj[i].culled = culled;
  398. for (int i = 0 ; i < items.count ; i++)
  399. items.obj[i].culled = culled;
  400. keys[VK_TAB] = false;
  401. }
  402. if (keys['N'])
  403. {
  404. wireframe = !wireframe;
  405. for (int i = 0 ; i < statics.count ; i++)
  406. {
  407. if (statics.obj[i].pM != NULL)
  408. {
  409. if (wireframe)
  410. statics.obj[i].pM->render_mode = GL_LINES;
  411. else
  412. statics.obj[i].pM->render_mode = GL_TRIANGLES;
  413. }
  414. }
  415. for (int i = 0 ; i < dynamics.count ; i++)
  416. {
  417. if (dynamics.obj[i].pM != NULL)
  418. {
  419. if (wireframe)
  420. dynamics.obj[i].pM->render_mode = GL_LINES;
  421. else
  422. dynamics.obj[i].pM->render_mode = GL_TRIANGLES;
  423. }
  424. }
  425. keys['N'] = false;
  426. }
  427. if (keys['B'])
  428. {
  429. activated = !activated;
  430. for (int i = 0 ; i < dynamics.count ; i++)
  431. dynamics.obj[i].active = activated;
  432. keys['B'] = false;
  433. }
  434. if (keys['X'])
  435. {
  436. gui.ClearFadeTexts();
  437. for (int i=0 ; i < dynamics.count ; i++)
  438. {
  439. dynamics.obj[i].pM = NULL;
  440. }
  441. dynamics.count = 0;
  442. keys['X'] = false;
  443. }
  444. }
  445. else
  446. {
  447. if (keys['X']) ss.Umri();
  448. }
  449. */
  450. //}