main.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. /****************************************************************************
  2. *
  3. * MODULE: m.nviz.image
  4. *
  5. * AUTHOR(S): Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
  6. * Anna Kratochvilova (Google SoC 2011)
  7. *
  8. * PURPOSE: Renders GIS data in 3D space.
  9. *
  10. * COPYRIGHT: (C) 2008, 2010-2011 by the GRASS Development Team
  11. *
  12. * This program is free software under the GNU General
  13. * Public License (>=v2). Read the file COPYING that
  14. * comes with GRASS for details.
  15. *
  16. *****************************************************************************/
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <grass/gis.h>
  20. #include <grass/colors.h>
  21. #include <grass/glocale.h>
  22. #include <grass/nviz.h>
  23. #include "local_proto.h"
  24. static void swap_gl();
  25. int main(int argc, char *argv[])
  26. {
  27. struct GModule *module;
  28. struct GParams *params;
  29. int i, ret;
  30. int red, grn, blu;
  31. float size;
  32. double vp_height, z_exag; /* calculated viewpoint height, z-exag */
  33. int width, height; /* output image size */
  34. char *output_name;
  35. nv_data data;
  36. struct render_window *offscreen;
  37. /* initialize GRASS */
  38. G_gisinit(argv[0]);
  39. module = G_define_module();
  40. G_add_keyword(_("visualization"));
  41. G_add_keyword(_("graphics"));
  42. G_add_keyword(_("raster"));
  43. G_add_keyword(_("vector"));
  44. G_add_keyword(_("raster3d"));
  45. module->label = _("Creates a 3D rendering of GIS data.");
  46. module->description = _("Renders surfaces (raster data), "
  47. "2D/3D vector data, and "
  48. "volumes (3D raster data) in 3D.");
  49. params = (struct GParams *)G_malloc(sizeof(struct GParams));
  50. /* define options, call G_parser() */
  51. parse_command(argc, argv, params);
  52. /* check parameters consistency */
  53. check_parameters(params);
  54. width = atoi(params->size->answers[0]);
  55. height = atoi(params->size->answers[1]);
  56. G_asprintf(&output_name, "%s.%s", params->output->answer,
  57. params->format->answer);
  58. GS_libinit();
  59. GVL_libinit();
  60. GS_set_swap_func(swap_gl);
  61. /* define render window */
  62. offscreen = Nviz_new_render_window();
  63. Nviz_init_render_window(offscreen);
  64. if (Nviz_create_render_window(offscreen, NULL, width, height) == -1)
  65. G_fatal_error(_("Unable to render data"));
  66. Nviz_make_current_render_window(offscreen);
  67. /* initialize nviz data */
  68. Nviz_init_data(&data);
  69. /* define default attributes for map objects */
  70. Nviz_set_surface_attr_default();
  71. /* set background color */
  72. Nviz_set_bgcolor(&data, Nviz_color_from_str(params->bgcolor->answer));
  73. /* init view, lights */
  74. Nviz_init_view(&data);
  75. /* load raster maps (surface topography) & set attributes (map/constant) */
  76. load_rasters(params, &data);
  77. /* set draw mode of loaded surfaces */
  78. surface_set_draw_mode(params);
  79. /* load line vector maps */
  80. if (params->vlines->answer) {
  81. load_vlines(params, &data);
  82. /* set attributes of 2d lines */
  83. vlines_set_attrb(params);
  84. }
  85. /* load point vector maps */
  86. if (params->vpoints->answer) {
  87. load_vpoints(params, &data);
  88. /* set attributes for points */
  89. vpoints_set_attrb(params);
  90. }
  91. /* load volumes */
  92. if (params->volume->answer) {
  93. load_rasters3d(params, &data);
  94. }
  95. /* define isosurfaces for displaying volumes */
  96. if (params->isosurf_level->answer) {
  97. add_isosurfs(params, &data);
  98. }
  99. /* define slices for displaying volumes */
  100. if (params->slice->answer) {
  101. add_slices(params, &data);
  102. }
  103. /* focus on loaded data */
  104. Nviz_set_focus_map(MAP_OBJ_UNDEFINED, -1);
  105. /* define view point */
  106. if (params->exag->answer) {
  107. z_exag = atof(params->exag->answer);
  108. }
  109. else {
  110. z_exag = Nviz_get_exag();
  111. G_verbose_message(_("Vertical exaggeration not given, using calculated "
  112. "value %.0f"),
  113. z_exag);
  114. }
  115. Nviz_change_exag(&data, z_exag);
  116. if (params->height->answer) {
  117. vp_height = atof(params->height->answer);
  118. }
  119. else {
  120. double min, max;
  121. Nviz_get_exag_height(&vp_height, &min, &max);
  122. G_verbose_message(_("Viewpoint height not given, using calculated "
  123. "value %.0f"),
  124. vp_height);
  125. }
  126. Nviz_set_viewpoint_height(vp_height);
  127. Nviz_set_viewpoint_position(atof(params->pos->answers[0]),
  128. atof(params->pos->answers[1]));
  129. Nviz_set_viewpoint_twist(atoi(params->twist->answer));
  130. Nviz_set_viewpoint_persp(atoi(params->persp->answer));
  131. if (params->focus->answer) {
  132. Nviz_set_focus(&data, atof(params->focus->answers[0]),
  133. atof(params->focus->answers[1]),
  134. atof(params->focus->answers[2]));
  135. }
  136. /* set lights */
  137. Nviz_set_light_position(&data, 1,
  138. atof(params->light_pos->answers[0]),
  139. atof(params->light_pos->answers[1]),
  140. atof(params->light_pos->answers[2]),
  141. 0.0);
  142. Nviz_set_light_bright(&data, 1,
  143. atoi(params->light_bright->answer) / 100.0);
  144. if(G_str_to_color(params->light_color->answer, &red, &grn, &blu) != 1) {
  145. red = grn = blu = 255;
  146. }
  147. Nviz_set_light_color(&data, 1, red, grn, blu);
  148. Nviz_set_light_ambient(&data, 1,
  149. atof(params->light_ambient->answer) / 100.0);
  150. /* define fringes */
  151. if (params->fringe->answer) {
  152. int nw, ne, sw, se;
  153. i = 0;
  154. nw = ne = sw = se = 0;
  155. while(params->fringe->answers[i]) {
  156. const char *edge = params->fringe->answers[i++];
  157. if (strcmp(edge, "nw") == 0)
  158. nw = 1;
  159. else if (strcmp(edge, "ne") == 0)
  160. ne = 1;
  161. else if (strcmp(edge, "sw") == 0)
  162. sw = 1;
  163. else if (strcmp(edge, "se") == 0)
  164. se = 1;
  165. }
  166. Nviz_new_fringe(&data, -1, Nviz_color_from_str(params->fringe_color->answer),
  167. atof(params->fringe_elev->answer), nw, ne, sw, se);
  168. }
  169. /* draw north arrow */
  170. if (params->north_arrow->answer) {
  171. if (!params->north_arrow_size->answer)
  172. size = Nviz_get_longdim(&data) / 8.;
  173. else
  174. size = atof(params->north_arrow_size->answer);
  175. Nviz_set_arrow(&data, atoi(params->north_arrow->answers[0]),
  176. atoi(params->north_arrow->answers[1]),
  177. size, Nviz_color_from_str(params->north_arrow_color->answer));
  178. Nviz_draw_arrow(&data);
  179. }
  180. GS_clear(data.bgcolor);
  181. /* cutting planes */
  182. if(params->cplane->answer)
  183. draw_cplane(params, &data);
  184. /* draw */
  185. Nviz_draw_all(&data);
  186. /* write to image */
  187. ret = 0;
  188. if (strcmp(params->format->answer, "ppm") == 0)
  189. ret = write_img(output_name, FORMAT_PPM);
  190. if (strcmp(params->format->answer, "tif") == 0)
  191. ret = write_img(output_name, FORMAT_TIF);
  192. if (!ret)
  193. G_fatal_error(_("Unsupported output format"));
  194. G_done_msg(_("File <%s> created."), output_name);
  195. Nviz_destroy_data(&data);
  196. Nviz_destroy_render_window(offscreen);
  197. G_free((void *)output_name);
  198. G_free((void *)params);
  199. exit(EXIT_SUCCESS);
  200. }
  201. void swap_gl()
  202. {
  203. return;
  204. }