main.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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. Nviz_create_render_window(offscreen, NULL, width, height); /* offscreen display */
  65. Nviz_make_current_render_window(offscreen);
  66. /* initialize nviz data */
  67. Nviz_init_data(&data);
  68. /* define default attributes for map objects */
  69. Nviz_set_surface_attr_default();
  70. /* set background color */
  71. Nviz_set_bgcolor(&data, Nviz_color_from_str(params->bgcolor->answer));
  72. /* init view, lights */
  73. Nviz_init_view(&data);
  74. /* load raster maps (surface topography) & set attributes (map/constant) */
  75. load_rasters(params, &data);
  76. /* set draw mode of loaded surfaces */
  77. surface_set_draw_mode(params);
  78. /* load line vector maps */
  79. if (params->vlines->answer) {
  80. load_vlines(params, &data);
  81. /* set attributes of 2d lines */
  82. vlines_set_attrb(params);
  83. }
  84. /* load point vector maps */
  85. if (params->vpoints->answer) {
  86. load_vpoints(params, &data);
  87. /* set attributes for points */
  88. vpoints_set_attrb(params);
  89. }
  90. /* load volumes */
  91. if (params->volume->answer) {
  92. load_rasters3d(params, &data);
  93. }
  94. /* define isosurfaces for displaying volumes */
  95. if (params->isosurf_level->answer) {
  96. add_isosurfs(params, &data);
  97. }
  98. /* define slices for displaying volumes */
  99. if (params->slice->answer) {
  100. add_slices(params, &data);
  101. }
  102. /* focus on loaded data */
  103. Nviz_set_focus_map(MAP_OBJ_UNDEFINED, -1);
  104. /* define view point */
  105. if (params->exag->answer) {
  106. z_exag = atof(params->exag->answer);
  107. }
  108. else {
  109. z_exag = Nviz_get_exag();
  110. G_verbose_message(_("Vertical exaggeration not given, using calculated "
  111. "value %.0f"),
  112. z_exag);
  113. }
  114. Nviz_change_exag(&data, z_exag);
  115. if (params->height->answer) {
  116. vp_height = atof(params->height->answer);
  117. }
  118. else {
  119. double min, max;
  120. Nviz_get_exag_height(&vp_height, &min, &max);
  121. G_verbose_message(_("Viewpoint height not given, using calculated "
  122. "value %.0f"),
  123. 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]),
  140. 0.0);
  141. Nviz_set_light_bright(&data, 1,
  142. atoi(params->light_bright->answer) / 100.0);
  143. if(G_str_to_color(params->light_color->answer, &red, &grn, &blu) != 1) {
  144. red = grn = blu = 255;
  145. }
  146. Nviz_set_light_color(&data, 1, red, grn, blu);
  147. Nviz_set_light_ambient(&data, 1,
  148. atof(params->light_ambient->answer) / 100.0);
  149. /* define fringes */
  150. if (params->fringe->answer) {
  151. int nw, ne, sw, se;
  152. i = 0;
  153. nw = ne = sw = se = 0;
  154. while(params->fringe->answers[i]) {
  155. const char *edge = params->fringe->answers[i++];
  156. if (strcmp(edge, "nw") == 0)
  157. nw = 1;
  158. else if (strcmp(edge, "ne") == 0)
  159. ne = 1;
  160. else if (strcmp(edge, "sw") == 0)
  161. sw = 1;
  162. else if (strcmp(edge, "se") == 0)
  163. se = 1;
  164. }
  165. Nviz_new_fringe(&data, -1, 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, Nviz_color_from_str(params->north_arrow_color->answer));
  177. Nviz_draw_arrow(&data);
  178. }
  179. GS_clear(data.bgcolor);
  180. /* cutting planes */
  181. if(params->cplane->answer)
  182. draw_cplane(params, &data);
  183. /* draw */
  184. Nviz_draw_all(&data);
  185. /* write to image */
  186. ret = 0;
  187. if (strcmp(params->format->answer, "ppm") == 0)
  188. ret = write_img(output_name, FORMAT_PPM);
  189. if (strcmp(params->format->answer, "tif") == 0)
  190. ret = write_img(output_name, FORMAT_TIF);
  191. if (!ret)
  192. G_fatal_error(_("Unsupported output format"));
  193. G_done_msg(_("File <%s> created."), output_name);
  194. Nviz_destroy_data(&data);
  195. Nviz_destroy_render_window(offscreen);
  196. G_free((void *)output_name);
  197. G_free((void *)params);
  198. exit(EXIT_SUCCESS);
  199. }
  200. void swap_gl()
  201. {
  202. return;
  203. }