main.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  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 from the command line.
  9. *
  10. * COPYRIGHT: (C) 2008-2014 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(_("miscellaneous"));
  41. G_add_keyword(_("visualization"));
  42. G_add_keyword(_("graphics"));
  43. G_add_keyword(_("raster"));
  44. G_add_keyword(_("vector"));
  45. G_add_keyword(_("raster3d"));
  46. module->label = _("Creates a 3D rendering of GIS data.");
  47. module->description = _("Renders surfaces (raster data), "
  48. "2D/3D vector data, and "
  49. "volumes (3D raster data) in 3D.");
  50. params = (struct GParams *)G_malloc(sizeof(struct GParams));
  51. /* define options, call G_parser() */
  52. parse_command(argc, argv, params);
  53. /* check parameters consistency */
  54. check_parameters(params);
  55. width = atoi(params->size->answers[0]);
  56. height = atoi(params->size->answers[1]);
  57. G_asprintf(&output_name, "%s.%s", params->output->answer,
  58. params->format->answer);
  59. GS_libinit();
  60. GVL_libinit();
  61. GS_set_swap_func(swap_gl);
  62. /* define render window */
  63. offscreen = Nviz_new_render_window();
  64. Nviz_init_render_window(offscreen);
  65. if (Nviz_create_render_window(offscreen, NULL, width, height) == -1)
  66. G_fatal_error(_("Unable to render data"));
  67. Nviz_make_current_render_window(offscreen);
  68. /* initialize nviz data */
  69. Nviz_init_data(&data);
  70. /* define default attributes for map objects */
  71. Nviz_set_surface_attr_default();
  72. /* set background color */
  73. Nviz_set_bgcolor(&data, Nviz_color_from_str(params->bgcolor->answer));
  74. /* init view, lights */
  75. Nviz_init_view(&data);
  76. /* load raster maps (surface topography) & set attributes (map/constant) */
  77. load_rasters(params, &data);
  78. /* set draw mode of loaded surfaces */
  79. surface_set_draw_mode(params);
  80. /* load line vector maps */
  81. if (params->vlines->answer) {
  82. load_vlines(params, &data);
  83. /* set attributes of 2d lines */
  84. vlines_set_attrb(params);
  85. }
  86. /* load point vector maps */
  87. if (params->vpoints->answer) {
  88. load_vpoints(params, &data);
  89. /* set attributes for points */
  90. vpoints_set_attrb(params);
  91. }
  92. /* load volumes */
  93. if (params->volume->answer) {
  94. load_rasters3d(params, &data);
  95. }
  96. /* define isosurfaces for displaying volumes */
  97. if (params->isosurf_level->answer) {
  98. add_isosurfs(params, &data);
  99. }
  100. /* define slices for displaying volumes */
  101. if (params->slice->answer) {
  102. add_slices(params, &data);
  103. }
  104. /* focus on loaded data */
  105. Nviz_set_focus_map(MAP_OBJ_UNDEFINED, -1);
  106. /* define view point */
  107. if (params->exag->answer) {
  108. z_exag = atof(params->exag->answer);
  109. }
  110. else {
  111. z_exag = Nviz_get_exag();
  112. G_verbose_message(_("Vertical exaggeration not given, using calculated "
  113. "value %.0f"), 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"), vp_height);
  124. }
  125. Nviz_set_viewpoint_height(vp_height);
  126. Nviz_set_viewpoint_position(atof(params->pos->answers[0]),
  127. atof(params->pos->answers[1]));
  128. Nviz_set_viewpoint_twist(atoi(params->twist->answer));
  129. Nviz_set_viewpoint_persp(atoi(params->persp->answer));
  130. if (params->focus->answer) {
  131. Nviz_set_focus(&data, atof(params->focus->answers[0]),
  132. atof(params->focus->answers[1]),
  133. atof(params->focus->answers[2]));
  134. }
  135. /* set lights */
  136. Nviz_set_light_position(&data, 1,
  137. atof(params->light_pos->answers[0]),
  138. atof(params->light_pos->answers[1]),
  139. atof(params->light_pos->answers[2]), 0.0);
  140. Nviz_set_light_bright(&data, 1,
  141. atoi(params->light_bright->answer) / 100.0);
  142. if (G_str_to_color(params->light_color->answer, &red, &grn, &blu) != 1) {
  143. red = grn = blu = 255;
  144. }
  145. Nviz_set_light_color(&data, 1, red, grn, blu);
  146. Nviz_set_light_ambient(&data, 1,
  147. atof(params->light_ambient->answer) / 100.0);
  148. /* define fringes */
  149. if (params->fringe->answer) {
  150. int nw, ne, sw, se;
  151. i = 0;
  152. nw = ne = sw = se = 0;
  153. while (params->fringe->answers[i]) {
  154. const char *edge = params->fringe->answers[i++];
  155. if (strcmp(edge, "nw") == 0)
  156. nw = 1;
  157. else if (strcmp(edge, "ne") == 0)
  158. ne = 1;
  159. else if (strcmp(edge, "sw") == 0)
  160. sw = 1;
  161. else if (strcmp(edge, "se") == 0)
  162. se = 1;
  163. }
  164. Nviz_new_fringe(&data, -1,
  165. Nviz_color_from_str(params->fringe_color->answer),
  166. atof(params->fringe_elev->answer), nw, ne, sw, se);
  167. }
  168. /* draw north arrow */
  169. if (params->north_arrow->answer) {
  170. if (!params->north_arrow_size->answer)
  171. size = Nviz_get_longdim(&data) / 8.;
  172. else
  173. size = atof(params->north_arrow_size->answer);
  174. Nviz_set_arrow(&data, atoi(params->north_arrow->answers[0]),
  175. atoi(params->north_arrow->answers[1]),
  176. size,
  177. Nviz_color_from_str(params->north_arrow_color->
  178. answer));
  179. Nviz_draw_arrow(&data);
  180. }
  181. GS_clear(data.bgcolor);
  182. /* cutting planes */
  183. if (params->cplane->answer)
  184. draw_cplane(params, &data);
  185. /* draw */
  186. Nviz_draw_all(&data);
  187. /* write to image */
  188. ret = 0;
  189. if (strcmp(params->format->answer, "ppm") == 0)
  190. ret = write_img(output_name, FORMAT_PPM);
  191. if (strcmp(params->format->answer, "tif") == 0)
  192. ret = write_img(output_name, FORMAT_TIF);
  193. if (ret == 1)
  194. G_fatal_error(_("Failed to write image"));
  195. else if (ret == 2)
  196. G_fatal_error(_("Unsupported output format"));
  197. G_done_msg(_("File <%s> created."), output_name);
  198. Nviz_destroy_data(&data);
  199. Nviz_destroy_render_window(offscreen);
  200. G_free((void *)output_name);
  201. G_free((void *)params);
  202. exit(EXIT_SUCCESS);
  203. }
  204. void swap_gl()
  205. {
  206. return;
  207. }