cplanes_obj.c 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. /*!
  2. \file lib/nviz/cplanes_obj.c
  3. \brief Nviz library -- Clip planes manipulation
  4. Based on visualization/nviz/src/cutplanes_obj.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/nviz.h>
  11. static void cp_draw(nv_data *, int, int, int);
  12. static geoview Gv;
  13. /*!
  14. \brief Creates a clip plane object
  15. The number of clip planes is fixed (MAX_CPLANES) and
  16. we'll create them all ahead of time anyway we just let
  17. the user decide on the id for each.
  18. */
  19. int Nviz_new_cplane(nv_data * data, int id)
  20. {
  21. data->num_cplanes++;
  22. /* Initialize internal attributes for this cutplane */
  23. data->cp_rot[id][X] = data->cp_rot[id][Y] = data->cp_rot[id][Z] = 0.0;
  24. data->cp_trans[id][X] = data->cp_trans[id][Y] = data->cp_trans[id][Z] =
  25. 0.0;
  26. data->cp_on[id] = 0;
  27. return 1;
  28. }
  29. /*!
  30. \brief Turn on (make current) the given clip plane.
  31. \param data nviz data
  32. \param cplane id
  33. */
  34. int Nviz_on_cplane(nv_data * data, int id)
  35. {
  36. data->cur_cplane = id;
  37. data->cp_on[id] = 1;
  38. GS_set_cplane(id);
  39. return 1;
  40. }
  41. /*!
  42. \brief Turn off (make inactive) the given clip plane
  43. \param data nviz data
  44. \param cplane id
  45. */
  46. int Nviz_off_cplane(nv_data * data, int id)
  47. {
  48. data->cp_on[id] = 0;
  49. GS_unset_cplane(id);
  50. return 1;
  51. }
  52. /*!
  53. \brief Draw the clip plane
  54. \param bound1
  55. \param bound2
  56. */
  57. int Nviz_draw_cplane(nv_data * data, int bound1, int bound2)
  58. {
  59. cp_draw(data, data->cur_cplane, bound1, bound2);
  60. return 1;
  61. }
  62. /*!
  63. \brief Draw current clip plane
  64. \param data nviz data
  65. \param current id of current clip plane
  66. \param surf1 first surface id
  67. \param surf2 second surface id
  68. */
  69. void cp_draw(nv_data * data, int current, int surf1, int surf2)
  70. {
  71. int i, nsurfs;
  72. int surf_min = 0, surf_max = 0, temp;
  73. int *surf_list;
  74. GS_set_draw(GSD_BACK);
  75. GS_clear(data->bgcolor);
  76. GS_ready_draw();
  77. /* If surf boundaries present then find them */
  78. surf_list = GS_get_surf_list(&nsurfs);
  79. if ((surf1 != -1) && (surf2 != -1)) {
  80. for (i = 0; i < nsurfs; i++) {
  81. if (surf_list[i] == surf1)
  82. surf_min = i;
  83. if (surf_list[i] == surf2)
  84. surf_max = i;
  85. }
  86. if (surf_max < surf_min) {
  87. temp = surf_min;
  88. surf_min = surf_max;
  89. surf_max = temp;
  90. }
  91. surf_max++;
  92. }
  93. else {
  94. surf_min = 0;
  95. surf_max = nsurfs;
  96. }
  97. if (nsurfs > 1) {
  98. for (i = 0; i < MAX_CPLANES; i++) {
  99. if (data->cp_on[i])
  100. GS_draw_cplane_fence(surf_list[0], surf_list[1], i);
  101. }
  102. }
  103. for (i = surf_min; i < surf_max; i++) {
  104. GS_draw_wire(surf_list[i]);
  105. }
  106. GS_done_draw();
  107. return;
  108. }
  109. /*!
  110. \brief Return the number of clip planes objects currently allocated.
  111. \param data nviz data
  112. */
  113. int Nviz_num_cplanes(nv_data * data)
  114. {
  115. return data->num_cplanes;
  116. }
  117. /*!
  118. \brief Get the current active cutplane.
  119. \param data nviz data
  120. */
  121. int Nviz_get_current_cplane(nv_data * data)
  122. {
  123. return data->cur_cplane;
  124. }
  125. /*!
  126. \brief Set the rotation for the current clip plane.
  127. \param data nviz data
  128. \param id id of current clip plane
  129. \param dx,dy,dz rotation parameters
  130. \return 1
  131. */
  132. int Nviz_set_cplane_rotation(nv_data * data, int id, float dx, float dy, float dz)
  133. {
  134. data->cp_rot[id][X] = dx;
  135. data->cp_rot[id][Y] = dy;
  136. data->cp_rot[id][Z] = dz;
  137. GS_set_cplane_rot(id, data->cp_rot[id][X], data->cp_rot[id][Y],
  138. data->cp_rot[id][Z]);
  139. cp_draw(data, data->cur_cplane, -1, -1);
  140. return 1;
  141. }
  142. /*!
  143. \brief Get the rotation values for the current clip plane.
  144. \param data nviz data
  145. \param id id of current clip plane
  146. \param dx,dy,dz rotation parameters
  147. \return 1
  148. */
  149. int Nviz_get_cplane_rotation(nv_data * data, int id, float *dx, float *dy, float *dz)
  150. {
  151. *dx = data->cp_rot[id][X];
  152. *dy = data->cp_rot[id][Y];
  153. *dz = data->cp_rot[id][Z];
  154. return 1;
  155. }
  156. /*!
  157. \brief Set the translation for the current clip plane.
  158. \param data nviz data
  159. \param id id of current clip plane
  160. \param dx,dy,dz values for setting translation
  161. \return 1
  162. */
  163. int Nviz_set_cplane_translation(nv_data * data, int id, float dx, float dy, float dz)
  164. {
  165. data->cp_trans[id][X] = dx;
  166. data->cp_trans[id][Y] = dy;
  167. data->cp_trans[id][Z] = dz;
  168. GS_set_cplane_trans(id, data->cp_trans[id][X], data->cp_trans[id][Y],
  169. data->cp_trans[id][Z]);
  170. cp_draw(data, data->cur_cplane, -1, -1);
  171. return 1;
  172. }
  173. /*!
  174. \brief Get the translation values for the current clip plane.
  175. \param data nviz data
  176. \param id id of current clip plane
  177. \param dx,dy,dz translation parameters
  178. */
  179. int Nviz_get_cplane_translation(nv_data * data, int id, float *dx, float *dy, float *dz)
  180. {
  181. *dx = data->cp_trans[id][X];
  182. *dy = data->cp_trans[id][Y];
  183. *dz = data->cp_trans[id][Z];
  184. return 1;
  185. }
  186. /*!
  187. \brief Set appropriate fence color
  188. \param type type of fence (FC_ABOVE, FC_BELOW, FC_BLEND, FC_GREY, FC_OFF)
  189. */
  190. int Nviz_set_fence_color(nv_data * data, int type)
  191. {
  192. GS_set_fencecolor(type);
  193. return 1;
  194. }
  195. int Nviz_set_cplane_here(nv_data *data, int cplane, float sx, float sy)
  196. {
  197. float x, y, z, len, los[2][3];
  198. float dx, dy, dz;
  199. float n, s, w, e;
  200. Point3 realto, dir;
  201. int id;
  202. geosurf *gs;
  203. if (GS_get_selected_point_on_surface(sx, sy, &id, &x, &y, &z)) {
  204. gs = gs_get_surf(id);
  205. if (gs) {
  206. realto[X] = x - gs->ox + gs->x_trans;
  207. realto[Y] = y - gs->oy + gs->y_trans;
  208. realto[Z] = z + gs->z_trans;
  209. }
  210. else
  211. return 0;
  212. }
  213. else {
  214. if (gsd_get_los(los, (short)sx, (short)sy)) {
  215. len = GS_distance(Gv.from_to[FROM], Gv.real_to);
  216. GS_v3dir(los[FROM], los[TO], dir);
  217. GS_v3mult(dir, len);
  218. realto[X] = Gv.from_to[FROM][X] + dir[X];
  219. realto[Y] = Gv.from_to[FROM][Y] + dir[Y];
  220. realto[Z] = Gv.from_to[FROM][Z] + dir[Z];
  221. }
  222. else
  223. return 0;
  224. }
  225. Nviz_get_cplane_translation(data, cplane, &dx, &dy, &dz);
  226. GS_get_region(&n, &s, &w, &e);
  227. dx = realto[X] - (e - w) / 2.;
  228. dy = realto[Y] - (n - s) / 2.;
  229. Nviz_set_cplane_translation(data, cplane, dx, dy, dz);
  230. return 1;
  231. }