change_view.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  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. }