Guest User

Untitled

a guest
Nov 16th, 2018
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 25.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <GL/glut.h>
  3. #include <Windows.h> //FOR CURSOR
  4. #include <tgmath.h> //FOR MATHS
  5. #include <fstream>
  6. #include <string>
  7. #include <time.h> //FOR THE TIME FOR RANDOM GENERATOR SEED
  8.  
  9.  
  10. const int MAXMOLECULES = 1000000, MAXCUBOIDS = 10000, NUMBER_OF_PRESSURE_SENSORS = 3, MAX_RECORDING_TIME = 1000000;
  11.  
  12. int widthOfMonitor = glutGet( GLUT_SCREEN_WIDTH ), heightOfMonitor = glutGet( GLUT_SCREEN_HEIGHT ),
  13. cuboidBuilding = 0;//IS A CUBE CURRENTLY BEING BUILT? 0 FOR NO, 1 FOR YES.
  14.  
  15. const float ORIGINAL_CAMERA_LOCATION[3] = { 0, 0, 0 }, //ORIGINAL CAMERA LOCATION
  16. ORIGINAL_CAMERA_DIRECTION[3] = { 2.001, 0, 0 },
  17. PI = 3.14159265359, //PI
  18. MAPSIZE = 20.0, //SIZE OF THE CUBE SURROUNDING THE CENTER
  19. SIZESCALE = 100.0; //SCALE THE SIZE OF BOXES
  20.  
  21. float cameraInformation[3][3], //(CAMERA TRANSLATION FROM ORIGINAL CAMERA LOCATION, CAMERA DIRECTION, CAMERA LOCATION) in (x,y,z)
  22. cursorAngle[2], //POSITION OF CURSOR CONVERTED TO AN ANGLE, in (y,z)
  23. cubeInitialOrigin[3], //ORIGIN OF CUBE WHEN STARTING BUILDING, in (x,y,z)
  24. movementSpeed = 0.0125;
  25. char s[30];
  26.  
  27. std::string str1 = "FILLINGUPTHESTRING"; //TAKES USERS INPUT OF FILENAME
  28.  
  29. const char *FILENAME = str1.c_str( );
  30.  
  31. void window_size( int w, int h ); //TAKE CURRENT SIZE OF WINDOW
  32. void rotate_camera( );
  33. void move_forward( float forwardsOrBackwards );
  34. void move_left( float forwardsOrBackwards );
  35. void move_up( float forwardsOrBackwards );
  36. void keyboard( unsigned char key, int x, int y );
  37. void cuboid ( float OCX, float OCY, float OCZ,
  38. float xsize, float ysize, float zsize,
  39. float TR, float TG, float TB,
  40. float BR, float BG, float BB,
  41. float FR, float FG, float FB,
  42. float BWR, float BWG, float BWB,
  43. float LR, float LG, float LB,
  44. float RR, float RG, float RB ); //PRODUCE CUBOIDS
  45. void display ( ); //RENDERS CUBOIDS, TEXT AND MOLECULES
  46. int main ( int argc, char **argv )
  47. {
  48. ShowCursor( FALSE );
  49. void glutInit( int *argc, char **argv );
  50. glutInitDisplayMode( GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA );
  51. //CREATE WINDOW, SET RESOLUTION AND POSITION
  52. glutInitWindowSize( widthOfMonitor, heightOfMonitor );
  53. glutCreateWindow( "SQUARE" );
  54. glutInitWindowPosition( 0, 0 );
  55. glutFullScreen( );
  56. glColorMaterial ( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE ) ;
  57. glEnable ( GL_COLOR_MATERIAL ) ;
  58. glutReshapeFunc( window_size ); //SET WINDOW CORRECT SIZE
  59. glutKeyboardFunc( keyboard );//DETECT IF KEYBOARD IS PRESSED AND RESPOND
  60. //CONSTANTLY UPDATE DISPLAY AT FRAME rate OF MONITOR (OR LOWER IF CPU/GPU CANNOT PROCESS FAST ENOUGH)
  61. glutDisplayFunc( display );
  62. glutIdleFunc( display );
  63. glEnable( GL_DEPTH_TEST ); //RENDER OBJECTS CLOSEST TO CAMERA INFRONT OF OBJECTS FURTHER AWAY
  64. glutMainLoop( );
  65. }
  66.  
  67. /*window_size TAKES INPUT OF SIZE OF WINDOW THEN GENERATES THE ORIGINAL CAMERA VIEW*/
  68. void window_size( int widthOfMonitor, int heightOfMonitor ) //TAKE CURRENT SIZE OF WINDOW
  69. {
  70. glMatrixMode( GL_PROJECTION ); //EDIT THE CAMERA SETTINGS
  71. glViewport( 0, 0, widthOfMonitor, heightOfMonitor ); //SET THE RENDERING TO COVER ENTIRE WINDOW
  72. //SET THE PERSPECTIVE
  73. gluPerspective( 90, //FOV
  74. widthOfMonitor / heightOfMonitor, //DISPLAY ASPECT
  75. 0.01, //NEAR CLIP
  76. 20000.0 ); //FAR CLIP
  77. glMatrixMode( GL_MODELVIEW ); //CHANGE BACK TO EDITING THE WOLRD
  78. gluLookAt( ORIGINAL_CAMERA_LOCATION[0], ORIGINAL_CAMERA_LOCATION[1], ORIGINAL_CAMERA_LOCATION[2], //CAMERA LOCATION
  79. ORIGINAL_CAMERA_LOCATION[0] + ORIGINAL_CAMERA_DIRECTION[0], ORIGINAL_CAMERA_LOCATION[1] + ORIGINAL_CAMERA_LOCATION[1], ORIGINAL_CAMERA_LOCATION[2] + ORIGINAL_CAMERA_LOCATION[2], //LOOK AT
  80. 0.0, 1.0, 0.0 ); //VERTICAL DEFINITION
  81. }
  82. /*rotate_camera DETECTS LOCATION OF CURSOR, ADJUSTING THE DIRECTION LOOKED DEPENDING ON WHAT DIRECTION THE MOUSE IS MOVED*/
  83. void rotate_camera( )
  84. {
  85. POINT m1;
  86. GetCursorPos( &m1 );//EXTRACT MOUSE COORDINATES
  87. //DISPLACEMENT FROM CENTRE OF SCREEN IN X&Y
  88. int xmpos = ( m1.x - widthOfMonitor / 2 );
  89. int ympos = ( m1.y - heightOfMonitor / 2 );
  90. //TAKE MOUSE COORDS AND SET WHOLE WINDOW TO BE LENGTH 2PI IN X AND Y
  91. cursorAngle[0] += - ( ( xmpos * 180 / (widthOfMonitor / 2) ) * PI / 180 );
  92. cursorAngle[1] += ( ( ympos * 180 / (heightOfMonitor / 2) ) * PI / 180 );
  93. //DON'T ALLOW ROTATING UP PAST CEILING OR BELOW FLOOR, CAN BE DONE BUT MAKES PERSPECTIVE CONFUSING
  94. if ( cursorAngle[1] > 0 )
  95. cursorAngle[1] = - 1E-5;
  96. else if ( cursorAngle[1] < -PI )
  97. cursorAngle[1] = -( PI - 1E-5 );
  98. //CONVERT FROM SPHERICAL POLARS INTO CARTESIANS
  99. cameraInformation[1][0] = cos( cursorAngle[0] ) * sin( cursorAngle[1] );
  100. cameraInformation[1][1] = sin( cursorAngle[0] ) * sin( cursorAngle[1] );
  101. cameraInformation[1][2] = -cos( cursorAngle[1] );
  102. //KEEP CURSOR CENTERED TO PREVENT SCREEN GETTING STUCK WHEN ROTATING PAST 2PI.
  103. SetCursorPos( widthOfMonitor / 2, heightOfMonitor / 2 );
  104. }
  105. /*MoveForwards TRIGGERS IF W OR S IS PRESSED AND MOVES FORWARD OR BACKWARDS IN THE DIRECTION FACED IF A CUBE IS NOT BEING BUILT, OR MOVES CUBE FORWARD OR BACKWARDS IN THE DIRECTION FACED IF CUBE IS BEING BUILT*/
  106. void move_forward( float forwardsOrBackwards )
  107. {
  108. float changeInX, changeInY, changeInZ, length;
  109. if ( cuboidBuilding == 0 )
  110. {
  111. //GO FORWARD/BACK RELATIVE TO CAMERA VIEW
  112. changeInX = ( forwardsOrBackwards * cameraInformation[1][0] );
  113. changeInY = ( forwardsOrBackwards * cameraInformation[1][1] );
  114. changeInZ = ( forwardsOrBackwards * cameraInformation[1][2] );
  115. //NORMALIZE MOVEMENT
  116. length = sqrt ( pow ( changeInX, 2.0 ) + pow ( changeInY, 2.0 ) + pow ( changeInZ, 2.0 ) );
  117. changeInX = changeInX / length;
  118. changeInY = changeInY / length;
  119. changeInZ = changeInZ / length;
  120. //SET SENSITIVITY AND ADD CHANGE FROM STARTING POSITION TO STARTING POSITION TO GET CURRENT POSITION
  121. cameraInformation[0][0] += changeInX * movementSpeed;
  122. cameraInformation[0][1] += changeInY * movementSpeed;
  123. cameraInformation[0][2] += changeInZ * movementSpeed;
  124. }
  125.  
  126. }
  127. /*move_left TRIGGERS IF A OR D IS PRESSED AND MOVES LEFT OR RIGHT TO THE DIRECTION FACED IF A CUBE IS NOT BEING BUILT, OR MOVES CUBE LEFT OR RIGHT OF THE DIRECTION FACED IF CUBE IS BEING BUILT*/
  128. void move_left( float forwardsOrBackwards )
  129. {
  130. float changeInX, changeInY, length;
  131. if ( cuboidBuilding == 0 )
  132. {
  133. //GO LEFT/RIGHT RELATIVE TO CAMERA VIEW
  134. changeInX = ( -forwardsOrBackwards * cameraInformation[1][1] );
  135. changeInY = ( forwardsOrBackwards * cameraInformation[1][0] );
  136. //NORMALIZE MOVEMENT
  137. length = sqrt ( pow ( changeInX, 2.0 ) + pow ( changeInY, 2.0 ) );
  138. changeInX = changeInX / length;
  139. changeInY = changeInY / length;
  140. //SET SENSITIVITY AND ADD CHANGE FROM STARTING POSITION TO STARTING POSITION TO GET CURRENT POSITION
  141. cameraInformation[0][0] += changeInX * movementSpeed;
  142. cameraInformation[0][1] += changeInY * movementSpeed;
  143. }
  144. }
  145. /*move_up TRIGGERS IF Q OR E IS PRESSED AND MOVES VERTICALLY UP OR DOWN IF A CUBE IS NOT BEING BUILT, OR MOVES CUBE VERTICALLY UP OR DOWN IF CUBE IS BEING BUILT*/
  146. void move_up( float forwardsOrBackwards )
  147. {
  148. //MOVEMENT AND MAKING CUBE AS THE DIRECTION MOVED IS ALWAYS PARRALEL TO Z COORDS, SO NO CONVERSION FROM CAMERA TO BOX IS REQUIRED
  149. float changeInZ, length;
  150. //GO UP/DOWN RELATIVE TO CAMERA VIEW
  151. changeInZ = ( forwardsOrBackwards );
  152. //NORMALIZE MOVEMENT
  153. length = sqrt( pow ( changeInZ, 2.0 ) );
  154. changeInZ = changeInZ / length;
  155. //SET SENSITIVITY
  156. if ( cuboidBuilding == 0 )
  157. cameraInformation[0][2] += changeInZ * movementSpeed;
  158. //ADD CHANGE FROM STARTING POSITION TO STARTING POSITION TO GET CURRENT POSITION
  159. }
  160. /*keyboard TRIGGERS IF A KEY ON THE KEYBOARD IS PRESSED, THEN PASSES TO A FUNCTION THAT PROCESSES THE KEY PRESSED, ALSO UPDATES THE LOCATION OF CAMERA IF MOVEMENT KEYS ARE PRESSED */
  161. void keyboard( unsigned char key, int x, int y )
  162. {
  163. int forwardsOrBackwards; //FORWARD OR BACKWORDS.
  164. //PREVENT A POTENTIAL DIVIDE BY 0 ERROR BY SETTING 0 DIRECTIONS TO VERY SMALL DIRECTIONS.
  165. for ( int i = 0; i <= 2; i++ )
  166. {
  167. if ( cameraInformation[1][i] > -1E-5 && cameraInformation[1][i] < 1E-5 )
  168. cameraInformation[1][i] = 1E-4;
  169. }
  170. switch ( key )
  171. {
  172. case 122: case 90: //z
  173. if ( movementSpeed < 0.5 )
  174. movementSpeed = 1.0;
  175. else
  176. movementSpeed = 0.025;
  177. break;
  178. case 119: case 52: forwardsOrBackwards = 1; move_forward ( forwardsOrBackwards ); break; //w
  179. case 115: case 83: forwardsOrBackwards = -1;move_forward ( forwardsOrBackwards ); break; //s
  180. case 97 : case 65: forwardsOrBackwards = 1; move_left ( forwardsOrBackwards ); break; //a
  181. case 100: case 68: forwardsOrBackwards = -1;move_left ( forwardsOrBackwards ); break; //d
  182. case 113: case 81: forwardsOrBackwards = -1;move_up ( forwardsOrBackwards ); break; //q
  183. case 101: case 69: forwardsOrBackwards = 1; move_up ( forwardsOrBackwards ); break; //e
  184. case 27 : exit ( 0 ); //esc CLOSE PROGRAM
  185. }
  186. if ( cuboidBuilding == 0 ) //IF NOT BUILDING A CUBE, MOVE CAMERA COORDS BY THE AMOUNT THEY HAVE CHANGED
  187. {
  188. for ( int i = 0; i <=2; i++)
  189. {
  190. cameraInformation[2][i] = ORIGINAL_CAMERA_LOCATION[i] + cameraInformation[0][i];
  191. }
  192. }
  193. }
  194. /*cuboid TAKES INPUTS OF CENTER OF CUBE, SIZE OF CUBE AND COLOURS OF EACH FACE THEN PRODUCES A CUBE BY SPLITING EACH FACE UP INTO TWO TRIANGLES*/
  195. void cuboid ( float OCX, float OCY, float OCZ,
  196. float xsize, float ysize, float zsize,
  197. float TR, float TG, float TB,
  198. float BR, float BG, float BB,
  199. float FR, float FG, float FB,
  200. float BWR, float BWG, float BWB,
  201. float LR, float LG, float LB,
  202. float RR, float RG, float RB )
  203. {
  204. glBegin( GL_TRIANGLES );
  205. //MAKE TRIANGLES IN SHAPE OF A CUBE BY SPECIFYING VERTICES OF TRIANGLES
  206. glColor3f ( TR, TG, TB ); //TOP
  207. glVertex3f( OCX - xsize, OCY - ysize, OCZ + zsize );
  208. glVertex3f( OCX + xsize, OCY + ysize, OCZ + zsize );
  209. glVertex3f( OCX - xsize, OCY + ysize, OCZ + zsize );
  210. glVertex3f( OCX - xsize, OCY - ysize, OCZ + zsize );
  211. glVertex3f( OCX + xsize, OCY + ysize, OCZ + zsize );
  212. glVertex3f( OCX + xsize, OCY - ysize, OCZ + zsize );
  213. glColor3f ( BR, BG, BB ); //BOTTOM
  214. glVertex3f( OCX - xsize, OCY - ysize, OCZ - zsize );
  215. glVertex3f( OCX + xsize, OCY + ysize, OCZ - zsize );
  216. glVertex3f( OCX - xsize, OCY + ysize, OCZ - zsize );
  217. glVertex3f( OCX - xsize, OCY - ysize, OCZ - zsize );
  218. glVertex3f( OCX + xsize, OCY + ysize, OCZ - zsize );
  219. glVertex3f( OCX + xsize, OCY - ysize, OCZ - zsize );
  220. glColor3f ( FR, FG, FB ); //FORWARDS
  221. glVertex3f( OCX - xsize, OCY - ysize, OCZ + zsize );
  222. glVertex3f( OCX + xsize, OCY - ysize, OCZ - zsize );
  223. glVertex3f( OCX + xsize, OCY - ysize, OCZ + zsize );
  224. glVertex3f( OCX - xsize, OCY - ysize, OCZ + zsize );
  225. glVertex3f( OCX + xsize, OCY - ysize, OCZ - zsize );
  226. glVertex3f( OCX - xsize, OCY - ysize, OCZ - zsize );
  227. glColor3f ( BWR, BWG, BWB ); //BACKWARDS
  228. glVertex3f( OCX - xsize, OCY + ysize, OCZ + zsize);
  229. glVertex3f( OCX + xsize, OCY + ysize, OCZ - zsize );
  230. glVertex3f( OCX + xsize, OCY + ysize, OCZ + zsize );
  231. glVertex3f( OCX - xsize, OCY + ysize, OCZ + zsize );
  232. glVertex3f( OCX + xsize, OCY + ysize, OCZ - zsize );
  233. glVertex3f( OCX - xsize, OCY + ysize, OCZ - zsize );
  234. glColor3f ( LR, LG, LB ); //LEFT
  235. glVertex3f( OCX - xsize, OCY - ysize, OCZ + zsize );
  236. glVertex3f( OCX - xsize, OCY + ysize, OCZ - zsize );
  237. glVertex3f( OCX - xsize, OCY - ysize, OCZ - zsize );
  238. glVertex3f( OCX - xsize, OCY - ysize, OCZ + zsize );
  239. glVertex3f( OCX - xsize, OCY + ysize, OCZ - zsize );
  240. glVertex3f( OCX - xsize, OCY + ysize, OCZ + zsize );
  241. glColor3f ( RR, RG, RB ); //RIGHT
  242. glVertex3f( OCX + xsize, OCY - ysize, OCZ + zsize );
  243. glVertex3f( OCX + xsize, OCY + ysize, OCZ - zsize );
  244. glVertex3f( OCX + xsize, OCY - ysize, OCZ - zsize );
  245. glVertex3f( OCX + xsize, OCY - ysize, OCZ + zsize );
  246. glVertex3f( OCX + xsize, OCY + ysize, OCZ - zsize );
  247. glVertex3f( OCX + xsize, OCY + ysize, OCZ + zsize );
  248. glEnd( );
  249. }
  250. /*place_cuboid TRIGGERS IF LEFT MOUSE BUTTON IS PLACED, CAUSES A TEMPORARY CUBE TO APPEAR AT THE CURSOR LOCATION, THEN WHEN LEFT MOUSE BUTTON IS RELEASED IT SAVES THE CENTER,SIZE AND COLOUR OF THIS TEMPORARY CUBE INTO THE PERMAMENT ARRAYS OF CUBS*/
  251.  
  252. /*display TAKES THE ARRAYS OF CUBE AND MOLECULE LOCATIONS, SIZE AND COLOURS THEN RENDERS AND CHECKS IF MOLECULES ARE COLLIDING WITH A CUBE*/
  253. void display ( )
  254. {
  255. glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  256. //SET EDGES OF THE MAP
  257. cuboid ( 0.0, 0.0, 0.0,
  258. MAPSIZE, MAPSIZE, MAPSIZE,
  259. 0.0, 0.0, 1.0,
  260. 0.0, 1.0, 0.0,
  261. 0.0, 1.0, 0.0,
  262. 0.0, 1.0, 0.0,
  263. 0.0, 1.0, 0.0,
  264. 0.0, 1.0, 0.0 );
  265. glColor3d( 1.0, 0.0, 0.0 );
  266. glPushMatrix( );
  267. glLoadIdentity( );
  268. glMatrixMode(GL_PROJECTION);
  269. glPopMatrix();
  270. glMatrixMode(GL_MODELVIEW);
  271. rotate_camera( ); //ROTATE CAMERA WITH MOUSE
  272. //MOVE CAMERA
  273. gluLookAt( cameraInformation[2][0], cameraInformation[2][1], cameraInformation[2][2], //Camera location
  274. cameraInformation[2][0] + cameraInformation[1][0], cameraInformation[2][1] + cameraInformation[1][1], cameraInformation[2][2] + cameraInformation[1][2], //LOOK AT
  275. 0.0, 0.0, 1.0 ); //VERTICAL
  276. glutSwapBuffers();
  277. }
  278.  
  279. #include <GL/freeglut.h>
  280. #include <cmath>
  281.  
  282. int cuboidBuilding = 0;//IS A CUBE CURRENTLY BEING BUILT? 0 FOR NO, 1 FOR YES.
  283.  
  284. const float ORIGINAL_CAMERA_LOCATION[3] = { 0, 0, 0 }, //ORIGINAL CAMERA LOCATION
  285. ORIGINAL_CAMERA_DIRECTION[3] = { 2.001, 0, 0 },
  286. PI = 3.14159265359, //PI
  287. MAPSIZE = 20.0, //SIZE OF THE CUBE SURROUNDING THE CENTER
  288. SIZESCALE = 100.0; //SCALE THE SIZE OF BOXES
  289.  
  290. float cameraInformation[3][3], //(CAMERA TRANSLATION FROM ORIGINAL CAMERA LOCATION, CAMERA DIRECTION, CAMERA LOCATION) in (x,y,z)
  291. cursorAngle[2], //POSITION OF CURSOR CONVERTED TO AN ANGLE, in (y,z)
  292. cubeInitialOrigin[3], //ORIGIN OF CUBE WHEN STARTING BUILDING, in (x,y,z)
  293. movementSpeed = 0.0125;
  294.  
  295. // DETECTS LOCATION OF CURSOR, ADJUSTING THE
  296. // DIRECTION LOOKED DEPENDING ON WHAT DIRECTION THE MOUSE IS MOVED
  297. bool warped = false;
  298. void passiveMotion( int x, int y )
  299. {
  300. if( warped )
  301. {
  302. // break warp loop
  303. warped = false;
  304. return;
  305. }
  306.  
  307. int widthOfMonitor = glutGet( GLUT_WINDOW_WIDTH );
  308. int heightOfMonitor = glutGet( GLUT_WINDOW_HEIGHT );
  309.  
  310. //DISPLACEMENT FROM CENTRE OF SCREEN IN X&Y
  311. int xmpos = ( x - widthOfMonitor / 2 );
  312. int ympos = ( y - heightOfMonitor / 2 );
  313.  
  314. //TAKE MOUSE COORDS AND SET WHOLE WINDOW TO BE LENGTH 2PI IN X AND Y
  315. cursorAngle[0] += - ( ( xmpos * 180 / (widthOfMonitor / 2) ) * PI / 180 );
  316. cursorAngle[1] += ( ( ympos * 180 / (heightOfMonitor / 2) ) * PI / 180 );
  317. //DON'T ALLOW ROTATING UP PAST CEILING OR BELOW FLOOR, CAN BE DONE BUT MAKES PERSPECTIVE CONFUSING
  318. if ( cursorAngle[1] > 0 )
  319. cursorAngle[1] = - 1E-5;
  320. else if ( cursorAngle[1] < -PI )
  321. cursorAngle[1] = -( PI - 1E-5 );
  322. //CONVERT FROM SPHERICAL POLARS INTO CARTESIANS
  323. cameraInformation[1][0] = cos( cursorAngle[0] ) * sin( cursorAngle[1] );
  324. cameraInformation[1][1] = sin( cursorAngle[0] ) * sin( cursorAngle[1] );
  325. cameraInformation[1][2] = -cos( cursorAngle[1] );
  326.  
  327. //KEEP CURSOR CENTERED TO PREVENT SCREEN GETTING STUCK WHEN ROTATING PAST 2PI.
  328. warped = true;
  329. glutWarpPointer( widthOfMonitor / 2, heightOfMonitor / 2 );
  330. }
  331.  
  332. // MoveForwards TRIGGERS IF W OR S IS PRESSED AND MOVES FORWARD OR BACKWARDS
  333. // IN THE DIRECTION FACED IF A CUBE IS NOT BEING BUILT, OR MOVES CUBE FORWARD
  334. // OR BACKWARDS IN THE DIRECTION FACED IF CUBE IS BEING BUILT
  335. void move_forward( float forwardsOrBackwards )
  336. {
  337. float changeInX, changeInY, changeInZ, length;
  338. if ( cuboidBuilding == 0 )
  339. {
  340. //GO FORWARD/BACK RELATIVE TO CAMERA VIEW
  341. changeInX = ( forwardsOrBackwards * cameraInformation[1][0] );
  342. changeInY = ( forwardsOrBackwards * cameraInformation[1][1] );
  343. changeInZ = ( forwardsOrBackwards * cameraInformation[1][2] );
  344. //NORMALIZE MOVEMENT
  345. length = sqrt ( pow ( changeInX, 2.0 ) + pow ( changeInY, 2.0 ) + pow ( changeInZ, 2.0 ) );
  346. changeInX = changeInX / length;
  347. changeInY = changeInY / length;
  348. changeInZ = changeInZ / length;
  349. //SET SENSITIVITY AND ADD CHANGE FROM STARTING POSITION TO STARTING POSITION TO GET CURRENT POSITION
  350. cameraInformation[0][0] += changeInX * movementSpeed;
  351. cameraInformation[0][1] += changeInY * movementSpeed;
  352. cameraInformation[0][2] += changeInZ * movementSpeed;
  353. }
  354.  
  355. }
  356.  
  357. // move_left TRIGGERS IF A OR D IS PRESSED AND MOVES LEFT OR RIGHT TO THE
  358. // DIRECTION FACED IF A CUBE IS NOT BEING BUILT, OR MOVES CUBE
  359. // LEFT OR RIGHT OF THE DIRECTION FACED IF CUBE IS BEING BUILT
  360. void move_left( float forwardsOrBackwards )
  361. {
  362. float changeInX, changeInY, length;
  363. if ( cuboidBuilding == 0 )
  364. {
  365. //GO LEFT/RIGHT RELATIVE TO CAMERA VIEW
  366. changeInX = ( -forwardsOrBackwards * cameraInformation[1][1] );
  367. changeInY = ( forwardsOrBackwards * cameraInformation[1][0] );
  368. //NORMALIZE MOVEMENT
  369. length = sqrt ( pow ( changeInX, 2.0 ) + pow ( changeInY, 2.0 ) );
  370. changeInX = changeInX / length;
  371. changeInY = changeInY / length;
  372. //SET SENSITIVITY AND ADD CHANGE FROM STARTING POSITION TO STARTING POSITION TO GET CURRENT POSITION
  373. cameraInformation[0][0] += changeInX * movementSpeed;
  374. cameraInformation[0][1] += changeInY * movementSpeed;
  375. }
  376. }
  377.  
  378. // move_up TRIGGERS IF Q OR E IS PRESSED AND MOVES VERTICALLY UP OR DOWN
  379. // IF A CUBE IS NOT BEING BUILT, OR MOVES CUBE VERTICALLY UP OR DOWN IF CUBE IS BEING BUILT
  380. void move_up( float forwardsOrBackwards )
  381. {
  382. //MOVEMENT AND MAKING CUBE AS THE DIRECTION MOVED IS ALWAYS PARRALEL TO Z COORDS, SO NO CONVERSION FROM CAMERA TO BOX IS REQUIRED
  383. float changeInZ, length;
  384. //GO UP/DOWN RELATIVE TO CAMERA VIEW
  385. changeInZ = ( forwardsOrBackwards );
  386. //NORMALIZE MOVEMENT
  387. length = sqrt( pow ( changeInZ, 2.0 ) );
  388. changeInZ = changeInZ / length;
  389. //SET SENSITIVITY
  390. if ( cuboidBuilding == 0 )
  391. cameraInformation[0][2] += changeInZ * movementSpeed;
  392. //ADD CHANGE FROM STARTING POSITION TO STARTING POSITION TO GET CURRENT POSITION
  393. }
  394.  
  395. // keyboard TRIGGERS IF A KEY ON THE KEYBOARD IS PRESSED,
  396. // THEN PASSES TO A FUNCTION THAT PROCESSES THE KEY PRESSED,
  397. // ALSO UPDATES THE LOCATION OF CAMERA IF MOVEMENT KEYS ARE PRESSED
  398. void keyboard( unsigned char key, int x, int y )
  399. {
  400. int forwardsOrBackwards; //FORWARD OR BACKWORDS.
  401. //PREVENT A POTENTIAL DIVIDE BY 0 ERROR BY SETTING 0 DIRECTIONS TO VERY SMALL DIRECTIONS.
  402. for ( int i = 0; i <= 2; i++ )
  403. {
  404. if ( cameraInformation[1][i] > -1E-5 && cameraInformation[1][i] < 1E-5 )
  405. cameraInformation[1][i] = 1E-4;
  406. }
  407. switch ( key )
  408. {
  409. case 122: case 90: //z
  410. if ( movementSpeed < 0.5 )
  411. movementSpeed = 1.0;
  412. else
  413. movementSpeed = 0.025;
  414. break;
  415. case 119: case 52: forwardsOrBackwards = 1; move_forward ( forwardsOrBackwards ); break; //w
  416. case 115: case 83: forwardsOrBackwards = -1;move_forward ( forwardsOrBackwards ); break; //s
  417. case 97 : case 65: forwardsOrBackwards = 1; move_left ( forwardsOrBackwards ); break; //a
  418. case 100: case 68: forwardsOrBackwards = -1;move_left ( forwardsOrBackwards ); break; //d
  419. case 113: case 81: forwardsOrBackwards = -1;move_up ( forwardsOrBackwards ); break; //q
  420. case 101: case 69: forwardsOrBackwards = 1; move_up ( forwardsOrBackwards ); break; //e
  421. case 27 : exit ( 0 ); //esc CLOSE PROGRAM
  422. }
  423. if ( cuboidBuilding == 0 ) //IF NOT BUILDING A CUBE, MOVE CAMERA COORDS BY THE AMOUNT THEY HAVE CHANGED
  424. {
  425. for ( int i = 0; i <=2; i++)
  426. {
  427. cameraInformation[2][i] = ORIGINAL_CAMERA_LOCATION[i] + cameraInformation[0][i];
  428. }
  429. }
  430. }
  431.  
  432. // cuboid TAKES INPUTS OF CENTER OF CUBE, SIZE OF CUBE AND COLOURS OF EACH FACE
  433. // THEN PRODUCES A CUBE BY SPLITING EACH FACE UP INTO TWO TRIANGLES
  434. void cuboid
  435. (
  436. float OCX, float OCY, float OCZ,
  437. float xsize, float ysize, float zsize,
  438. float TR, float TG, float TB,
  439. float BR, float BG, float BB,
  440. float FR, float FG, float FB,
  441. float BWR, float BWG, float BWB,
  442. float LR, float LG, float LB,
  443. float RR, float RG, float RB
  444. )
  445. {
  446. glBegin( GL_TRIANGLES );
  447. //MAKE TRIANGLES IN SHAPE OF A CUBE BY SPECIFYING VERTICES OF TRIANGLES
  448. glColor3f ( TR, TG, TB ); //TOP
  449. glVertex3f( OCX - xsize, OCY - ysize, OCZ + zsize );
  450. glVertex3f( OCX + xsize, OCY + ysize, OCZ + zsize );
  451. glVertex3f( OCX - xsize, OCY + ysize, OCZ + zsize );
  452. glVertex3f( OCX - xsize, OCY - ysize, OCZ + zsize );
  453. glVertex3f( OCX + xsize, OCY + ysize, OCZ + zsize );
  454. glVertex3f( OCX + xsize, OCY - ysize, OCZ + zsize );
  455. glColor3f ( BR, BG, BB ); //BOTTOM
  456. glVertex3f( OCX - xsize, OCY - ysize, OCZ - zsize );
  457. glVertex3f( OCX + xsize, OCY + ysize, OCZ - zsize );
  458. glVertex3f( OCX - xsize, OCY + ysize, OCZ - zsize );
  459. glVertex3f( OCX - xsize, OCY - ysize, OCZ - zsize );
  460. glVertex3f( OCX + xsize, OCY + ysize, OCZ - zsize );
  461. glVertex3f( OCX + xsize, OCY - ysize, OCZ - zsize );
  462. glColor3f ( FR, FG, FB ); //FORWARDS
  463. glVertex3f( OCX - xsize, OCY - ysize, OCZ + zsize );
  464. glVertex3f( OCX + xsize, OCY - ysize, OCZ - zsize );
  465. glVertex3f( OCX + xsize, OCY - ysize, OCZ + zsize );
  466. glVertex3f( OCX - xsize, OCY - ysize, OCZ + zsize );
  467. glVertex3f( OCX + xsize, OCY - ysize, OCZ - zsize );
  468. glVertex3f( OCX - xsize, OCY - ysize, OCZ - zsize );
  469. glColor3f ( BWR, BWG, BWB ); //BACKWARDS
  470. glVertex3f( OCX - xsize, OCY + ysize, OCZ + zsize);
  471. glVertex3f( OCX + xsize, OCY + ysize, OCZ - zsize );
  472. glVertex3f( OCX + xsize, OCY + ysize, OCZ + zsize );
  473. glVertex3f( OCX - xsize, OCY + ysize, OCZ + zsize );
  474. glVertex3f( OCX + xsize, OCY + ysize, OCZ - zsize );
  475. glVertex3f( OCX - xsize, OCY + ysize, OCZ - zsize );
  476. glColor3f ( LR, LG, LB ); //LEFT
  477. glVertex3f( OCX - xsize, OCY - ysize, OCZ + zsize );
  478. glVertex3f( OCX - xsize, OCY + ysize, OCZ - zsize );
  479. glVertex3f( OCX - xsize, OCY - ysize, OCZ - zsize );
  480. glVertex3f( OCX - xsize, OCY - ysize, OCZ + zsize );
  481. glVertex3f( OCX - xsize, OCY + ysize, OCZ - zsize );
  482. glVertex3f( OCX - xsize, OCY + ysize, OCZ + zsize );
  483. glColor3f ( RR, RG, RB ); //RIGHT
  484. glVertex3f( OCX + xsize, OCY - ysize, OCZ + zsize );
  485. glVertex3f( OCX + xsize, OCY + ysize, OCZ - zsize );
  486. glVertex3f( OCX + xsize, OCY - ysize, OCZ - zsize );
  487. glVertex3f( OCX + xsize, OCY - ysize, OCZ + zsize );
  488. glVertex3f( OCX + xsize, OCY + ysize, OCZ - zsize );
  489. glVertex3f( OCX + xsize, OCY + ysize, OCZ + zsize );
  490. glEnd( );
  491. }
  492.  
  493. // display TAKES THE ARRAYS OF CUBE AND MOLECULE LOCATIONS, SIZE AND
  494. // COLOURS THEN RENDERS AND CHECKS IF MOLECULES ARE COLLIDING WITH A CUBE
  495. void display ( )
  496. {
  497. glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  498.  
  499. //SET THE PERSPECTIVE
  500. glMatrixMode(GL_PROJECTION);
  501. glLoadIdentity();
  502. int widthOfMonitor = glutGet( GLUT_WINDOW_WIDTH );
  503. int heightOfMonitor = glutGet( GLUT_WINDOW_HEIGHT );
  504. gluPerspective( 90, //FOV
  505. widthOfMonitor / heightOfMonitor, //DISPLAY ASPECT
  506. 0.01, //NEAR CLIP
  507. 20000.0 ); //FAR CLIP
  508.  
  509. //MOVE CAMERA
  510. glMatrixMode(GL_MODELVIEW);
  511. glLoadIdentity();
  512. gluLookAt
  513. (
  514. cameraInformation[2][0], cameraInformation[2][1], cameraInformation[2][2], //Camera location
  515. cameraInformation[2][0] + cameraInformation[1][0],
  516. cameraInformation[2][1] + cameraInformation[1][1],
  517. cameraInformation[2][2] + cameraInformation[1][2], //LOOK AT
  518. 0.0, 0.0, 1.0
  519. ); //VERTICAL
  520.  
  521. glColorMaterial ( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE ) ;
  522. glEnable ( GL_COLOR_MATERIAL ) ;
  523. glEnable( GL_DEPTH_TEST ); //RENDER OBJECTS CLOSEST TO CAMERA INFRONT OF OBJECTS FURTHER AWAY
  524.  
  525. //SET EDGES OF THE MAP
  526. glColor3d( 1.0, 0.0, 0.0 );
  527. cuboid
  528. (
  529. 0.0, 0.0, 0.0,
  530. MAPSIZE, MAPSIZE, MAPSIZE,
  531. 0.0, 0.0, 1.0,
  532. 0.0, 1.0, 0.0,
  533. 0.0, 1.0, 0.0,
  534. 0.0, 1.0, 0.0,
  535. 0.0, 1.0, 0.0,
  536. 0.0, 1.0, 0.0
  537. );
  538.  
  539. glutSwapBuffers();
  540. }
  541.  
  542. void timer( int value )
  543. {
  544. glutPostRedisplay();
  545. glutTimerFunc( 16, timer, 0 );
  546. }
  547.  
  548. int main ( int argc, char **argv )
  549. {
  550. glutInit( &argc, argv );
  551. glutInitDisplayMode( GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA );
  552. glutInitWindowSize( 600, 600 );
  553. glutInitWindowPosition( 0, 0 );
  554. glutCreateWindow( "SQUARE" );
  555. glutKeyboardFunc( keyboard );
  556. glutDisplayFunc( display );
  557. glutPassiveMotionFunc( passiveMotion );
  558. glutTimerFunc( 0, timer, 0 );
  559. glutSetCursor( GLUT_CURSOR_NONE );
  560. glutMainLoop( );
  561. }
Add Comment
Please, Sign In to add comment