Patch from kgeogeo:

* Change coordinates of stencil to float, helps with precision during
property manuipulations
* Expose stencil properties to RNA.
This commit is contained in:
Antony Riakiotakis
2013-04-05 11:45:33 +00:00
parent b31ca01357
commit 81621eb696
3 changed files with 34 additions and 20 deletions

View File

@@ -454,9 +454,9 @@ STENCIL_ROTATE
} StencilControlMode;
typedef struct {
int init_mouse[2];
int init_spos[2];
int init_sdim[2];
float init_mouse[2];
float init_spos[2];
float init_sdim[2];
float init_rot;
float init_angle;
float lenorig;
@@ -468,15 +468,16 @@ static int stencil_control_invoke(bContext *C, wmOperator *op, const wmEvent *ev
{
Paint *paint = paint_get_active_from_context(C);
Brush *br = paint_brush(paint);
int mdiff[2];
float mdiff[2];
float mvalf[2] = {event->mval[0], event->mval[1]};
StencilControlData *scd = MEM_mallocN(sizeof(StencilControlData), "stencil_control");
copy_v2_v2_int(scd->init_mouse, event->mval);
copy_v2_v2_int(scd->init_sdim, br->stencil_dimension);
copy_v2_v2_int(scd->init_spos, br->stencil_pos);
sub_v2_v2v2_int(mdiff, event->mval, br->stencil_pos);
scd->lenorig = sqrtf(mdiff[0] * mdiff[0] + mdiff[1] * mdiff[1]);
copy_v2_v2(scd->init_mouse, mvalf);
copy_v2_v2(scd->init_sdim, br->stencil_dimension);
copy_v2_v2(scd->init_spos, br->stencil_pos);
sub_v2_v2v2(mdiff, mvalf, br->stencil_pos);
scd->lenorig = len_v2(mdiff);
scd->br = br;
scd->init_rot = br->mtex.rot;
scd->init_angle = atan2(mdiff[1], mdiff[0]);
@@ -494,8 +495,8 @@ static int stencil_control_cancel(bContext *UNUSED(C), wmOperator *op)
StencilControlData *scd = op->customdata;
Brush *br = scd->br;
copy_v2_v2_int(br->stencil_dimension, scd->init_sdim);
copy_v2_v2_int(br->stencil_pos, scd->init_spos);
copy_v2_v2(br->stencil_dimension, scd->init_sdim);
copy_v2_v2(br->stencil_pos, scd->init_spos);
br->mtex.rot = scd->init_rot;
MEM_freeN(op->customdata);
return OPERATOR_CANCELLED;
@@ -508,28 +509,29 @@ static int stencil_control_modal(bContext *C, wmOperator *op, const wmEvent *eve
switch (event->type) {
case MOUSEMOVE:
{
int mdiff[2];
float mdiff[2];
float mvalf[2] = {event->mval[0], event->mval[1]};
switch (scd->mode) {
case STENCIL_TRANSLATE:
sub_v2_v2v2_int(mdiff, event->mval, scd->init_mouse);
add_v2_v2v2_int(scd->br->stencil_pos, scd->init_spos,
sub_v2_v2v2(mdiff, mvalf, scd->init_mouse);
add_v2_v2v2(scd->br->stencil_pos, scd->init_spos,
mdiff);
break;
case STENCIL_SCALE:
{
float len, factor;
sub_v2_v2v2_int(mdiff, event->mval, scd->br->stencil_pos);
len = sqrtf(mdiff[0] * mdiff[0] + mdiff[1] * mdiff[1]);
sub_v2_v2v2(mdiff, mvalf, scd->br->stencil_pos);
len = len_v2(mdiff);
factor = len / scd->lenorig;
mdiff[0] = factor * scd->init_sdim[0];
mdiff[1] = factor * scd->init_sdim[1];
copy_v2_v2_int(scd->br->stencil_dimension, mdiff);
copy_v2_v2(scd->br->stencil_dimension, mdiff);
break;
}
case STENCIL_ROTATE:
{
float angle;
sub_v2_v2v2_int(mdiff, event->mval, scd->br->stencil_pos);
sub_v2_v2v2(mdiff, mvalf, scd->br->stencil_pos);
angle = atan2(mdiff[1], mdiff[0]);
angle = scd->init_rot + angle - scd->init_angle;
if (angle < 0.0f)

View File

@@ -106,8 +106,8 @@ typedef struct Brush {
float add_col[3];
float sub_col[3];
int stencil_pos[2];
int stencil_dimension[2];
float stencil_pos[2];
float stencil_dimension[2];
} Brush;
/* Brush.flag */

View File

@@ -793,6 +793,18 @@ static void rna_def_brush(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Autosmooth", "Amount of smoothing to automatically apply to each stroke");
RNA_def_property_update(prop, 0, "rna_Brush_update");
prop = RNA_def_property(srna, "stencil_pos", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "stencil_pos");
RNA_def_property_array(prop, 2);
RNA_def_property_ui_text(prop, "Stencil Position", "Position of stencil in viewport");
RNA_def_property_update(prop, 0, "rna_Brush_update");
prop = RNA_def_property(srna, "stencil_dimension", PROP_FLOAT, PROP_DISTANCE);
RNA_def_property_float_sdna(prop, NULL, "stencil_dimension");
RNA_def_property_array(prop, 2);
RNA_def_property_ui_text(prop, "Stencil Dimensions", "Dimensions of stencil in viewport");
RNA_def_property_update(prop, 0, "rna_Brush_update");
/* flag */
prop = RNA_def_property(srna, "use_airbrush", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", BRUSH_AIRBRUSH);