GRASS Programmer's Manual  6.5.svn(2014)-r66266
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
nviz/draw.c
Go to the documentation of this file.
1 
17 #include <grass/nviz.h>
18 
19 #ifndef GL_CLAMP_TO_EDGE
20 #define GL_CLAMP_TO_EDGE 0x812F
21 #endif
22 
23 static int sort_surfs_max(int *, int *, int *, int);
24 
32 int Nviz_draw_all_surf(nv_data * dc)
33 {
34  int i, nsurfs;
35  int sortSurfs[MAX_SURFS], sorti[MAX_SURFS];
36  int *surf_list;
37  float x, y, z;
38  int num, w;
39 
40  /* Get position for Light 1 */
41  num = 1;
42  x = dc->light[num].x;
43  y = dc->light[num].y;
44  z = dc->light[num].z;
45  w = dc->light[num].z;
46 
47  surf_list = GS_get_surf_list(&nsurfs);
48 
49  sort_surfs_max(surf_list, sortSurfs, sorti, nsurfs);
50 
51  G_free(surf_list);
52 
53  /* re-initialize lights */
54  GS_setlight_position(num, x, y, z, w);
55  num = 2;
56  GS_setlight_position(num, 0., 0., 1., 0);
57 
58  for (i = 0; i < nsurfs; i++) {
59  GS_draw_surf(sortSurfs[i]);
60  }
61 
62  /* GS_draw_cplane_fence params will change - surfs aren't used anymore */
63  for (i = 0; i < MAX_CPLANES; i++) {
64  if (dc->cp_on[i])
65  GS_draw_cplane_fence(sortSurfs[0], sortSurfs[1], i);
66  }
67 
68  return 1;
69 }
70 
84 int sort_surfs_max(int *surf, int *id_sort, int *indices, int num)
85 {
86  int i, j;
87  float maxvals[MAX_SURFS];
88  float tmp, max = 0., tmin, tmax, tmid;
89 
90  for (i = 0; i < num; i++) {
91  GS_get_zextents(surf[i], &tmin, &tmax, &tmid);
92  if (i == 0)
93  max = tmax;
94  else
95  max = max < tmax ? tmax : max;
96  maxvals[i] = tmax;
97  }
98 
99  for (i = 0; i < num; i++) {
100  tmp = maxvals[0];
101  indices[i] = 0;
102  for (j = 0; j < num; j++) {
103  if (maxvals[j] < tmp) {
104  tmp = maxvals[j];
105  indices[i] = j;
106  }
107  }
108 
109  maxvals[indices[i]] = max + 1;
110  id_sort[i] = surf[indices[i]];
111  }
112 
113  return 1;
114 }
115 
122 {
123  /* GS_set_cancel(0); */
124 
125  /* in case transparency is set */
126  GS_set_draw(GSD_BOTH);
127 
128  GS_ready_draw();
129 
130  GV_alldraw_vect();
131 
132  GS_done_draw();
133 
134  GS_set_draw(GSD_BACK);
135 
136  /* GS_set_cancel(0); */
137 
138  return 1;
139 }
140 
147 {
148  int i;
149  int *site_list, nsites;
150 
151  site_list = GP_get_site_list(&nsites);
152 
153  /* in case transparency is set */
154  GS_set_draw(GSD_BOTH);
155 
156  GS_ready_draw();
157 
158  for (i = 0; i < nsites; i++) {
159  GP_draw_site(site_list[i]);
160  }
161  G_free(site_list);
162 
163  GS_done_draw();
164 
165  GS_set_draw(GSD_BACK);
166 
167  return 1;
168 }
169 
176 {
177  int *vol_list, nvols, i;
178 
179  vol_list = GVL_get_vol_list(&nvols);
180 
181  /* in case transparency is set */
182  GS_set_draw(GSD_BOTH);
183 
184  GS_ready_draw();
185 
186  for (i = 0; i < nvols; i++) {
187  GVL_draw_vol(vol_list[i]);
188  }
189 
190  G_free(vol_list);
191 
192  GS_done_draw();
193 
194  GS_set_draw(GSD_BACK);
195 
196  return 1;
197 }
198 
204 int Nviz_draw_all(nv_data * data)
205 {
206  int i;
207  int draw_surf, draw_vect, draw_site, draw_vol;
208 
209  draw_surf = 1;
210  draw_vect = 1;
211  draw_site = 1;
212  draw_vol = 1;
213  /*
214  draw_north_arrow = 0;
215  arrow_x = 0;
216  draw_label = 0;
217  draw_legend = 0;
218  draw_fringe = 0;
219  draw_scalebar = 0;
220  draw_bar_x = 0;
221  */
222 
223  GS_set_draw(GSD_BACK); /* needs to be BACK to avoid flickering */
224 
225  GS_ready_draw();
226 
227  GS_clear(data->bgcolor);
228 
229  if (draw_surf)
230  Nviz_draw_all_surf(data);
231 
232  if (draw_vect)
233  Nviz_draw_all_vect(data);
234 
235  if (draw_site)
236  Nviz_draw_all_site(data);
237 
238  if (draw_vol)
239  Nviz_draw_all_vol(data);
240 
241  for(i = 0; i < data->num_fringes; i++) {
242  struct fringe_data * f = data->fringe[i];
243  GS_draw_fringe(f->id, f->color, f->elev, f->where);
244  }
245 
246  /* North Arrow */
247  if (data->draw_arrow) {
248  gsd_north_arrow(data->arrow->where, data->arrow->size,
249  (GLuint)NULL, data->arrow->color, data->arrow->color);
250  }
251 
252  /* scale bar */
253  for (i = 0; i < data->num_scalebars; i++) {
254  struct scalebar_data *s = data->scalebar[i];
255  gsd_scalebar_v2(s->where, s->size, 0, s->color, s->color);
256  }
257 
258  GS_done_draw();
259  GS_set_draw(GSD_BACK);
260 
261  return 1;
262 }
263 
278 int Nviz_draw_quick(nv_data * data, int draw_mode)
279 {
280  GS_set_draw(GSD_BACK);
281 
282  GS_ready_draw();
283 
284  GS_clear(data->bgcolor);
285 
286  /* draw surfaces */
287  if (draw_mode & DRAW_QUICK_SURFACE)
288  GS_alldraw_wire();
289 
290  /* draw vector lines */
291  if (draw_mode & DRAW_QUICK_VLINES)
292  GV_alldraw_vect();
293 
294  /* draw vector points */
295  if (draw_mode & DRAW_QUICK_VPOINTS)
296  GP_alldraw_site();
297 
298  /* draw volumes */
299  if (draw_mode & DRAW_QUICK_VOLUME) {
301  }
302 
303  GS_done_draw();
304 
305  return 1;
306 }
307 
315 int Nviz_load_image(GLubyte *image_data, int width, int height, int alpha)
316 {
317  unsigned int texture_id;
318  int in_format;
319  GLenum format;
320 
321  if (alpha)
322  {
323  in_format = 4;
324  format = GL_RGBA;
325  }
326  else
327  {
328  in_format = 3;
329  format = GL_RGB;
330  }
331  glGenTextures( 1, &texture_id);
332  glBindTexture(GL_TEXTURE_2D, texture_id);
333  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
334 
335  glTexImage2D(GL_TEXTURE_2D, 0, in_format, width, height, 0,format,
336  GL_UNSIGNED_BYTE, image_data);
337 
338  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
339  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
340 
341  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
342  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
343 
344  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
345 
346  return texture_id;
347 }
348 
354 void Nviz_set_2D(int width, int height)
355 {
356  glEnable(GL_BLEND); /* images are transparent */
357  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
358 
359  glMatrixMode(GL_PROJECTION);
360  glLoadIdentity();
361  glOrtho(0, width, 0, height, -1, 1);
362 
363  /* set coordinate system from upper left corner */
364  glScalef(1, -1, 1);
365  glTranslatef(0, -height, 0);
366 
367  glMatrixMode(GL_MODELVIEW);
368  glLoadIdentity();
369 }
370 
378 void Nviz_draw_image(int x, int y, int width, int height, int texture_id)
379 {
380  glBindTexture(GL_TEXTURE_2D, texture_id);
381  GS_set_draw(GSD_FRONT);
382 
383  glEnable(GL_TEXTURE_2D);
384 
385  glBegin(GL_QUADS);
386 
387  glTexCoord2d(0.0,1.0);
388  glVertex2d(x, y);
389  glTexCoord2d(0.0,0.0);
390  glVertex2d(x, y + height);
391  glTexCoord2d(1.0,0.0);
392  glVertex2d(x + width, y + height);
393  glTexCoord2d(1.0,1.0);
394  glVertex2d(x + width, y);
395 
396  glEnd();
397 
398  GS_done_draw();
399  glDisable(GL_TEXTURE_2D);
400 }
401 
407 void Nviz_del_texture(int texture_id)
408 {
409  GLuint t[1];
410 
411  t[0] = texture_id;
412  glDeleteTextures(1, t);
413 }
414 
420 {
421  glGetIntegerv(GL_MAX_TEXTURE_SIZE, size);
422 }
int * GP_get_site_list(int *numsites)
Get list of point sets.
Definition: GP2.c:101
void G_free(void *buf)
Free allocated memory.
Definition: gis/alloc.c:142
void GP_draw_site(int id)
Draw point set.
Definition: GP2.c:520
void Nviz_set_2D(int width, int height)
Set ortho view for drawing images.
Definition: nviz/draw.c:354
int Nviz_draw_all(nv_data *data)
Draw all map objects (in full resolution) and decorations.
Definition: nviz/draw.c:204
int Nviz_draw_all_vol()
Draw all loaded volume sets.
Definition: nviz/draw.c:175
void GS_done_draw(void)
Draw done, swap buffers.
Definition: GS2.c:2499
tuple width
long num
Definition: g3dcats.c:93
void Nviz_draw_image(int x, int y, int width, int height, int texture_id)
Draw image as texture.
Definition: nviz/draw.c:378
int Nviz_draw_all_site()
Draw all loaded vector point sets.
Definition: nviz/draw.c:146
int y
Definition: plot.c:34
#define max(x, y)
Definition: draw2.c:69
int gsd_north_arrow(float *pos2, float len, GLuint fontbase, unsigned long arw_clr, unsigned long text_clr)
Draw North Arrow takes OpenGL coords and size.
Definition: gsd_objs.c:826
void GS_clear(int col)
Clear view.
Definition: GS2.c:3416
void GP_alldraw_site(void)
Draw all available point sets.
Definition: GP2.c:557
void GV_alldraw_vect(void)
Draw all vector sets.
Definition: GV2.c:444
tuple size
value.Bind(wx.EVT_TEXT, self.OnVolumeIsosurfMap)
Definition: tools.py:2334
void GVL_alldraw_wire(void)
Draw all volume sets in wire mode.
Definition: GVL2.c:412
void GS_draw_fringe(int id, unsigned long clr, float elev, int *where)
Draw fringe around data (surface) at selected corners.
Definition: GS2.c:820
int GS_draw_cplane_fence(int hs1, int hs2, int num)
Draw cplace fence ?
Definition: GS2.c:3173
void GVL_draw_vol(int vid)
Draw volume set.
Definition: GVL2.c:362
tuple data
void Nviz_del_texture(int texture_id)
Delete texture.
Definition: nviz/draw.c:407
void GS_alldraw_wire(void)
Draw all wires.
Definition: GS2.c:1916
return NULL
Definition: dbfopen.c:1394
int Nviz_draw_all_surf(nv_data *dc)
Draw all loaded surfaces.
Definition: nviz/draw.c:32
int Nviz_draw_quick(nv_data *data, int draw_mode)
Draw all surfaces in wireframe (quick mode)
Definition: nviz/draw.c:278
int Nviz_draw_all_vect()
Draw all loaded vector sets (lines)
Definition: nviz/draw.c:121
#define GL_CLAMP_TO_EDGE
Definition: nviz/draw.c:20
int GS_get_zextents(int id, float *min, float *max, float *mid)
Get z-extent for a single surface.
Definition: GS2.c:2664
void Nviz_get_max_texture(int *size)
Get maximum texture size.
Definition: nviz/draw.c:419
int * GVL_get_vol_list(int *numvols)
Get list of loaded volume sets.
Definition: GVL2.c:161
int * GS_get_surf_list(int *numsurfs)
Get surface list.
Definition: GS2.c:1536
void GS_draw_surf(int id)
Draw surface.
Definition: GS2.c:1861
int gsd_scalebar_v2(float *pos, float len, GLuint fontbase, unsigned long bar_clr, unsigned long text_clr)
Draw Scalebar (as lines)
Definition: gsd_objs.c:1248
void GS_ready_draw(void)
Definition: GS2.c:2486
int height
int Nviz_load_image(GLubyte *image_data, int width, int height, int alpha)
Load image into texture.
Definition: nviz/draw.c:315
void GS_set_draw(int where)
Sets which buffer to draw to.
Definition: GS2.c:2457
void GS_setlight_position(int num, float xpos, float ypos, float zpos, int local)
Set light position.
Definition: GS2.c:309