change_view.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. /*!
  2. \file lib/nviz/change_view.c
  3. \brief Nviz library -- Change view settings
  4. Based on visualization/nviz/src/change_view.c
  5. (C) 2008, 2010 by the GRASS Development Team
  6. This program is free software under the GNU General Public License
  7. (>=v2). Read the file COPYING that comes with GRASS for details.
  8. \author Updated/modified by Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
  9. */
  10. #include <grass/glocale.h>
  11. #include <grass/nviz.h>
  12. /*!
  13. \brief GL canvas resized
  14. \param width window width
  15. \param height window height
  16. \return 1 on success
  17. \return 0 on failure (window resized by dafault to 20x20 px)
  18. */
  19. int Nviz_resize_window(int width, int height)
  20. {
  21. int ret;
  22. ret = 1;
  23. if (width < 1 || height < 1) {
  24. width = 20;
  25. height = 20;
  26. ret = 0;
  27. }
  28. G_debug(1, "Nviz_resize_window(): width = %d height = %d", width, height);
  29. GS_set_viewport(0, width, 0, height);
  30. /* GS_clear(0x0000FF); causes red flash - debug only */
  31. GS_set_draw(GSD_BACK);
  32. GS_ready_draw();
  33. GS_alldraw_wire();
  34. GS_done_draw();
  35. return ret;
  36. }
  37. /*!
  38. \brief Update ranges
  39. Call whenever a new surface is added, deleted, or exag changes
  40. \return 1
  41. */
  42. int Nviz_update_ranges(nv_data * dc)
  43. {
  44. float zmin, zmax, exag;
  45. GS_get_longdim(&(dc->xyrange));
  46. dc->zrange = 0.;
  47. /* Zrange is based on a minimum of Longdim */
  48. if (GS_global_exag()) {
  49. exag = GS_global_exag();
  50. dc->zrange = dc->xyrange / exag;
  51. }
  52. else {
  53. exag = 1.0;
  54. }
  55. GS_get_zrange_nz(&zmin, &zmax); /* actual */
  56. zmax = zmin + (3. * dc->xyrange / exag);
  57. zmin = zmin - (2. * dc->xyrange / exag);
  58. if ((zmax - zmin) > dc->zrange)
  59. dc->zrange = zmax - zmin;
  60. return 1;
  61. }
  62. /*!
  63. \brief Change position of view
  64. \param data nviz data
  65. \param x_pos,y_pos x,y position (model coordinates)
  66. \return 1
  67. */
  68. int Nviz_set_viewpoint_position(double x_pos, double y_pos)
  69. {
  70. float xpos, ypos, from[3];
  71. float tempx, tempy;
  72. xpos = x_pos;
  73. xpos = (xpos < 0) ? 0 : (xpos > 1.0) ? 1.0 : xpos;
  74. ypos = 1.0 - y_pos;
  75. ypos = (ypos < 0) ? 0 : (ypos > 1.0) ? 1.0 : ypos;
  76. if (x_pos < 0.0 || x_pos > 1.0 || y_pos < 0.0 || y_pos > 1.0) {
  77. G_debug(3, "Invalid view position coordinates, using %f,%f",
  78. xpos, 1.0 - ypos);
  79. }
  80. G_debug(1, "Nviz_set_viewpoint_position(): x = %f y = %f", x_pos, y_pos);
  81. GS_get_from(from);
  82. tempx = xpos * RANGE - RANGE_OFFSET;
  83. tempy = ypos * RANGE - RANGE_OFFSET;
  84. if ((from[X] != tempx) || (from[Y] != tempy)) {
  85. from[X] = tempx;
  86. from[Y] = tempy;
  87. GS_moveto(from);
  88. /* Nviz_draw_quick(data); */
  89. }
  90. return 1;
  91. }
  92. /*!
  93. \brief Change viewpoint height
  94. \param data nviz data
  95. \param height height value (world coordinates)
  96. \return 1
  97. */
  98. int Nviz_set_viewpoint_height(double height)
  99. {
  100. float from[3];
  101. G_debug(1, "Nviz_set_viewpoint_height(): value = %f", height);
  102. GS_get_from_real(from);
  103. if (height != from[Z]) {
  104. from[Z] = height;
  105. GS_moveto_real(from);
  106. /*
  107. normalize (from);
  108. GS_setlight_position(1, from[X], from[Y], from[Z], 0);
  109. */
  110. /* Nviz_draw_quick(data); */
  111. }
  112. return 1;
  113. }
  114. /*!
  115. \brief Change viewpoint perspective (field of view)
  116. \param data nviz data
  117. \param persp perspective value (0-100, in degrees)
  118. \return 1
  119. */
  120. int Nviz_set_viewpoint_persp(int persp)
  121. {
  122. int fov;
  123. G_debug(1, "Nviz_set_viewpoint_persp(): value = %d", persp);
  124. fov = (int)(10 * persp);
  125. GS_set_fov(fov);
  126. /* Nviz_draw_quick(data); */
  127. return 1;
  128. }
  129. /*!
  130. \brief Change viewpoint twist
  131. \param data nviz data
  132. \param persp twist value (-180-180, in degrees)
  133. \return 1
  134. */
  135. int Nviz_set_viewpoint_twist(int twist)
  136. {
  137. G_debug(1, "Nviz_set_viewpoint_twist(): value = %d", twist);
  138. GS_set_twist(10 * twist);
  139. /* Nviz_draw_quick(data); */
  140. return 1;
  141. }
  142. /*!
  143. \brief Change z-exag value
  144. \param data nviz data
  145. \param exag exag value
  146. \return 1
  147. */
  148. int Nviz_change_exag(nv_data * data, double exag)
  149. {
  150. double temp;
  151. G_debug(1, "Nviz_change_exag(): value = %f", exag);
  152. temp = GS_global_exag();
  153. if (exag != temp) {
  154. GS_set_global_exag(exag);
  155. Nviz_update_ranges(data);
  156. /* Nviz_draw_quick(data); */
  157. }
  158. return 1;
  159. }
  160. /*!
  161. \brief Change focused point
  162. \param sx,sy screen coordinates
  163. \return 1
  164. */
  165. int Nviz_look_here(double sx, double sy)
  166. {
  167. G_debug(1, "Nviz_look_here(): screen coordinates = %f %f", sx, sy);
  168. GS_look_here(sx, sy);
  169. return 1;
  170. }
  171. /*!
  172. \brief Get current modelview matrix
  173. */
  174. void Nviz_get_modelview(double *modelMatrix)
  175. {
  176. glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);
  177. }
  178. /*!
  179. \brief Set rotation parameters
  180. Rotate scene by given parameters related to mouse drag event
  181. (difference from current state).
  182. Coordinates determine the second point of rotation axis,
  183. the first point is (0, 0, 0).
  184. \param angle angle
  185. \param x,y,z axis coordinate
  186. */
  187. void Nviz_set_rotation(double angle, double x, double y, double z)
  188. {
  189. G_debug(3, "Nviz_set_rotation(): angle = %f, x = %f, y = %f, z = %f", angle, x, y, z);
  190. GS_set_rotation(angle, x, y, z);
  191. }
  192. /*!
  193. \brief Stop scene rotation
  194. */
  195. void Nviz_unset_rotation(void)
  196. {
  197. GS_unset_rotation();
  198. }
  199. /*!
  200. \brief Stop scene rotation
  201. */
  202. void Nviz_init_rotation(void)
  203. {
  204. GS_init_rotation();
  205. }