surface.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. /*!
  2. \file surface.c
  3. \brief Surface subroutines
  4. COPYRIGHT: (C) 2008 by the GRASS Development Team
  5. This program is free software under the GNU General Public
  6. License (>=v2). Read the file COPYING that comes with GRASS
  7. for details.
  8. \author Martin Landa <landa.martin gmail.com> (Google SoC 2008)
  9. \date 2008
  10. */
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <grass/glocale.h>
  14. #include "local_proto.h"
  15. /*!
  16. \brief Load raster maps/constants and set surface attributes
  17. \param params module parameters
  18. \param data nviz data
  19. */
  20. int load_rasters(const struct GParams *params,
  21. nv_data *data)
  22. {
  23. char *mapset;
  24. int i;
  25. int nelevs, nelev_map, nelev_const, ncolor_map, ncolor_const, nmask_map;
  26. int ntransp_map, ntransp_const, nshine_map, nshine_const;
  27. int nemit_map, nemit_const;
  28. int *surf_list, nsurfs;
  29. int id;
  30. nelev_map = opt_get_num_answers(params->elev_map);
  31. nelev_const = opt_get_num_answers(params->elev_const);
  32. if (nelev_map > 0)
  33. nelevs = nelev_map;
  34. else
  35. nelevs = nelev_const;
  36. /* topography (required) */
  37. for (i = 0; i < nelevs; i++) {
  38. /* check maps */
  39. if (i < nelev_map && strcmp(params->elev_map->answers[i], "")) {
  40. mapset = G_find_cell2 (params->elev_map->answers[i], "");
  41. if (mapset == NULL) {
  42. G_fatal_error(_("Raster map <%s> not found"),
  43. params->elev_map->answers[i]);
  44. }
  45. id = Nviz_new_map_obj(MAP_OBJ_SURF,
  46. G_fully_qualified_name(params->elev_map->answers[i], mapset), 0.0,
  47. data);
  48. }
  49. else {
  50. if (i < nelev_const && strcmp(params->elev_const->answers[i], "")) {
  51. id = Nviz_new_map_obj(MAP_OBJ_SURF,
  52. NULL, atof(params->elev_const->answers[i]),
  53. data);
  54. }
  55. else {
  56. G_fatal_error(_("Missing topography attribute for surface %d"),
  57. i + 1);
  58. }
  59. }
  60. }
  61. /* set surface attributes */
  62. surf_list = GS_get_surf_list(&nsurfs);
  63. ncolor_map = opt_get_num_answers(params->color_map);
  64. ncolor_const =opt_get_num_answers(params->color_const);
  65. nmask_map = opt_get_num_answers(params->mask_map);
  66. ntransp_map = opt_get_num_answers(params->transp_map);
  67. ntransp_const = opt_get_num_answers(params->transp_const);
  68. nshine_map = opt_get_num_answers(params->shine_map);
  69. nshine_const = opt_get_num_answers(params->shine_const);
  70. nemit_map = opt_get_num_answers(params->emit_map);
  71. nemit_const = opt_get_num_answers(params->emit_const);
  72. for (i = 0; i < nsurfs; i++) {
  73. id = surf_list[i];
  74. /* color */
  75. /* check for color map */
  76. if (i < ncolor_map && strcmp(params->color_map->answers[i], "")) {
  77. mapset = G_find_cell2 (params->color_map->answers[i], "");
  78. if (mapset == NULL) {
  79. G_fatal_error(_("Raster map <%s> not found"),
  80. params->color_map->answers[i]);
  81. }
  82. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_COLOR, MAP_ATT,
  83. G_fully_qualified_name(params->color_map->answers[i], mapset), -1.0,
  84. data);
  85. }
  86. /* check for color value */
  87. else if (i < ncolor_const && strcmp(params->color_const->answers[i], "")) {
  88. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_COLOR, CONST_ATT,
  89. NULL, Nviz_color_from_str(params->color_const->answers[i]),
  90. data);
  91. }
  92. else { /* use by default elevation map for coloring */
  93. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_COLOR, MAP_ATT,
  94. G_fully_qualified_name(params->elev_map->answers[i], mapset), -1.0,
  95. data);
  96. G_verbose_message(_("Color attribute not defined, using default <%s>"),
  97. G_fully_qualified_name(params->elev_map->answers[i], mapset));
  98. }
  99. /* mask */
  100. if (i < nmask_map && strcmp(params->mask_map->answers[i], "")) {
  101. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_MASK, MAP_ATT,
  102. G_fully_qualified_name(params->mask_map->answers[i], mapset), -1.0,
  103. data);
  104. }
  105. /* transparency */
  106. if (i < ntransp_map && strcmp(params->transp_map->answers[i], "")) {
  107. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_TRANSP, MAP_ATT,
  108. G_fully_qualified_name(params->transp_map->answers[i], mapset), -1.0,
  109. data);
  110. }
  111. else if (i < ntransp_const && strcmp(params->transp_const->answers[i], "")) {
  112. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_TRANSP, CONST_ATT,
  113. NULL, atof(params->transp_const->answers[i]),
  114. data);
  115. }
  116. /* shininess */
  117. if (i < nshine_map && strcmp(params->shine_map->answers[i], "")) {
  118. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_SHINE, MAP_ATT,
  119. G_fully_qualified_name(params->shine_map->answers[i], mapset), -1.0,
  120. data);
  121. }
  122. else if (i < nshine_const && strcmp(params->shine_const->answers[i], "")) {
  123. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_SHINE, CONST_ATT,
  124. NULL, atof(params->shine_const->answers[i]),
  125. data);
  126. }
  127. /* emission */
  128. if (i < nemit_map && strcmp(params->emit_map->answers[i], "")) {
  129. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_EMIT, MAP_ATT,
  130. G_fully_qualified_name(params->emit_map->answers[i], mapset), -1.0,
  131. data);
  132. }
  133. else if (i < nemit_const && strcmp(params->emit_const->answers[i], "")) {
  134. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_EMIT, CONST_ATT,
  135. NULL, atof(params->emit_const->answers[i]),
  136. data);
  137. }
  138. /*
  139. if (i > 1)
  140. set_default_wirecolors(data, i);
  141. */
  142. }
  143. return nsurfs;
  144. }
  145. /*!
  146. \brief Set draw mode for loaded surfaces
  147. \param params module parameters
  148. */
  149. void surface_set_draw_mode(const struct GParams *params)
  150. {
  151. int *surf_list, nsurfs;
  152. int i, id, draw_mode;
  153. int resol_fine, resol_coarse;
  154. char *mode, *style, *shade, *res_fine, *res_coarse, *wire_color;
  155. surf_list = GS_get_surf_list(&nsurfs);
  156. for (i = 0; i < nsurfs; i++) {
  157. draw_mode = 0;
  158. id = surf_list[i];
  159. if (!GS_surf_exists(id))
  160. G_fatal_error (_("Surface id %d doesn't exist"), id);
  161. if (params->mode_all->answer) { /* use one mode for all surfaces */
  162. mode = params->mode->answers[0];
  163. style = params->style->answers[0];
  164. shade = params->shade->answers[0];
  165. res_fine = params->res_fine->answers[0];
  166. res_coarse = params->res_coarse->answers[0];
  167. wire_color = params->wire_color->answers[0];
  168. }
  169. else {
  170. mode = params->mode->answers[i];
  171. style = params->style->answers[i];
  172. shade = params->shade->answers[i];
  173. res_fine = params->res_fine->answers[i];
  174. res_coarse = params->res_coarse->answers[i];
  175. wire_color = params->wire_color->answers[i];
  176. }
  177. /* mode */
  178. if (strcmp(mode, "coarse") == 0) {
  179. draw_mode |= DM_WIRE;
  180. }
  181. else if (strcmp(mode, "fine") == 0) {
  182. draw_mode |= DM_POLY;
  183. }
  184. else { /* both */
  185. draw_mode |= DM_WIRE_POLY;
  186. }
  187. /* style */
  188. if (strcmp(params->style->answers[i], "wire") == 0) {
  189. draw_mode |= DM_GRID_WIRE;
  190. }
  191. else { /* surface */
  192. draw_mode |= DM_GRID_SURF;
  193. }
  194. /* shading */
  195. if (strcmp(params->shade->answers[i], "flat") == 0) {
  196. draw_mode |= DM_FLAT;
  197. }
  198. else { /* gouraud */
  199. draw_mode |= DM_GOURAUD;
  200. }
  201. if (GS_set_drawmode(id, draw_mode) < 0)
  202. G_fatal_error (_("Unable to set draw mode for surface id %d"),
  203. id);
  204. /* resolution */
  205. resol_fine = atoi(res_fine);
  206. resol_coarse = atoi(res_coarse);
  207. if (GS_set_drawres(id, resol_fine, resol_fine,
  208. resol_coarse, resol_coarse) < 0)
  209. G_fatal_error (_("Unable to set draw mode for surface id %d"),
  210. id);
  211. /* wire color */
  212. GS_set_wire_color(id, Nviz_color_from_str(wire_color));
  213. }
  214. return;
  215. }