surface.c 7.3 KB

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