surface.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. /*!
  2. \file surface.c
  3. \brief Surface subroutines
  4. (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, nv_data * data)
  21. {
  22. const char *mapset;
  23. int i;
  24. int nelevs, nelev_map, nelev_const, ncolor_map, ncolor_const, nmask_map;
  25. int ntransp_map, ntransp_const, nshine_map, nshine_const;
  26. int nemit_map, nemit_const;
  27. int *surf_list, nsurfs;
  28. int id;
  29. double x, y, z;
  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_raster2(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->
  47. answers[i], mapset),
  48. 0.0, data);
  49. }
  50. else {
  51. if (i < nelev_const && strcmp(params->elev_const->answers[i], "")) {
  52. id = Nviz_new_map_obj(MAP_OBJ_SURF,
  53. NULL,
  54. atof(params->elev_const->answers[i]),
  55. data);
  56. }
  57. else {
  58. G_fatal_error(_("Missing topography attribute for surface %d"),
  59. i + 1);
  60. }
  61. }
  62. /* set position */
  63. x = atof(params->surface_pos->answers[i]);
  64. y = atof(params->surface_pos->answers[i+1]);
  65. z = atof(params->surface_pos->answers[i+2]);
  66. GS_set_trans(id, x, y, z);
  67. }
  68. /* set surface attributes */
  69. surf_list = GS_get_surf_list(&nsurfs);
  70. ncolor_map = opt_get_num_answers(params->color_map);
  71. ncolor_const = opt_get_num_answers(params->color_const);
  72. nmask_map = opt_get_num_answers(params->mask_map);
  73. ntransp_map = opt_get_num_answers(params->transp_map);
  74. ntransp_const = opt_get_num_answers(params->transp_const);
  75. nshine_map = opt_get_num_answers(params->shine_map);
  76. nshine_const = opt_get_num_answers(params->shine_const);
  77. nemit_map = opt_get_num_answers(params->emit_map);
  78. nemit_const = opt_get_num_answers(params->emit_const);
  79. for (i = 0; i < nsurfs; i++) {
  80. id = surf_list[i];
  81. /* color */
  82. /* check for color map */
  83. if (i < ncolor_map && strcmp(params->color_map->answers[i], "")) {
  84. mapset = G_find_raster2(params->color_map->answers[i], "");
  85. if (mapset == NULL) {
  86. G_fatal_error(_("Raster map <%s> not found"),
  87. params->color_map->answers[i]);
  88. }
  89. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_COLOR, MAP_ATT,
  90. G_fully_qualified_name(params->color_map->
  91. answers[i], mapset), -1.0,
  92. data);
  93. }
  94. /* check for color value */
  95. else if (i < ncolor_const &&
  96. strcmp(params->color_const->answers[i], "")) {
  97. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_COLOR, CONST_ATT, NULL,
  98. Nviz_color_from_str(params->color_const->
  99. answers[i]), data);
  100. }
  101. else { /* use by default elevation map for coloring */
  102. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_COLOR, MAP_ATT,
  103. G_fully_qualified_name(params->elev_map->answers[i],
  104. mapset), -1.0, data);
  105. G_verbose_message(_("Color attribute not defined, using default <%s>"),
  106. G_fully_qualified_name(params->elev_map->
  107. answers[i], mapset));
  108. }
  109. /* mask */
  110. if (i < nmask_map && strcmp(params->mask_map->answers[i], "")) {
  111. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_MASK, MAP_ATT,
  112. G_fully_qualified_name(params->mask_map->answers[i],
  113. mapset), -1.0, data);
  114. }
  115. /* transparency */
  116. if (i < ntransp_map && strcmp(params->transp_map->answers[i], "")) {
  117. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_TRANSP, MAP_ATT,
  118. G_fully_qualified_name(params->transp_map->
  119. answers[i], mapset), -1.0,
  120. data);
  121. }
  122. else if (i < ntransp_const &&
  123. strcmp(params->transp_const->answers[i], "")) {
  124. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_TRANSP, CONST_ATT, NULL,
  125. atof(params->transp_const->answers[i]), data);
  126. }
  127. /* shininess */
  128. if (i < nshine_map && strcmp(params->shine_map->answers[i], "")) {
  129. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_SHINE, MAP_ATT,
  130. G_fully_qualified_name(params->shine_map->
  131. answers[i], mapset), -1.0,
  132. data);
  133. }
  134. else if (i < nshine_const &&
  135. strcmp(params->shine_const->answers[i], "")) {
  136. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_SHINE, CONST_ATT, NULL,
  137. atof(params->shine_const->answers[i]), data);
  138. }
  139. /* emission */
  140. if (i < nemit_map && strcmp(params->emit_map->answers[i], "")) {
  141. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_EMIT, MAP_ATT,
  142. G_fully_qualified_name(params->emit_map->answers[i],
  143. mapset), -1.0, data);
  144. }
  145. else if (i < nemit_const &&
  146. strcmp(params->emit_const->answers[i], "")) {
  147. Nviz_set_attr(id, MAP_OBJ_SURF, ATT_EMIT, CONST_ATT, NULL,
  148. atof(params->emit_const->answers[i]), data);
  149. }
  150. /*
  151. if (i > 1)
  152. set_default_wirecolors(data, i);
  153. */
  154. }
  155. return nsurfs;
  156. }
  157. /*!
  158. \brief Set draw mode for loaded surfaces
  159. \param params module parameters
  160. */
  161. void surface_set_draw_mode(const struct GParams *params)
  162. {
  163. int *surf_list, nsurfs;
  164. int i, id, draw_mode;
  165. int resol_fine, resol_coarse;
  166. char *mode, *style, *shade, *res_fine, *res_coarse, *wire_color;
  167. surf_list = GS_get_surf_list(&nsurfs);
  168. for (i = 0; i < nsurfs; i++) {
  169. draw_mode = 0;
  170. id = surf_list[i];
  171. if (!GS_surf_exists(id))
  172. G_fatal_error(_("Surface id %d doesn't exist"), id);
  173. if (params->mode_all->answer) { /* use one mode for all surfaces */
  174. mode = params->mode->answers[0];
  175. style = params->style->answers[0];
  176. shade = params->shade->answers[0];
  177. res_fine = params->res_fine->answers[0];
  178. res_coarse = params->res_coarse->answers[0];
  179. wire_color = params->wire_color->answers[0];
  180. }
  181. else {
  182. mode = params->mode->answers[i];
  183. style = params->style->answers[i];
  184. shade = params->shade->answers[i];
  185. res_fine = params->res_fine->answers[i];
  186. res_coarse = params->res_coarse->answers[i];
  187. wire_color = params->wire_color->answers[i];
  188. }
  189. /* mode */
  190. if (strcmp(mode, "coarse") == 0) {
  191. draw_mode |= DM_WIRE;
  192. }
  193. else if (strcmp(mode, "fine") == 0) {
  194. draw_mode |= DM_POLY;
  195. }
  196. else { /* both */
  197. draw_mode |= DM_WIRE_POLY;
  198. }
  199. /* style */
  200. if (strcmp(params->style->answers[i], "wire") == 0) {
  201. draw_mode |= DM_GRID_WIRE;
  202. }
  203. else { /* surface */
  204. draw_mode |= DM_GRID_SURF;
  205. }
  206. /* shading */
  207. if (strcmp(params->shade->answers[i], "flat") == 0) {
  208. draw_mode |= DM_FLAT;
  209. }
  210. else { /* gouraud */
  211. draw_mode |= DM_GOURAUD;
  212. }
  213. if (GS_set_drawmode(id, draw_mode) < 0)
  214. G_fatal_error(_("Unable to set draw mode for surface id %d"), id);
  215. /* resolution */
  216. resol_fine = atoi(res_fine);
  217. resol_coarse = atoi(res_coarse);
  218. if (GS_set_drawres(id, resol_fine, resol_fine,
  219. resol_coarse, resol_coarse) < 0)
  220. G_fatal_error(_("Unable to set draw mode for surface id %d"), id);
  221. /* wire color */
  222. GS_set_wire_color(id, Nviz_color_from_str(wire_color));
  223. }
  224. return;
  225. }