GVL2.c 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498
  1. /*!
  2. \file GVL2.c
  3. \brief OGSF library - loading and manipulating volumes
  4. GRASS OpenGL gsurf OGSF Library
  5. (C) 1999-2008 by the GRASS Development Team
  6. This program is free software under the
  7. GNU General Public License (>=v2).
  8. Read the file COPYING that comes with GRASS
  9. for details.
  10. \author Bill Brown UI-GMSL (May 1997)
  11. Tomas Paudits (February 2004)
  12. */
  13. #include <string.h>
  14. #include <grass/gis.h>
  15. #include <grass/raster3d.h>
  16. #include <grass/ogsf.h>
  17. #include <grass/glocale.h>
  18. #include "gsget.h"
  19. static int Vol_ID[MAX_VOLS];
  20. static int Next_vol = 0;
  21. static RASTER3D_Region wind3;
  22. static double Region[6];
  23. /*!
  24. \brief Library intialization for volumes
  25. Set region extent (N,S,W,E,T,B)
  26. */
  27. void GVL_libinit(void)
  28. {
  29. Rast3d_init_defaults();
  30. Rast3d_get_window(&wind3);
  31. Region[0] = wind3.north;
  32. Region[1] = wind3.south;
  33. Region[2] = wind3.west;
  34. Region[3] = wind3.east;
  35. Region[4] = wind3.top;
  36. Region[5] = wind3.bottom;
  37. return;
  38. }
  39. /*!
  40. \brief Initialize 3D region
  41. Set region extent (N,S,W,E,T,B)
  42. */
  43. void GVL_init_region(void)
  44. {
  45. Rast3d_read_window(&wind3, NULL);
  46. Region[0] = wind3.north;
  47. Region[1] = wind3.south;
  48. Region[2] = wind3.west;
  49. Region[3] = wind3.east;
  50. Region[4] = wind3.top;
  51. Region[5] = wind3.bottom;
  52. return;
  53. }
  54. /*!
  55. \brief Get region extent settings
  56. \param[out] n,s,w,e north, south, west, east
  57. \param[out] t,b top, bottom
  58. \return 1
  59. */
  60. int GVL_get_region(float *n, float *s, float *w, float *e, float *t, float *b)
  61. {
  62. *n = Region[0];
  63. *s = Region[1];
  64. *w = Region[2];
  65. *e = Region[3];
  66. *t = Region[4];
  67. *b = Region[5];
  68. return (1);
  69. }
  70. /*!
  71. \brief Get window
  72. \todo gvl_file.c use this - change
  73. \return pointer to RASTER3D_Region struct (static)
  74. */
  75. void *GVL_get_window()
  76. {
  77. return &wind3;
  78. }
  79. /*!
  80. \brief Check if volume set exists
  81. \param id volume set id
  82. \return 1 found
  83. \return 0 not found
  84. */
  85. int GVL_vol_exists(int id)
  86. {
  87. int i, found = 0;
  88. G_debug(3, "GVL_vol_exists");
  89. if (NULL == gvl_get_vol(id)) {
  90. return (0);
  91. }
  92. for (i = 0; i < Next_vol && !found; i++) {
  93. if (Vol_ID[i] == id) {
  94. found = 1;
  95. }
  96. }
  97. return (found);
  98. }
  99. /*!
  100. \brief Create new volume set
  101. \return volume set id
  102. \return -1 on error
  103. */
  104. int GVL_new_vol(void)
  105. {
  106. geovol *nvl;
  107. G_debug(3, "GVL_new_vol():");
  108. if (Next_vol < MAX_VOLS) {
  109. nvl = gvl_get_new_vol();
  110. gvl_init_vol(nvl, wind3.west + wind3.ew_res / 2.,
  111. wind3.south + wind3.ns_res / 2., wind3.bottom,
  112. wind3.rows, wind3.cols, wind3.depths,
  113. wind3.ew_res, wind3.ns_res, wind3.tb_res);
  114. Vol_ID[Next_vol] = nvl->gvol_id;
  115. ++Next_vol;
  116. G_debug(3, " id=%d", nvl->gvol_id);
  117. return (nvl->gvol_id);
  118. }
  119. return (-1);
  120. }
  121. /*!
  122. \brief Get number of loaded volume sets
  123. \return number of volume sets
  124. */
  125. int GVL_num_vols(void)
  126. {
  127. return (gvl_num_vols());
  128. }
  129. /*!
  130. \brief Get list of loaded volume sets
  131. Must be freed if not needed!
  132. \param[out] numvols number of volume sets
  133. \return pointer to list of volume sets
  134. \return NULL on error
  135. */
  136. int *GVL_get_vol_list(int *numvols)
  137. {
  138. int i, *ret;
  139. *numvols = Next_vol;
  140. if (Next_vol) {
  141. ret = (int *)G_malloc(Next_vol * sizeof(int));
  142. if (!ret)
  143. return (NULL);
  144. for (i = 0; i < Next_vol; i++) {
  145. ret[i] = Vol_ID[i];
  146. }
  147. return (ret);
  148. }
  149. return (NULL);
  150. }
  151. /*!
  152. \brief Delete volume set from list
  153. \param id volume set id
  154. \return 1 on success
  155. \return -1 on error (invalid volume set id)
  156. */
  157. int GVL_delete_vol(int id)
  158. {
  159. int i, j, found = 0;
  160. G_debug(3, "GVL_delete_vol");
  161. if (GVL_vol_exists(id)) {
  162. for (i = 0; i < GVL_isosurf_num_isosurfs(id); i++) {
  163. GVL_isosurf_del(id, 0);
  164. }
  165. for (i = 0; i < GVL_slice_num_slices(id); i++) {
  166. GVL_slice_del(id, 0);
  167. }
  168. gvl_delete_vol(id);
  169. for (i = 0; i < Next_vol && !found; i++) {
  170. if (Vol_ID[i] == id) {
  171. found = 1;
  172. for (j = i; j < Next_vol; j++) {
  173. Vol_ID[j] = Vol_ID[j + 1];
  174. }
  175. }
  176. }
  177. if (found) {
  178. --Next_vol;
  179. return (1);
  180. }
  181. }
  182. return (-1);
  183. }
  184. /*!
  185. \brief Load 3d raster map to volume set
  186. \param id volume set id
  187. \param filename 3d raster map name
  188. \return -1 on error
  189. \return 0 on success
  190. */
  191. int GVL_load_vol(int id, const char *filename)
  192. {
  193. geovol *gvl;
  194. int handle;
  195. G_debug(3, "GVL_load_vol(): id=%d, name=%s", id, filename);
  196. if (NULL == (gvl = gvl_get_vol(id))) {
  197. return (-1);
  198. }
  199. G_message(_("Loading 3d raster map <%s>..."), filename);
  200. if (0 > (handle = gvl_file_newh(filename, VOL_FTYPE_RASTER3D)))
  201. return (-1);
  202. gvl->hfile = handle;
  203. return (0);
  204. }
  205. /*!
  206. \brief Get volume set name
  207. \param id volume set id
  208. \param[out] filename name (must be allocated)
  209. \return -1 on error
  210. \return 1 on success
  211. */
  212. int GVL_get_volname(int id, char *filename)
  213. {
  214. geovol *gvl;
  215. if (NULL == (gvl = gvl_get_vol(id))) {
  216. return (-1);
  217. }
  218. if (0 > gvl->hfile) {
  219. return (-1);
  220. }
  221. strcpy(filename, gvl_file_get_name(gvl->hfile));
  222. return (1);
  223. }
  224. /*!
  225. \brief Get volume dimensions
  226. \param id volume set id
  227. \param[out] rows,cols,depths number of rows, cols, depths
  228. */
  229. void GVL_get_dims(int id, int *rows, int *cols, int *depths)
  230. {
  231. geovol *gvl;
  232. gvl = gvl_get_vol(id);
  233. if (gvl) {
  234. *rows = gvl->rows;
  235. *cols = gvl->cols;
  236. *depths = gvl->depths;
  237. }
  238. G_debug(3, "GVL_get_dims() id=%d, rows=%d, cols=%d, depths=%d",
  239. gvl->gvol_id, gvl->rows, gvl->cols, gvl->depths);
  240. return;
  241. }
  242. /*!
  243. \brief Set trans ?
  244. \param id volume set id
  245. \param xtrans,ytrans,ztrans x/y/z trans values
  246. */
  247. void GVL_set_trans(int id, float xtrans, float ytrans, float ztrans)
  248. {
  249. geovol *gvl;
  250. G_debug(3, "GVL_set_trans");
  251. gvl = gvl_get_vol(id);
  252. if (gvl) {
  253. gvl->x_trans = xtrans;
  254. gvl->y_trans = ytrans;
  255. gvl->z_trans = ztrans;
  256. }
  257. return;
  258. }
  259. /*!
  260. \brief Get trans ?
  261. \param id volume set id
  262. \param[out] xtrans,ytrans,ztrans x/y/z trans values
  263. \return 1 on success
  264. \return -1 on error
  265. */
  266. int GVL_get_trans(int id, float *xtrans, float *ytrans, float *ztrans)
  267. {
  268. geovol *gvl;
  269. gvl = gvl_get_vol(id);
  270. if (gvl) {
  271. *xtrans = gvl->x_trans;
  272. *ytrans = gvl->y_trans;
  273. *ztrans = gvl->z_trans;
  274. return (1);
  275. }
  276. return (-1);
  277. }
  278. /*!
  279. \brief Draw volume set
  280. \param vid volume set id
  281. */
  282. void GVL_draw_vol(int vid)
  283. {
  284. geovol *gvl;
  285. gvl = gvl_get_vol(vid);
  286. if (gvl) {
  287. gvld_vol(gvl);
  288. }
  289. return;
  290. }
  291. /*!
  292. \brief Draw volume in wire mode
  293. \param id volume set id
  294. */
  295. void GVL_draw_wire(int id)
  296. {
  297. geovol *gvl;
  298. G_debug(3, "GVL_draw_wire(): id=%d", id);
  299. gvl = gvl_get_vol(id);
  300. if (gvl) {
  301. gvld_wire_vol(gvl);
  302. }
  303. return;
  304. }
  305. /*!
  306. \brief Draw all volume sets
  307. */
  308. void GVL_alldraw_vol(void)
  309. {
  310. int id;
  311. for (id = 0; id < Next_vol; id++) {
  312. GVL_draw_vol(Vol_ID[id]);
  313. }
  314. return;
  315. }
  316. /*!
  317. \brief Draw all volume sets in wire mode
  318. */
  319. void GVL_alldraw_wire(void)
  320. {
  321. int id;
  322. for (id = 0; id < Next_vol; id++) {
  323. GVL_draw_wire(Vol_ID[id]);
  324. }
  325. return;
  326. }
  327. /*!
  328. \brief Set client data for volume set
  329. \param id volume set id
  330. \param clientd pointer to client data
  331. \return 1 on success
  332. \return -1 on error
  333. */
  334. int GVL_Set_ClientData(int id, void *clientd)
  335. {
  336. geovol *gvl;
  337. gvl = gvl_get_vol(id);
  338. if (gvl) {
  339. gvl->clientdata = clientd;
  340. return (1);
  341. }
  342. return (-1);
  343. }
  344. /*!
  345. \brief Get client data
  346. \param id volume set id
  347. \return pointer to client data
  348. \return NULL on error
  349. */
  350. void *GVL_Get_ClientData(int id)
  351. {
  352. geovol *gvl;
  353. gvl = gvl_get_vol(id);
  354. if (gvl) {
  355. return (gvl->clientdata);
  356. }
  357. return (NULL);
  358. }
  359. /*!
  360. \brief Set focus on map center
  361. \param id volume set id
  362. */
  363. void GVL_set_focus_center_map(int id)
  364. {
  365. float center[3];
  366. geovol *gvl;
  367. G_debug(3, "GS_set_focus_center_map");
  368. gvl = gvl_get_vol(id);
  369. if (gvl) {
  370. center[X] = (gvl->xmax - gvl->xmin) / 2.;
  371. center[Y] = (gvl->ymax - gvl->ymin) / 2.;
  372. center[Z] = (gvl->zmax - gvl->zmin) / 2.;
  373. GS_set_focus(center);
  374. }
  375. return;
  376. }
  377. /************************************************************************/
  378. /* ISOSURFACES */
  379. /************************************************************************/
  380. /*!
  381. \brief Get draw resolution for isosurface
  382. \todo error handling
  383. \param id volume set id
  384. \param[out] xres,yres,zres x/y/z resolution value
  385. */
  386. void GVL_isosurf_get_drawres(int id, int *xres, int *yres, int *zres)
  387. {
  388. geovol *gvl;
  389. G_debug(3, "GVL_isosurf_get_drawres");
  390. gvl = gvl_get_vol(id);
  391. if (gvl) {
  392. *xres = gvl->isosurf_x_mod;
  393. *yres = gvl->isosurf_y_mod;
  394. *zres = gvl->isosurf_z_mod;
  395. }
  396. return;
  397. }
  398. /*!
  399. \brief Set isosurface draw resolution
  400. \param id volume set id
  401. \param xres,yres,zres x/y/z resolution value
  402. \return -1 on error (invalid values/volume set id)
  403. \return 0 on success
  404. */
  405. int GVL_isosurf_set_drawres(int id, int xres, int yres, int zres)
  406. {
  407. geovol *gvl;
  408. int i;
  409. G_debug(3, "GVL_isosurf_set_drawres(): id=%d", id);
  410. if (xres < 1 || yres < 1 || zres < 1) {
  411. return (-1);
  412. }
  413. gvl = gvl_get_vol(id);
  414. if (gvl) {
  415. gvl->isosurf_x_mod = xres;
  416. gvl->isosurf_y_mod = yres;
  417. gvl->isosurf_z_mod = zres;
  418. for (i = 0; i < gvl->n_isosurfs; i++) {
  419. gvl_isosurf_set_att_changed(gvl->isosurf[i], ATT_TOPO);
  420. }
  421. return (0);
  422. }
  423. return (-1);
  424. }
  425. /*!
  426. \brief Get isosurface draw mode
  427. \param id volume set id
  428. \param[out] mode draw-mode
  429. \return 1 on success
  430. \return -1 on error
  431. */
  432. int GVL_isosurf_get_drawmode(int id, int *mode)
  433. {
  434. geovol *gvl;
  435. gvl = gvl_get_vol(id);
  436. if (gvl) {
  437. *mode = gvl->isosurf_draw_mode;
  438. return (1);
  439. }
  440. return (-1);
  441. }
  442. /*!
  443. \brief Set isosurface draw mode
  444. \param id volume set id
  445. \param mode draw mode
  446. \return 0 on success
  447. \return -1 on error (invalid volume set id)
  448. */
  449. int GVL_isosurf_set_drawmode(int id, int mode)
  450. {
  451. geovol *gvl;
  452. G_debug(3, "GVL_isosurf_set_drawmode(): id=%d mode=%d", id, mode);
  453. gvl = gvl_get_vol(id);
  454. if (gvl) {
  455. gvl->isosurf_draw_mode = mode;
  456. return (0);
  457. }
  458. return (-1);
  459. }
  460. /*!
  461. \brief Add isosurface
  462. \param id volume set id
  463. \return -1 on error (invalid volume set id
  464. \return 1 on success
  465. */
  466. int GVL_isosurf_add(int id)
  467. {
  468. geovol *gvl;
  469. geovol_isosurf *isosurf;
  470. G_debug(3, "GVL_isosurf_add() id=%d", id);
  471. gvl = gvl_get_vol(id);
  472. if (!gvl)
  473. return (-1);
  474. if (gvl->n_isosurfs == MAX_ISOSURFS)
  475. return (-1);
  476. isosurf = (geovol_isosurf *) G_malloc(sizeof(geovol_isosurf));
  477. if (!isosurf) {
  478. return (-1);
  479. }
  480. gvl_isosurf_init(isosurf);
  481. gvl->n_isosurfs++;
  482. gvl->isosurf[gvl->n_isosurfs - 1] = (geovol_isosurf *) isosurf;
  483. return (1);
  484. }
  485. /*!
  486. \brief Delete isosurface
  487. \param id volume set id
  488. \param isosurf_id isosurface id
  489. \return -1 on error
  490. \return 1 on success
  491. */
  492. int GVL_isosurf_del(int id, int isosurf_id)
  493. {
  494. geovol *gvl;
  495. geovol_isosurf *isosurf;
  496. int i;
  497. G_debug(3, "GVL_isosurf_del");
  498. isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
  499. if (!isosurf)
  500. return (-1);
  501. if (!gvl_isosurf_freemem(isosurf)) {
  502. return (-1);
  503. }
  504. gvl = gvl_get_vol(id);
  505. G_free(gvl->isosurf[isosurf_id]);
  506. for (i = isosurf_id + 1; i < gvl->n_isosurfs; i++) {
  507. gvl->isosurf[i - 1] = gvl->isosurf[i];
  508. }
  509. gvl->n_isosurfs--;
  510. return (1);
  511. }
  512. /*!
  513. \brief Move up isosurface in list
  514. \param id volume set id
  515. \param isosurf_id isosurface id
  516. \return -1 on error
  517. \return 1 on success
  518. */
  519. int GVL_isosurf_move_up(int id, int isosurf_id)
  520. {
  521. geovol *gvl;
  522. geovol_isosurf *tmp;
  523. G_debug(3, "GVL_isosurf_move_up");
  524. gvl = gvl_get_vol(id);
  525. if (!gvl)
  526. return (-1);
  527. if (isosurf_id < 0 || isosurf_id > (gvl->n_isosurfs - 1))
  528. return (-1);
  529. if (isosurf_id == 0)
  530. return (1);
  531. tmp = gvl->isosurf[isosurf_id - 1];
  532. gvl->isosurf[isosurf_id - 1] = gvl->isosurf[isosurf_id];
  533. gvl->isosurf[isosurf_id] = tmp;
  534. return (1);
  535. }
  536. /*!
  537. \brief Move down isosurface in list
  538. \param id volume set id
  539. \param isosurf_id isosurface id
  540. \return -1 on error
  541. \return 1 on success
  542. */
  543. int GVL_isosurf_move_down(int id, int isosurf_id)
  544. {
  545. geovol *gvl;
  546. geovol_isosurf *tmp;
  547. G_debug(3, "GVL_isosurf_move_up");
  548. gvl = gvl_get_vol(id);
  549. if (!gvl)
  550. return (-1);
  551. if (isosurf_id < 0 || isosurf_id > (gvl->n_isosurfs - 1))
  552. return (-1);
  553. if (isosurf_id == (gvl->n_isosurfs - 1))
  554. return (1);
  555. tmp = gvl->isosurf[isosurf_id + 1];
  556. gvl->isosurf[isosurf_id + 1] = gvl->isosurf[isosurf_id];
  557. gvl->isosurf[isosurf_id] = tmp;
  558. return (1);
  559. }
  560. /*!
  561. \brief Get isosurface attributes
  562. \param id volume set id
  563. \param isosurf_id surface id
  564. \param att attribute id
  565. \param[out] set
  566. \param[out] constant
  567. \param[out] mapname
  568. \return -1 on error
  569. \return 1 on success
  570. */
  571. int GVL_isosurf_get_att(int id, int isosurf_id,
  572. int att, int *set, float *constant, char *mapname)
  573. {
  574. int src;
  575. geovol_isosurf *isosurf;
  576. G_debug(3, "GVL_isosurf_get_att");
  577. isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
  578. if (isosurf) {
  579. if (-1 != (src = gvl_isosurf_get_att_src(isosurf, att))) {
  580. *set = src;
  581. if (src == CONST_ATT) {
  582. *constant = isosurf->att[att].constant;
  583. }
  584. else if (src == MAP_ATT) {
  585. strcpy(mapname, gvl_file_get_name(isosurf->att[att].hfile));
  586. }
  587. return (1);
  588. }
  589. return (-1);
  590. }
  591. return (-1);
  592. }
  593. /*!
  594. \brief Unset isosurface attributes
  595. \param id volume set id
  596. \param isosurface_id isosurface id
  597. \param att attribute id
  598. \return ?
  599. \return -1 on error
  600. */
  601. int GVL_isosurf_unset_att(int id, int isosurf_id, int att)
  602. {
  603. geovol_isosurf *isosurf;
  604. G_debug(3, "GVL_isosurf_unset_att");
  605. isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
  606. if (isosurf) {
  607. return (gvl_isosurf_set_att_src(isosurf, att, NOTSET_ATT));
  608. }
  609. return (-1);
  610. }
  611. /*!
  612. \brief Set constant isosurface attribute
  613. Attributes:
  614. - ATT_NORM
  615. - ATT_TOPO topography (level) constant
  616. - ATT_COLOR color map/constant
  617. - ATT_MASK mask map
  618. - ATT_TRANSP transparency map/constant
  619. - ATT_SHINE shininess map/constant
  620. - ATT_EMIT emission map/constant
  621. \param id volume set id
  622. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  623. \param att attribute descriptor
  624. \param constant constant value
  625. \return 1 on success
  626. \return -1 on error
  627. */
  628. int GVL_isosurf_set_att_const(int id, int isosurf_id, int att, float constant)
  629. {
  630. geovol_isosurf *isosurf;
  631. G_debug(3, "GVL_isosurf_set_att_const() id=%d isosurf_id=%d "
  632. "att=%d const=%f", id, isosurf_id, att, constant);
  633. isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
  634. if (isosurf) {
  635. return (gvl_isosurf_set_att_const(isosurf, att, constant));
  636. }
  637. return (-1);
  638. }
  639. /*!
  640. \brief Set isosurface map attribute
  641. Attributes:
  642. - ATT_NORM
  643. - ATT_TOPO topography (level) constant
  644. - ATT_COLOR color map/constant
  645. - ATT_MASK mask map
  646. - ATT_TRANSP transparency map/constant
  647. - ATT_SHINE shininess map/constant
  648. - ATT_EMIT emission map/constant
  649. \param id volume set id
  650. \param isosurf_id isosurface id (0 - MAX_ISOSURFS)
  651. \param att attribute descriptor
  652. \param filename map name
  653. \return 1 on success
  654. \return -1 on error
  655. */
  656. int GVL_isosurf_set_att_map(int id, int isosurf_id, int att,
  657. const char *filename)
  658. {
  659. geovol_isosurf *isosurf;
  660. G_debug(3, "GVL_isosurf_set_att_map(): id=%d, isosurf_id=%d "
  661. "att=%d map=%s", id, isosurf_id, att, filename);
  662. isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
  663. if (isosurf) {
  664. return gvl_isosurf_set_att_map(isosurf, att, filename);
  665. }
  666. return (-1);
  667. }
  668. /*!
  669. \brief Get isosurface flags
  670. \param id volume set id
  671. \param isosurf_id isosurface id
  672. \param[out] inout map name
  673. \return 1 on success
  674. \return -1 on error
  675. */
  676. int GVL_isosurf_get_flags(int id, int isosurf_id, int *inout)
  677. {
  678. geovol_isosurf *isosurf;
  679. G_debug(3, "GVL_isosurf_get_flags");
  680. isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
  681. if (isosurf) {
  682. *inout = isosurf->inout_mode;
  683. return (1);
  684. }
  685. return (-1);
  686. }
  687. /*!
  688. \brief Set isosurface flags
  689. \param id volume set id
  690. \param isosurf_id isosurface id
  691. \param inout map name
  692. \return 1 on success
  693. \return -1 on error
  694. */
  695. int GVL_isosurf_set_flags(int id, int isosurf_id, int inout)
  696. {
  697. geovol_isosurf *isosurf;
  698. G_debug(3, "GVL_isosurf_get_flags");
  699. isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
  700. if (isosurf) {
  701. isosurf->inout_mode = inout;
  702. return (1);
  703. }
  704. return (-1);
  705. }
  706. /*!
  707. \brief Get number of available isosurfaces
  708. \param id volume set id
  709. \return number of isosurfaces
  710. \return -1 on error
  711. */
  712. int GVL_isosurf_num_isosurfs(int id)
  713. {
  714. geovol *gvl;
  715. G_debug(3, "GVL_isosurf_num_isosurfs");
  716. gvl = gvl_get_vol(id);
  717. if (gvl) {
  718. return gvl->n_isosurfs;
  719. }
  720. return (-1);
  721. }
  722. /*!
  723. \brief Set mask attribute mode
  724. Mask attribute special: constant is set to indicate invert or no
  725. \param id volume set id
  726. \param isosurf_id isosurface id
  727. \param mode attribute mode
  728. \return mode id
  729. \return -1 on error
  730. */
  731. int GVL_isosurf_set_maskmode(int id, int isosurf_id, int mode)
  732. {
  733. geovol_isosurf *isosurf;
  734. G_debug(3, "GVL_isosurf_set_att_const");
  735. isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
  736. if (isosurf) {
  737. isosurf->att[ATT_MASK].constant = mode;
  738. return (mode);
  739. }
  740. return (-1);
  741. }
  742. /*!
  743. \brief Get isosurface mask mode
  744. \param id volume set id
  745. \param isosurf_id isosurface id
  746. \param mode attribute mode
  747. \return 1 on success
  748. \return -1 on error
  749. */
  750. int GVL_isosurf_get_maskmode(int id, int isosurf_id, int *mode)
  751. {
  752. geovol_isosurf *isosurf;
  753. isosurf = gvl_isosurf_get_isosurf(id, isosurf_id);
  754. if (isosurf) {
  755. *mode = isosurf->att[ATT_MASK].constant;
  756. return (1);
  757. }
  758. return (-1);
  759. }
  760. /************************************************************************/
  761. /* SLICES */
  762. /************************************************************************/
  763. /*!
  764. \brief Get draw resolution of slice
  765. \param id volume set id
  766. \param[out] xres,yres,zres x/y/z resolution value
  767. */
  768. void GVL_slice_get_drawres(int id, int *xres, int *yres, int *zres)
  769. {
  770. geovol *gvl;
  771. G_debug(3, "GVL_slice_get_drawres");
  772. gvl = gvl_get_vol(id);
  773. if (gvl) {
  774. *xres = gvl->slice_x_mod;
  775. *yres = gvl->slice_y_mod;
  776. *zres = gvl->slice_z_mod;
  777. }
  778. return;
  779. }
  780. /*!
  781. \brief Set slice draw resolution
  782. \param id volume set id
  783. \param xres,yres,zres x/y/z resolution value
  784. \return 0 on success
  785. \return -1 on error (invalid value or id)
  786. */
  787. int GVL_slice_set_drawres(int id, int xres, int yres, int zres)
  788. {
  789. geovol *gvl;
  790. int i;
  791. G_debug(3, "GVL_slice_set_drawres(): id=%d", id);
  792. if (xres < 1 || yres < 1 || zres < 1) {
  793. return (-1);
  794. }
  795. gvl = gvl_get_vol(id);
  796. if (gvl) {
  797. gvl->slice_x_mod = xres;
  798. gvl->slice_y_mod = yres;
  799. gvl->slice_z_mod = zres;
  800. for (i = 0; i < gvl->n_slices; i++) {
  801. gvl->slice[i]->changed = 1;
  802. }
  803. return (0);
  804. }
  805. return (-1);
  806. }
  807. /*!
  808. \brief Get slice draw mode
  809. \param id volume set id
  810. \param[out] mode draw mode
  811. \return 1 on success
  812. \return -1 on error (invalid id)
  813. */
  814. int GVL_slice_get_drawmode(int id, int *mode)
  815. {
  816. geovol *gvl;
  817. gvl = gvl_get_vol(id);
  818. if (gvl) {
  819. *mode = gvl->slice_draw_mode;
  820. return (1);
  821. }
  822. return (-1);
  823. }
  824. /*!
  825. \brief Set slice draw mode
  826. \param id volume set id
  827. \param mode draw mode
  828. \return 0 on success
  829. \return -1 on error (invalid id)
  830. */
  831. int GVL_slice_set_drawmode(int id, int mode)
  832. {
  833. geovol *gvl;
  834. G_debug(3, "GVL_slice_set_drawmode(): id=%d, mode=%d", id, mode);
  835. gvl = gvl_get_vol(id);
  836. if (gvl) {
  837. gvl->slice_draw_mode = mode;
  838. return (0);
  839. }
  840. return (-1);
  841. }
  842. /*!
  843. \brief Add slice
  844. \param id volume set id
  845. \return -1 on error
  846. \return 1 on success
  847. */
  848. int GVL_slice_add(int id)
  849. {
  850. geovol *gvl;
  851. geovol_slice *slice;
  852. G_debug(3, "GVL_slice_add");
  853. gvl = gvl_get_vol(id);
  854. if (!gvl)
  855. return (-1);
  856. if (gvl->n_slices == MAX_SLICES)
  857. return (-1);
  858. if (NULL == (slice = (geovol_slice *) G_malloc(sizeof(geovol_slice)))) {
  859. return (-1);
  860. }
  861. gvl_slice_init(slice);
  862. gvl->n_slices++;
  863. gvl->slice[gvl->n_slices - 1] = (geovol_slice *) slice;
  864. return (1);
  865. }
  866. /*!
  867. \brief Delete slice
  868. \param id volume set id
  869. \param slice_id slice id
  870. \return -1 on error
  871. \return 1 on success
  872. */
  873. int GVL_slice_del(int id, int slice_id)
  874. {
  875. geovol *gvl;
  876. geovol_slice *slice;
  877. int i;
  878. G_debug(3, "GVL_slice_del");
  879. slice = gvl_slice_get_slice(id, slice_id);
  880. if (!slice)
  881. return (-1);
  882. if (!gvl_slice_freemem(slice)) {
  883. return (-1);
  884. }
  885. gvl = gvl_get_vol(id);
  886. G_free(gvl->slice[slice_id]);
  887. for (i = slice_id + 1; i < gvl->n_slices; i++) {
  888. gvl->slice[i - 1] = gvl->slice[i];
  889. }
  890. gvl->n_slices--;
  891. return (1);
  892. }
  893. /*!
  894. \brief Move up slice
  895. \param id volume set id
  896. \param slice_id slice id
  897. \return -1 on error
  898. \return 1 on success
  899. */
  900. int GVL_slice_move_up(int id, int slice_id)
  901. {
  902. geovol *gvl;
  903. geovol_slice *tmp;
  904. G_debug(3, "GVL_slice_move_up");
  905. gvl = gvl_get_vol(id);
  906. if (!gvl)
  907. return (-1);
  908. if (slice_id < 0 || slice_id > (gvl->n_slices - 1))
  909. return (-1);
  910. if (slice_id == 0)
  911. return (1);
  912. tmp = gvl->slice[slice_id - 1];
  913. gvl->slice[slice_id - 1] = gvl->slice[slice_id];
  914. gvl->slice[slice_id] = tmp;
  915. return (1);
  916. }
  917. /*!
  918. \brief Move down slice
  919. \param id volume set id
  920. \param slice_id slice id
  921. \return -1 on error
  922. \return 1 on success
  923. */
  924. int GVL_slice_move_down(int id, int slice_id)
  925. {
  926. geovol *gvl;
  927. geovol_slice *tmp;
  928. G_debug(3, "GVL_slice_move_up");
  929. gvl = gvl_get_vol(id);
  930. if (!gvl)
  931. return (-1);
  932. if (slice_id < 0 || slice_id > (gvl->n_slices - 1))
  933. return (-1);
  934. if (slice_id == (gvl->n_slices - 1))
  935. return (1);
  936. tmp = gvl->slice[slice_id + 1];
  937. gvl->slice[slice_id + 1] = gvl->slice[slice_id];
  938. gvl->slice[slice_id] = tmp;
  939. return (1);
  940. }
  941. /*!
  942. \brief Get number or slices
  943. \param id volume set id
  944. \return number of slices
  945. \return -1 on error
  946. */
  947. int GVL_slice_num_slices(int id)
  948. {
  949. geovol *gvl;
  950. G_debug(3, "GVL_isosurf_num_isosurfs");
  951. gvl = gvl_get_vol(id);
  952. if (gvl) {
  953. return gvl->n_slices;
  954. }
  955. return (-1);
  956. }
  957. /*!
  958. \brief Get slice position
  959. \param id volume set id
  960. \param slice_id slice id
  961. \param[out] x1,y1,z1 coordinates ?
  962. \param[out] x2,y2,z2 coordinates ?
  963. \param[out] dir direction
  964. \return -1 on error
  965. \return 1 on success
  966. */
  967. int GVL_slice_get_pos(int id, int slice_id,
  968. float *x1, float *x2, float *y1, float *y2, float *z1,
  969. float *z2, int *dir)
  970. {
  971. geovol *gvl;
  972. geovol_slice *slice;
  973. int cols, rows, depths;
  974. gvl = gvl_get_vol(id);
  975. if (!gvl)
  976. return (-1);
  977. slice = gvl_slice_get_slice(id, slice_id);
  978. if (!slice)
  979. return (-1);
  980. if (slice->dir == X) {
  981. cols = gvl->rows;
  982. rows = gvl->depths;
  983. depths = gvl->cols;
  984. }
  985. else if (slice->dir == Y) {
  986. cols = gvl->cols;
  987. rows = gvl->depths;
  988. depths = gvl->rows;
  989. }
  990. else if (slice->dir == Z) {
  991. cols = gvl->cols;
  992. rows = gvl->rows;
  993. depths = gvl->depths;
  994. }
  995. else {
  996. return (-1);
  997. }
  998. *x1 = slice->x1 / (cols - 1);
  999. *x2 = slice->x2 / (cols - 1);
  1000. *y1 = slice->y1 / (rows - 1);
  1001. *y2 = slice->y2 / (rows - 1);
  1002. *z1 = slice->z1 / (depths - 1);
  1003. *z2 = slice->z2 / (depths - 1);
  1004. *dir = slice->dir;
  1005. return (1);
  1006. }
  1007. /*!
  1008. \brief Get slice position
  1009. \param id volume set id
  1010. \param slice_id slice id
  1011. \param x1,y1,z1 coordinates ?
  1012. \param x2,y2,z2 coordinates ?
  1013. \param dir direction
  1014. \return -1 on error
  1015. \return 1 on success
  1016. */
  1017. int GVL_slice_set_pos(int id, int slice_id,
  1018. float x1, float x2, float y1, float y2, float z1,
  1019. float z2, int dir)
  1020. {
  1021. geovol *gvl;
  1022. geovol_slice *slice;
  1023. int cols, rows, depths;
  1024. gvl = gvl_get_vol(id);
  1025. if (!gvl)
  1026. return (-1);
  1027. slice = gvl_slice_get_slice(id, slice_id);
  1028. if (!slice)
  1029. return (-1);
  1030. if (dir == X) {
  1031. cols = gvl->rows;
  1032. rows = gvl->depths;
  1033. depths = gvl->cols;
  1034. }
  1035. else if (dir == Y) {
  1036. cols = gvl->cols;
  1037. rows = gvl->depths;
  1038. depths = gvl->rows;
  1039. }
  1040. else if (dir == Z) {
  1041. cols = gvl->cols;
  1042. rows = gvl->rows;
  1043. depths = gvl->depths;
  1044. }
  1045. else {
  1046. return (-1);
  1047. }
  1048. slice->x1 = ((x1 < 0.) ? 0. : ((x1 > 1.) ? 1. : x1)) * (cols - 1);
  1049. slice->x2 = ((x2 < 0.) ? 0. : ((x2 > 1.) ? 1. : x2)) * (cols - 1);
  1050. slice->y1 = ((y1 < 0.) ? 0. : ((y1 > 1.) ? 1. : y1)) * (rows - 1);
  1051. slice->y2 = ((y2 < 0.) ? 0. : ((y2 > 1.) ? 1. : y2)) * (rows - 1);
  1052. slice->z1 = ((z1 < 0.) ? 0. : ((z1 > 1.) ? 1. : z1)) * (depths - 1);
  1053. slice->z2 = ((z2 < 0.) ? 0. : ((z2 > 1.) ? 1. : z2)) * (depths - 1);
  1054. slice->dir = dir;
  1055. slice->changed = 1;
  1056. return (1);
  1057. }
  1058. /*!
  1059. \brief Get slice trans ?
  1060. \param id volume set id
  1061. \param slice_id slice id
  1062. \param[out] transp transp value
  1063. \return -1 on error
  1064. \return 1 on success
  1065. */
  1066. int GVL_slice_get_transp(int id, int slice_id, int *transp)
  1067. {
  1068. geovol_slice *slice;
  1069. G_debug(3, "GVL_get_transp");
  1070. slice = gvl_slice_get_slice(id, slice_id);
  1071. if (!slice)
  1072. return (-1);
  1073. *transp = slice->transp;
  1074. return (1);
  1075. }
  1076. /*!
  1077. \brief Set slice trans ?
  1078. \param id volume set id
  1079. \param slice_id slice id
  1080. \param transp transp value
  1081. \return -1 on error
  1082. \return 1 on success
  1083. */
  1084. int GVL_slice_set_transp(int id, int slice_id, int transp)
  1085. {
  1086. geovol_slice *slice;
  1087. G_debug(3, "GVL_set_transp");
  1088. slice = gvl_slice_get_slice(id, slice_id);
  1089. if (!slice)
  1090. return (-1);
  1091. slice->transp = transp;
  1092. return (1);
  1093. }