GVL2.c 25 KB

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