surface.c 7.9 KB

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