forked from bartvdbraak/blender
Fix: The radial control would fail, in sculpt mode, to set size if object-space sizing was enabled.
This was caused because a small part of sculpt's radial control code did not make it into the new version. The old code would set a new object-space size by scaling it proportional to how much the new screen-space size was changed. The solution I implement here is to do the same scaling inside the RNA callbacks. This way, users of those properties do not have to worry about inconsistency. I added a comment warning that brush_set_size, brush_set_unified_size, brush_unprojected_radius, and brush_set_unprojected_radius do not guarantee consistency because it is not always possible to precisely know what the new unprojected radius is in all contexts where you might set the size. I would implement the consistency check at the lower level (in those listed functions) but at this time I think it needs to be looked at to make sure that won't cause problems. In addition, I am not sure that scaling by the ratio of change is strictly correct in all cases. In any case, this at least fixes the immediate problem.
This commit is contained in:
parent
8246f94317
commit
7154b424e9
@ -1251,6 +1251,19 @@ static short unified_settings(Brush *brush)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// XXX: be careful about setting size and unprojected radius
|
||||||
|
// because they depend on one another
|
||||||
|
// these functions do not set the other corresponding value
|
||||||
|
// this can lead to odd behavior if size and unprojected
|
||||||
|
// radius become inconsistent.
|
||||||
|
// the biggest problem is that it isn't possible to change
|
||||||
|
// unprojected radius because a view context is not
|
||||||
|
// available. my ussual solution to this is to use the
|
||||||
|
// ratio of change of the size to change the unprojected
|
||||||
|
// radius. Not completely convinced that is correct.
|
||||||
|
// In anycase, a better solution is needed to prevent
|
||||||
|
// inconsistency.
|
||||||
|
|
||||||
static void set_unified_size(Brush *brush, int value)
|
static void set_unified_size(Brush *brush, int value)
|
||||||
{
|
{
|
||||||
Scene *sce;
|
Scene *sce;
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include "RNA_define.h"
|
#include "RNA_define.h"
|
||||||
|
|
||||||
@ -166,6 +167,13 @@ static void rna_Brush_icon_update(Main *bmain, Scene *scene, PointerRNA *ptr)
|
|||||||
static void rna_Brush_set_size(PointerRNA *ptr, int value)
|
static void rna_Brush_set_size(PointerRNA *ptr, int value)
|
||||||
{
|
{
|
||||||
Brush* me = (Brush*)(ptr->data);
|
Brush* me = (Brush*)(ptr->data);
|
||||||
|
|
||||||
|
// set unprojected radius, so they remain consistent
|
||||||
|
double size= (double)brush_size(me);
|
||||||
|
assert(size != 0); // paranoia: sanity checks during load and rna make sure we don't divide by zero here
|
||||||
|
float unprojected_radius= (float)(brush_unprojected_radius(me) * (double)value / size);
|
||||||
|
brush_set_unprojected_radius(me, unprojected_radius);
|
||||||
|
|
||||||
brush_set_size(me, value);
|
brush_set_size(me, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,6 +222,13 @@ static int rna_Brush_get_use_alpha_pressure(PointerRNA *ptr)
|
|||||||
static void rna_Brush_set_unprojected_radius(PointerRNA *ptr, float value)
|
static void rna_Brush_set_unprojected_radius(PointerRNA *ptr, float value)
|
||||||
{
|
{
|
||||||
Brush* me = (Brush*)(ptr->data);
|
Brush* me = (Brush*)(ptr->data);
|
||||||
|
|
||||||
|
// set size, so they remain consistent
|
||||||
|
double unprojected_radius= (double)brush_unprojected_radius(me);
|
||||||
|
assert(unprojected_radius != 0); // paranoia: sanity checks during load and rna make sure we don't divide by zero here
|
||||||
|
int size= (int)((double)brush_size(me) * (double)value / unprojected_radius);
|
||||||
|
brush_set_size(me, size);
|
||||||
|
|
||||||
brush_set_unprojected_radius(me, value);
|
brush_set_unprojected_radius(me, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user