void update_light (gint xpos, gint ypos) { gint startx, starty, pw, ph; GimpVector3 vp; gint k = mapvals.light_selected; compute_preview_rectangle (&startx, &starty, &pw, &ph); vp = mapvals.viewpoint; vp.z = -vp.z; switch (mapvals.lightsource[k].type) { case NO_LIGHT: break; case POINT_LIGHT: case SPOT_LIGHT: gimp_vector_2d_to_3d (startx, starty, pw, ph, xpos, ypos, &vp, &mapvals.lightsource[k].position); break; case DIRECTIONAL_LIGHT: gimp_vector_2d_to_3d (startx, starty, pw, ph, xpos, ypos, &vp, &mapvals.lightsource[k].direction); break; } }
void draw_preview_image (gboolean recompute) { gint startx, starty, pw, ph; GdkColor color; color.red = 0x0; color.green = 0x0; color.blue = 0x0; gdk_gc_set_rgb_bg_color (gc, &color); color.red = 0xFFFF; color.green = 0xFFFF; color.blue = 0xFFFF; gdk_gc_set_rgb_fg_color (gc, &color); gdk_gc_set_function (gc, GDK_COPY); compute_preview_rectangle (&startx, &starty, &pw, &ph); if (recompute) { GdkDisplay *display = gtk_widget_get_display (previewarea); GdkCursor *cursor; cursor = gdk_cursor_new_for_display (display, GDK_WATCH); gdk_window_set_cursor (previewarea->window, cursor); gdk_cursor_unref (cursor); compute_preview (startx, starty, pw, ph); cursor = gdk_cursor_new_for_display (display, GDK_HAND2); gdk_window_set_cursor (previewarea->window, cursor); gdk_cursor_unref (cursor); gdk_flush (); /* if we recompute, clear backbuf, so we don't * restore the wrong bitmap */ if (backbuf.image != NULL) { g_object_unref (backbuf.image); backbuf.image = NULL; } } gdk_draw_rgb_image (previewarea->window, gc, 0, 0, PREVIEW_WIDTH, PREVIEW_HEIGHT, GDK_RGB_DITHER_MAX, preview_rgb_data, 3 * PREVIEW_WIDTH); /* draw symbols if enabled in UI */ if (mapvals.interactive_preview) { draw_handles (); } }
void preview_compute (void) { GdkDisplay *display = gtk_widget_get_display (previewarea); GdkCursor *cursor; gint startx, starty, pw, ph; compute_preview_rectangle (&startx, &starty, &pw, &ph); cursor = gdk_cursor_new_for_display (display, GDK_WATCH); gdk_window_set_cursor (gtk_widget_get_window (previewarea), cursor); gdk_cursor_unref (cursor); compute_preview (startx, starty, pw, ph); cursor = gdk_cursor_new_for_display (display, GDK_HAND2); gdk_window_set_cursor (gtk_widget_get_window (previewarea), cursor); gdk_cursor_unref (cursor); gdk_flush (); }
static void draw_handles (void) { gdouble dxpos, dypos; gint startx, starty, pw, ph; GimpVector3 viewpoint; GimpVector3 light_position; gint k = mapvals.light_selected; gfloat length; gfloat delta_x = 0.0; gfloat delta_y = 0.0; /* calculate handle position */ compute_preview_rectangle (&startx, &starty, &pw, &ph); switch (mapvals.lightsource[k].type) { case NO_LIGHT: return; case POINT_LIGHT: case SPOT_LIGHT: /* swap z to reverse light position */ viewpoint = mapvals.viewpoint; viewpoint.z = -viewpoint.z; light_position = mapvals.lightsource[k].position; gimp_vector_3d_to_2d (startx, starty, pw, ph, &dxpos, &dypos, &viewpoint, &light_position); handle_xpos = (gint) (dxpos + 0.5); handle_ypos = (gint) (dypos + 0.5); break; case DIRECTIONAL_LIGHT: light_position.x = light_position.y = 0.5; light_position.z = 0; viewpoint.z = -viewpoint.z; gimp_vector_3d_to_2d (startx, starty, pw, ph, &dxpos, &dypos, &viewpoint, &light_position); length = PREVIEW_HEIGHT / 4; delta_x = mapvals.lightsource[k].direction.x * length; delta_y = mapvals.lightsource[k].direction.y * length; handle_xpos = dxpos + delta_x; handle_ypos = dypos + delta_y; break; } gdk_gc_set_function (gc, GDK_COPY); if (mapvals.lightsource[k].type != NO_LIGHT) { GdkColor color; /* Restore background if it has been saved */ /* ======================================= */ if (backbuf.image != NULL) { gdk_gc_set_function (gc, GDK_COPY); gdk_draw_image (previewarea->window, gc, backbuf.image, 0, 0, backbuf.x, backbuf.y, backbuf.w, backbuf.h); g_object_unref (backbuf.image); backbuf.image = NULL; } /* calculate backbuffer */ switch (mapvals.lightsource[k].type) { case POINT_LIGHT: backbuf.x = handle_xpos - LIGHT_SYMBOL_SIZE / 2; backbuf.y = handle_ypos - LIGHT_SYMBOL_SIZE / 2; backbuf.w = LIGHT_SYMBOL_SIZE; backbuf.h = LIGHT_SYMBOL_SIZE; break; case DIRECTIONAL_LIGHT: if (delta_x <= 0) backbuf.x = handle_xpos; else backbuf.x = startx + pw/2; if (delta_y <= 0) backbuf.y = handle_ypos; else backbuf.y = starty + ph/2; backbuf.x -= LIGHT_SYMBOL_SIZE/2; backbuf.y -= LIGHT_SYMBOL_SIZE/2; backbuf.w = fabs(delta_x) + LIGHT_SYMBOL_SIZE; backbuf.h = fabs(delta_y) + LIGHT_SYMBOL_SIZE; break; case SPOT_LIGHT: backbuf.x = handle_xpos - LIGHT_SYMBOL_SIZE / 2; backbuf.y = handle_ypos - LIGHT_SYMBOL_SIZE / 2; backbuf.w = LIGHT_SYMBOL_SIZE; backbuf.h = LIGHT_SYMBOL_SIZE; break; case NO_LIGHT: break; } /* Save background */ /* =============== */ if ((backbuf.x >= 0) && (backbuf.x <= PREVIEW_WIDTH) && (backbuf.y >= 0) && (backbuf.y <= PREVIEW_HEIGHT)) { /* clip coordinates to preview widget sizes */ if ((backbuf.x + backbuf.w) > PREVIEW_WIDTH) backbuf.w = (PREVIEW_WIDTH - backbuf.x); if ((backbuf.y + backbuf.h) > PREVIEW_HEIGHT) backbuf.h = (PREVIEW_HEIGHT - backbuf.y); backbuf.image = gdk_drawable_get_image (previewarea->window, backbuf.x, backbuf.y, backbuf.w, backbuf.h); } color.red = 0x0; color.green = 0x0; color.blue = 0x0; gdk_gc_set_rgb_bg_color (gc, &color); color.red = 0x0; color.green = 0x4000; color.blue = 0xFFFF; gdk_gc_set_rgb_fg_color (gc, &color); /* draw circle at light position */ switch (mapvals.lightsource[k].type) { case POINT_LIGHT: case SPOT_LIGHT: gdk_draw_arc (previewarea->window, gc, TRUE, handle_xpos - LIGHT_SYMBOL_SIZE / 2, handle_ypos - LIGHT_SYMBOL_SIZE / 2, LIGHT_SYMBOL_SIZE, LIGHT_SYMBOL_SIZE, 0, 360 * 64); break; case DIRECTIONAL_LIGHT: gdk_draw_arc (previewarea->window, gc, TRUE, handle_xpos - LIGHT_SYMBOL_SIZE / 2, handle_ypos - LIGHT_SYMBOL_SIZE / 2, LIGHT_SYMBOL_SIZE, LIGHT_SYMBOL_SIZE, 0, 360 * 64); gdk_draw_line (previewarea->window, gc, handle_xpos, handle_ypos, startx+pw/2 , starty + ph/2); break; case NO_LIGHT: break; } } }
static void draw_handles (void) { gdouble dxpos, dypos; gint startx, starty, pw, ph; GimpVector3 viewpoint; GimpVector3 light_position; gint k = mapvals.light_selected; gfloat length; gfloat delta_x = 0.0; gfloat delta_y = 0.0; /* calculate handle position */ compute_preview_rectangle (&startx, &starty, &pw, &ph); switch (mapvals.lightsource[k].type) { case NO_LIGHT: return; case POINT_LIGHT: case SPOT_LIGHT: /* swap z to reverse light position */ viewpoint = mapvals.viewpoint; viewpoint.z = -viewpoint.z; light_position = mapvals.lightsource[k].position; gimp_vector_3d_to_2d (startx, starty, pw, ph, &dxpos, &dypos, &viewpoint, &light_position); handle_xpos = (gint) (dxpos + 0.5); handle_ypos = (gint) (dypos + 0.5); break; case DIRECTIONAL_LIGHT: light_position.x = light_position.y = 0.5; light_position.z = 0; viewpoint.z = -viewpoint.z; gimp_vector_3d_to_2d (startx, starty, pw, ph, &dxpos, &dypos, &viewpoint, &light_position); length = PREVIEW_HEIGHT / 4; delta_x = mapvals.lightsource[k].direction.x * length; delta_y = mapvals.lightsource[k].direction.y * length; handle_xpos = dxpos + delta_x; handle_ypos = dypos + delta_y; break; } if (mapvals.lightsource[k].type != NO_LIGHT) { GdkColor color; cairo_t *cr; cr = gdk_cairo_create (gtk_widget_get_window (previewarea)); cairo_set_line_width (cr, 1.0); color.red = 0x0; color.green = 0x4000; color.blue = 0xFFFF; gdk_cairo_set_source_color (cr, &color); /* draw circle at light position */ switch (mapvals.lightsource[k].type) { case POINT_LIGHT: case SPOT_LIGHT: cairo_arc (cr, handle_xpos, handle_ypos, LIGHT_SYMBOL_SIZE/2, 0, 2 * M_PI); cairo_fill (cr); break; case DIRECTIONAL_LIGHT: cairo_arc (cr, handle_xpos, handle_ypos, LIGHT_SYMBOL_SIZE/2, 0, 2 * M_PI); cairo_fill (cr); cairo_move_to (cr, handle_xpos, handle_ypos); cairo_line_to (cr, startx + pw/2, starty + ph/2); cairo_stroke (cr); break; case NO_LIGHT: break; } cairo_destroy (cr); } }