cplanes_obj.c 6.2 KB

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