gp.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. /*!
  2. \file gp.c
  3. \brief OGSF library - loading and manipulating point sets
  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 USACERL, GMSL/University of Illinois (January 1994)
  11. \author Doxygenized by Martin Landa <landa.martin gmail.com> (May 2008)
  12. */
  13. #include <stdlib.h>
  14. #include <grass/gis.h>
  15. #include <grass/gstypes.h>
  16. #define FIRST_SITE_ID 21720
  17. static geosite *Site_top = NULL;
  18. /*!
  19. \brief Get geosite struct
  20. \param id point set id
  21. \return pointer to geosite struct
  22. \return NULL on failure
  23. */
  24. geosite *gp_get_site(int id)
  25. {
  26. geosite *gp;
  27. G_debug(5, "gp_get_site");
  28. for (gp = Site_top; gp; gp = gp->next) {
  29. if (gp->gsite_id == id) {
  30. return (gp);
  31. }
  32. }
  33. return (NULL);
  34. }
  35. /*!
  36. \brief Get previous geosite struct from list
  37. \param id point set id
  38. \return pointer to geosite struct
  39. \return NULL on failure
  40. */
  41. geosite *gp_get_prev_site(int id)
  42. {
  43. geosite *pp;
  44. G_debug(5, "gp_get_prev_site");
  45. for (pp = Site_top; pp; pp = pp->next) {
  46. if (pp->gsite_id == id - 1) {
  47. return (pp);
  48. }
  49. }
  50. return (NULL);
  51. }
  52. /*!
  53. \brief Get number of loaded point sets
  54. \return number of point sets
  55. */
  56. int gp_num_sites(void)
  57. {
  58. geosite *gp;
  59. int i;
  60. for (i = 0, gp = Site_top; gp; gp = gp->next, i++) ;
  61. G_debug(5, "gp_num_sites(): n=%d", i);
  62. return (i);
  63. }
  64. /*!
  65. \brief Get last point set
  66. \return pointer to geosite struct
  67. \return NULL if no point set is available
  68. */
  69. geosite *gp_get_last_site(void)
  70. {
  71. geosite *lp;
  72. G_debug(5, "gp_get_last_site");
  73. if (!Site_top) {
  74. return (NULL);
  75. }
  76. for (lp = Site_top; lp->next; lp = lp->next) ;
  77. G_debug(5, " last site id: %d", lp->gsite_id);
  78. return (lp);
  79. }
  80. /*!
  81. \brief Create new geosite instance and add it to list
  82. \return pointer to geosite struct
  83. \return NULL on error
  84. */
  85. geosite *gp_get_new_site(void)
  86. {
  87. geosite *np, *lp;
  88. G_debug(5, "gp_get_new_site");
  89. np = (geosite *) G_malloc(sizeof(geosite)); /* G_fatal_error */
  90. if (!np) {
  91. return (NULL);
  92. }
  93. lp = gp_get_last_site();
  94. if (lp) {
  95. lp->next = np;
  96. np->gsite_id = lp->gsite_id + 1;
  97. }
  98. else {
  99. Site_top = np;
  100. np->gsite_id = FIRST_SITE_ID;
  101. }
  102. np->next = NULL;
  103. return (np);
  104. }
  105. /*!
  106. \brief Update drape surfaces
  107. Call after surface is deleted
  108. */
  109. void gp_update_drapesurfs(void)
  110. {
  111. geosite *gp;
  112. int i, j;
  113. for (gp = Site_top; gp; gp = gp->next) {
  114. if (gp->n_surfs) {
  115. for (i = 0; i < gp->n_surfs; i++) {
  116. if (gp->drape_surf_id[i]) {
  117. if (NULL == gs_get_surf(gp->drape_surf_id[i])) {
  118. for (j = i; j < gp->n_surfs - 1; j++) {
  119. gp->drape_surf_id[j] = gp->drape_surf_id[j + 1];
  120. }
  121. gp->n_surfs = gp->n_surfs - 1;
  122. }
  123. }
  124. }
  125. }
  126. }
  127. return;
  128. }
  129. /*!
  130. \brief Set default value for geosite struct
  131. \param gp pointer to geosite struct
  132. \return 1 on success
  133. \return -1 on failure
  134. */
  135. int gp_set_defaults(geosite * gp)
  136. {
  137. int i;
  138. float dim;
  139. G_debug(5, "gp_set_defaults");
  140. if (!gp) {
  141. return (-1);
  142. }
  143. GS_get_longdim(&dim);
  144. gp->filename = NULL;
  145. gp->n_sites = gp->use_z = gp->n_surfs = gp->use_mem = 0;
  146. gp->x_trans = gp->y_trans = gp->z_trans = 0.0;
  147. gp->size = dim / 100.;
  148. gp->points = NULL;
  149. gp->width = 1;
  150. gp->color = 0xFFFFFF;
  151. gp->marker = ST_X;
  152. gp->has_z = gp->has_att = 0;
  153. gp->attr_mode = ST_ATT_NONE;
  154. gp->next = NULL;
  155. for (i = 0; i < MAX_SURFS; i++) {
  156. gp->drape_surf_id[i] = 0;
  157. }
  158. return (1);
  159. }
  160. /*!
  161. \brief Print point set fields, debugging
  162. \param gp pointer to geosite struct
  163. */
  164. void print_site_fields(geosite * gp)
  165. {
  166. int i;
  167. fprintf(stderr, "n_sites=%d use_z=%d n_surfs=%d use_mem=%d\n",
  168. gp->n_sites, gp->use_z, gp->n_surfs, gp->use_mem);
  169. fprintf(stderr, "x_trans=%.2f x_trans=%.2f x_trans=%.2f\n",
  170. gp->x_trans, gp->y_trans, gp->z_trans);
  171. fprintf(stderr, "size = %.2f\n", gp->size);
  172. fprintf(stderr, "points = %lx\n", (unsigned long)gp->points);
  173. fprintf(stderr, "width = %d\n", gp->width);
  174. fprintf(stderr, "color = %x\n", gp->color);
  175. fprintf(stderr, "marker = %d\n", gp->marker);
  176. fprintf(stderr, "has_z = %d, has_att = %d\n", gp->has_z, gp->has_att);
  177. fprintf(stderr, "attr_mode = %d\n", gp->attr_mode);
  178. for (i = 0; i < MAX_SURFS; i++) {
  179. fprintf(stderr, "drape_surf_id[%d] = %d\n", i, gp->drape_surf_id[i]);
  180. }
  181. return;
  182. }
  183. /*!
  184. \brief Initialize geosite struct
  185. \param gp pointer to geosite struct
  186. \return -1 on failure
  187. \return 0 on success
  188. */
  189. int gp_init_site(geosite * gp)
  190. {
  191. G_debug(5, "gp_init_site");
  192. if (!gp) {
  193. return (-1);
  194. }
  195. return (0);
  196. }
  197. /*!
  198. \brief Delete point set and remove from list
  199. \param id point set id
  200. */
  201. void gp_delete_site(int id)
  202. {
  203. geosite *fp;
  204. G_debug(5, "gp_delete_site");
  205. fp = gp_get_site(id);
  206. if (fp) {
  207. gp_free_site(fp);
  208. }
  209. return;
  210. }
  211. /*!
  212. \brief Free geosite struct
  213. \param fp pointer to geosite struct
  214. \return 1 on success
  215. \return -1 on failure
  216. */
  217. int gp_free_site(geosite * fp)
  218. {
  219. geosite *gp;
  220. int found = 0;
  221. G_debug(5, "gp_free_site");
  222. if (Site_top) {
  223. if (fp == Site_top) {
  224. if (Site_top->next) {
  225. /* can't free top if last */
  226. found = 1;
  227. Site_top = fp->next;
  228. }
  229. else {
  230. gp_free_sitemem(fp);
  231. G_free(fp);
  232. Site_top = NULL;
  233. }
  234. }
  235. else {
  236. for (gp = Site_top; gp && !found; gp = gp->next) {
  237. /* can't free top */
  238. if (gp->next) {
  239. if (gp->next == fp) {
  240. found = 1;
  241. gp->next = fp->next;
  242. }
  243. }
  244. }
  245. }
  246. if (found) {
  247. gp_free_sitemem(fp);
  248. G_free(fp);
  249. fp = NULL;
  250. }
  251. return (1);
  252. }
  253. return (-1);
  254. }
  255. /*!
  256. \brief Free geosite
  257. \param fp pointer to geosite struct
  258. */
  259. void gp_free_sitemem(geosite * fp)
  260. {
  261. geopoint *gpt, *tmp;
  262. G_free((void *)fp->filename);
  263. fp->filename = NULL;
  264. if (fp->points) {
  265. for (gpt = fp->points; gpt;) {
  266. if (gpt->cattr) {
  267. G_free(gpt->cattr);
  268. }
  269. tmp = gpt;
  270. gpt = gpt->next;
  271. G_free(tmp);
  272. }
  273. fp->n_sites = 0;
  274. fp->points = NULL;
  275. }
  276. return;
  277. }
  278. /*!
  279. \brief Set drape surfaces
  280. \param gp pointer to geosite struct
  281. \param hsurf list of surfaces (id)
  282. \param nsurf number of surfaces
  283. */
  284. void gp_set_drapesurfs(geosite * gp, int hsurfs[], int nsurfs)
  285. {
  286. int i;
  287. for (i = 0; i < nsurfs && i < MAX_SURFS; i++) {
  288. gp->drape_surf_id[i] = hsurfs[i];
  289. }
  290. return;
  291. }