volume.cpp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. /**
  2. \file nviz/volume.cpp
  3. \brief wxNviz extension (3D view mode) - volume attributes
  4. This program is free software under the GNU General Public
  5. License (>=v2). Read the file COPYING that comes with GRASS
  6. for details.
  7. (C) 2008-2009 by Martin Landa, and the GRASS development team
  8. \author Martin Landa <landa.martin gmail.com> (Google SoC 2008)
  9. */
  10. #include "nviz.h"
  11. /**
  12. \brief Add new isosurface
  13. \param id volume id
  14. \param level isosurface level (topography)
  15. \return -1 on failure
  16. \return 1 on success
  17. */
  18. int Nviz::AddIsosurface(int id, int level)
  19. {
  20. int nisosurfs;
  21. if (!GVL_vol_exists(id))
  22. return -1;
  23. if (GVL_isosurf_add(id) < 0)
  24. return -1;
  25. /* set topography level */
  26. nisosurfs = GVL_isosurf_num_isosurfs(id);
  27. return GVL_isosurf_set_att_const(id, nisosurfs - 1,
  28. ATT_TOPO, level);
  29. }
  30. /**
  31. \brief Delete isosurface
  32. \param id volume id
  33. \param isosurf_id isosurface id
  34. \return 1 on success
  35. \return -1 volume not found
  36. \return -2 isosurface not found
  37. \return -3 on failure
  38. */
  39. int Nviz::DeleteIsosurface(int id, int isosurf_id)
  40. {
  41. int ret;
  42. if (!GVL_vol_exists(id))
  43. return -1;
  44. if (isosurf_id > GVL_isosurf_num_isosurfs(id))
  45. return -2;
  46. ret = GVL_isosurf_del(id, isosurf_id);
  47. return ret < 0 ? -3 : 1;
  48. }
  49. /*!
  50. \brief Move isosurface up/down in the list
  51. \param id volume id
  52. \param isosurf_id isosurface id
  53. \param up if true move up otherwise down
  54. \return 1 on success
  55. \return -1 volume not found
  56. \return -2 isosurface not found
  57. \return -3 on failure
  58. */
  59. int Nviz::MoveIsosurface(int id, int isosurf_id, bool up)
  60. {
  61. int ret;
  62. if (!GVL_vol_exists(id))
  63. return -1;
  64. if (isosurf_id > GVL_isosurf_num_isosurfs(id))
  65. return -2;
  66. if (up)
  67. ret = GVL_isosurf_move_up(id, isosurf_id);
  68. else
  69. ret = GVL_isosurf_move_down(id, isosurf_id);
  70. return ret < 0 ? -3 : 1;
  71. }
  72. /*!
  73. \brief Set isosurface color
  74. \param id volume id
  75. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  76. \param map if true use map otherwise constant
  77. \param value map name of value
  78. \return 1 on success
  79. \return -1 volume not found
  80. \return -2 isosurface not found
  81. \return -3 on failure
  82. */
  83. int Nviz::SetIsosurfaceColor(int id, int isosurf_id,
  84. bool map, const char *value)
  85. {
  86. return SetIsosurfaceAttr(id, isosurf_id, ATT_COLOR, map, value);
  87. }
  88. /*!
  89. \brief Set isosurface mask
  90. @todo invert
  91. \param id volume id
  92. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  93. \param invert true for invert mask
  94. \param value map name to be used for mask
  95. \return 1 on success
  96. \return -1 volume not found
  97. \return -2 isosurface not found
  98. \return -3 on failure
  99. */
  100. int Nviz::SetIsosurfaceMask(int id, int isosurf_id,
  101. bool invert, const char *value)
  102. {
  103. return SetIsosurfaceAttr(id, isosurf_id, ATT_MASK, true, value);
  104. }
  105. /*!
  106. \brief Set isosurface transparency
  107. \param id volume id
  108. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  109. \param map if true use map otherwise constant
  110. \param value map name of value
  111. \return 1 on success
  112. \return -1 volume not found
  113. \return -2 isosurface not found
  114. \return -3 on failure
  115. */
  116. int Nviz::SetIsosurfaceTransp(int id, int isosurf_id,
  117. bool map, const char *value)
  118. {
  119. return SetIsosurfaceAttr(id, isosurf_id, ATT_TRANSP, map, value);
  120. }
  121. /*!
  122. \brief Set isosurface shininess
  123. \param id volume id
  124. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  125. \param map if true use map otherwise constant
  126. \param value map name of value
  127. \return 1 on success
  128. \return -1 volume not found
  129. \return -2 isosurface not found
  130. \return -3 on failure
  131. */
  132. int Nviz::SetIsosurfaceShine(int id, int isosurf_id,
  133. bool map, const char *value)
  134. {
  135. return SetIsosurfaceAttr(id, isosurf_id, ATT_SHINE, map, value);
  136. }
  137. /*!
  138. \brief Set isosurface emission
  139. \param id volume id
  140. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  141. \param map if true use map otherwise constant
  142. \param value map name of value
  143. \return 1 on success
  144. \return -1 volume not found
  145. \return -2 isosurface not found
  146. \return -3 on failure
  147. */
  148. int Nviz::SetIsosurfaceEmit(int id, int isosurf_id,
  149. bool map, const char *value)
  150. {
  151. return SetIsosurfaceAttr(id, isosurf_id, ATT_EMIT, map, value);
  152. }
  153. /*!
  154. \brief Set isosurface attribute
  155. \param id volume id
  156. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  157. \param attr attribute desc
  158. \param map if true use map otherwise constant
  159. \param value map name of value
  160. \return 1 on success
  161. \return -1 volume not found
  162. \return -2 isosurface not found
  163. \return -3 setting attributes failed
  164. */
  165. int Nviz::SetIsosurfaceAttr(int id, int isosurf_id,
  166. int attr, bool map, const char *value)
  167. {
  168. int ret;
  169. if (!GVL_vol_exists(id)) {
  170. return -1;
  171. }
  172. if (isosurf_id > GVL_isosurf_num_isosurfs(id) - 1)
  173. return -2;
  174. if (map) {
  175. ret = GVL_isosurf_set_att_map(id, isosurf_id, attr,
  176. value);
  177. }
  178. else {
  179. float val;
  180. if (attr == ATT_COLOR) {
  181. val = Nviz_color_from_str(value);
  182. }
  183. else {
  184. val = atof(value);
  185. }
  186. ret = GVL_isosurf_set_att_const(id, isosurf_id, attr,
  187. val);
  188. }
  189. G_debug(1, "Nviz::SetIsosurfaceAttr(): id=%d, isosurf=%d, "
  190. "attr=%d, map=%d, value=%s",
  191. id, isosurf_id, attr, map, value);
  192. return ret > 0 ? 1 : -2;
  193. }
  194. /*!
  195. \brief Unset isosurface mask
  196. \param id volume id
  197. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  198. \return 1 on success
  199. \return -1 volume not found
  200. \return -2 isosurface not found
  201. \return -3 setting attributes failed
  202. */
  203. int Nviz::UnsetIsosurfaceMask(int id, int isosurf_id)
  204. {
  205. return UnsetIsosurfaceAttr(id, isosurf_id, ATT_MASK);
  206. }
  207. /*!
  208. \brief Unset isosurface transparency
  209. \param id volume id
  210. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  211. \return 1 on success
  212. \return -1 volume not found
  213. \return -2 isosurface not found
  214. \return -3 setting attributes failed
  215. */
  216. int Nviz::UnsetIsosurfaceTransp(int id, int isosurf_id)
  217. {
  218. return UnsetIsosurfaceAttr(id, isosurf_id, ATT_TRANSP);
  219. }
  220. /*!
  221. \brief Unset isosurface emission
  222. \param id volume id
  223. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  224. \return 1 on success
  225. \return -1 volume not found
  226. \return -2 isosurface not found
  227. \return -3 setting attributes failed
  228. */
  229. int Nviz::UnsetIsosurfaceEmit(int id, int isosurf_id)
  230. {
  231. return UnsetIsosurfaceAttr(id, isosurf_id, ATT_EMIT);
  232. }
  233. /*!
  234. \brief Unset surface attribute
  235. \param id surface id
  236. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  237. \param attr attribute descriptor
  238. \return 1 on success
  239. \return -1 volume not found
  240. \return -2 isosurface not found
  241. \return -2 on failure
  242. */
  243. int Nviz::UnsetIsosurfaceAttr(int id, int isosurf_id,
  244. int attr)
  245. {
  246. int ret;
  247. if (!GVL_vol_exists(id)) {
  248. return -1;
  249. }
  250. if (isosurf_id > GVL_isosurf_num_isosurfs(id) - 1)
  251. return -2;
  252. G_debug(1, "Nviz::UnsetSurfaceAttr(): id=%d, isosurf_id=%d, attr=%d",
  253. id, isosurf_id, attr);
  254. ret = GVL_isosurf_unset_att(id, isosurf_id, attr);
  255. return ret > 0 ? 1 : -2;
  256. }
  257. /*!
  258. \brief Set draw mode for isosurfaces
  259. \param mode
  260. \return 1 on success
  261. \return -1 volume set not found
  262. \return -2 on failure
  263. */
  264. int Nviz::SetIsosurfaceMode(int id, int mode)
  265. {
  266. int ret;
  267. if (!GVL_vol_exists(id)) {
  268. return -1;
  269. }
  270. ret = GVL_isosurf_set_drawmode(id, mode);
  271. return ret < 0 ? -2 : 1;
  272. }
  273. /*!
  274. \brief Set draw resolution for isosurfaces
  275. \param res resolution value
  276. \return 1 on success
  277. \return -1 volume set not found
  278. \return -2 on failure
  279. */
  280. int Nviz::SetIsosurfaceRes(int id, int res)
  281. {
  282. int ret;
  283. if (!GVL_vol_exists(id)) {
  284. return -1;
  285. }
  286. ret = GVL_isosurf_set_drawres(id, res, res, res);
  287. return ret < 0 ? -2 : 1;
  288. }