More work on 1-point perspective Magic tool
This commit is contained in:
parent
940132c30f
commit
99e129005e
1 changed files with 72 additions and 11 deletions
|
|
@ -1,8 +1,11 @@
|
|||
/* n_pt_persp.c
|
||||
|
||||
1-, 2-, and 3-point perspective line-drawing tools.
|
||||
(Work-in-progress; only handles 1-point at the moment)
|
||||
|
||||
December 12, 2023 - December 14, 2023
|
||||
by Bill Kendrick <bill@newbreedsoftware.com>
|
||||
|
||||
December 12, 2023 - December 15, 2023
|
||||
*/
|
||||
|
||||
|
||||
|
|
@ -282,15 +285,35 @@ void n_pt_persp_drag(magic_api * api, int which,
|
|||
int old_x, int old_y, int x, int y,
|
||||
SDL_Rect * update_rect)
|
||||
{
|
||||
/* Draw the line (preview) */
|
||||
n_pt_persp_work(api, which, canvas, x, y, update_rect, 1);
|
||||
|
||||
api->line((void *) api, which, canvas, NULL,
|
||||
0, y, canvas->w - 1, y, 6,
|
||||
n_pt_persp_line_xor_callback);
|
||||
/* Show some guides */
|
||||
if (which == TOOL_1PT_DRAW) {
|
||||
/* 1-point perspective */
|
||||
|
||||
api->line((void *) api, which, canvas, NULL,
|
||||
x, 0, x, canvas->h - 1, 6,
|
||||
n_pt_persp_line_xor_callback);
|
||||
/* Horizontal line (horizon) */
|
||||
if (y != a1_pt_y) {
|
||||
api->line((void *) api, which, canvas, NULL,
|
||||
0, a1_pt_y, canvas->w - 1, a1_pt_y, 12,
|
||||
n_pt_persp_line_xor_callback);
|
||||
}
|
||||
|
||||
/* Horizontal line (from cursor) */
|
||||
api->line((void *) api, which, canvas, NULL,
|
||||
0, y, canvas->w - 1, y, 6,
|
||||
n_pt_persp_line_xor_callback);
|
||||
|
||||
/* Vertical line */
|
||||
api->line((void *) api, which, canvas, NULL,
|
||||
x, 0, x, canvas->h - 1, 6,
|
||||
n_pt_persp_line_xor_callback);
|
||||
|
||||
/* Diagonal line to the vanishing point */
|
||||
api->line((void *) api, which, canvas, NULL,
|
||||
x, y, a1_pt_x, a1_pt_y, 12,
|
||||
n_pt_persp_line_xor_callback);
|
||||
}
|
||||
}
|
||||
|
||||
#define SNAP 10
|
||||
|
|
@ -301,7 +324,7 @@ void n_pt_persp_work(magic_api * api, int which,
|
|||
{
|
||||
int portion_x1, portion_y1, portion_x2, portion_y2, portion_w, portion_h;
|
||||
int x1, y1, x2, y2;
|
||||
float slope;
|
||||
float slope, slope2;
|
||||
SDL_Rect area_rect;
|
||||
|
||||
if (n_pt_persp_snapshot == NULL)
|
||||
|
|
@ -312,6 +335,8 @@ void n_pt_persp_work(magic_api * api, int which,
|
|||
x1 = y1 = x2 = y2 = 0;
|
||||
|
||||
if (which == TOOL_1PT_DRAW) {
|
||||
/* 1-point perspective */
|
||||
|
||||
x1 = line_start_x;
|
||||
y1 = line_start_y;
|
||||
|
||||
|
|
@ -325,15 +350,36 @@ void n_pt_persp_work(magic_api * api, int which,
|
|||
y2 = y1;
|
||||
} else {
|
||||
/* Diagonal */
|
||||
|
||||
slope = ((float) y1 - (float) a1_pt_y) / ((float) x1 - (float) a1_pt_x);
|
||||
// FIXME printf("Slope of %d - %d / %d - %d = %.5f\n", y1, a1_pt_y, x1, a1_pt_x, slope);
|
||||
x2 = x;
|
||||
y2 = line_start_y + (slope * (x - line_start_x));
|
||||
|
||||
/* Don't go past our cursor's Y */
|
||||
if ((y < line_start_y && y2 < y) ||
|
||||
(y > line_start_y && y2 > y)) {
|
||||
if (slope != 0.0) {
|
||||
y2 = y;
|
||||
x2 = ((y - line_start_y) / slope) + line_start_x;
|
||||
}
|
||||
}
|
||||
|
||||
/* Snap to horizontal if cursor is on the wrong side */
|
||||
slope2 = ((float) line_start_y - (float) y) / ((float) line_start_x - (float) x);
|
||||
if ((slope2 > 0.00 && slope < 0.00) ||
|
||||
(slope2 < 0.00 && slope > 0.00)) {
|
||||
x2 = x;
|
||||
y2 = y1;
|
||||
}
|
||||
}
|
||||
} else if (which == TOOL_2PT_DRAW) {
|
||||
/* 2-point perspective */
|
||||
|
||||
/* FIXME */
|
||||
return;
|
||||
} else if (which == TOOL_3PT_DRAW) {
|
||||
/* 3-point perspective */
|
||||
|
||||
/* FIXME */
|
||||
return;
|
||||
}
|
||||
|
|
@ -369,7 +415,11 @@ void n_pt_persp_work(magic_api * api, int which,
|
|||
|
||||
SDL_BlitSurface(n_pt_persp_snapshot, NULL /* FIXME &area_rect */, canvas, NULL /* FIXME &area_rect */);
|
||||
|
||||
/* Draw the line */
|
||||
|
||||
if (xor) {
|
||||
/* Still moving; use XOR */
|
||||
|
||||
api->line((void *) api, which, canvas, NULL,
|
||||
x1, y1, x2, y2, 3,
|
||||
n_pt_persp_line_xor_callback);
|
||||
|
|
@ -379,6 +429,8 @@ void n_pt_persp_work(magic_api * api, int which,
|
|||
update_rect->w = portion_w + 1;
|
||||
update_rect->h = portion_h + 1;
|
||||
} else {
|
||||
/* Released; draw the line for real */
|
||||
|
||||
api->line((void *) api, which, canvas, NULL,
|
||||
x1, y1, x2, y2, 1,
|
||||
n_pt_persp_line_callback);
|
||||
|
|
@ -400,12 +452,11 @@ void n_pt_persp_work(magic_api * api, int which,
|
|||
}
|
||||
|
||||
|
||||
/* Affect the canvas on release: */
|
||||
|
||||
void n_pt_persp_release(magic_api * api, int which,
|
||||
SDL_Surface * canvas, SDL_Surface * snapshot, int x, int y,
|
||||
SDL_Rect * update_rect)
|
||||
{
|
||||
/* Draw the line (for real) */
|
||||
n_pt_persp_work(api, which, canvas, x, y, update_rect, 0);
|
||||
}
|
||||
|
||||
|
|
@ -482,6 +533,8 @@ void n_pt_persp_draw_points(magic_api * api, int which, SDL_Surface * canvas) {
|
|||
float slope;
|
||||
|
||||
if (which == TOOL_1PT_SELECT) {
|
||||
/* 1-point perspective */
|
||||
|
||||
n_pt_persp_draw_one_point(api, canvas, a1_pt_x, a1_pt_y, 0);
|
||||
|
||||
for (l = 0; l < 5; l++) {
|
||||
|
|
@ -521,13 +574,21 @@ void n_pt_persp_draw_points(magic_api * api, int which, SDL_Surface * canvas) {
|
|||
}
|
||||
}
|
||||
} else if (which == TOOL_2PT_SELECT) {
|
||||
/* 2-point perspective */
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
n_pt_persp_draw_one_point(api, canvas, a2_pt_x[i], a2_pt_y[i], i);
|
||||
}
|
||||
|
||||
/* FIXME: Draw a grid */
|
||||
} else if (which == TOOL_3PT_SELECT) {
|
||||
/* 2-point perspective */
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
n_pt_persp_draw_one_point(api, canvas, a3_pt_x[i], a3_pt_y[i], i);
|
||||
}
|
||||
|
||||
/* FIXME: Draw a grid */
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue