[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29232] branches/soc-2010-jwilkins: * disabling symmetry feathering and clipping.
Jason Wilkins
Jason.A.Wilkins at gmail.com
Sat Jun 5 05:14:35 CEST 2010
Revision: 29232
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29232
Author: jwilkins
Date: 2010-06-05 05:14:34 +0200 (Sat, 05 Jun 2010)
Log Message:
-----------
* disabling symmetry feathering and clipping. more research is needed before I can make it work right, dropping it until later
* "Lock Brush Size" takes the current brush size, and keeps it the same size no matter how the object is viewed.
* Zooming in and out dynamically resizes the brush retical. This also lays the foundation for a fancy brush retical ala Sculptris
* commented out a couple of unused fields from struct Sculpt. This struct adds so little, should be unified with Paint later
* made the hard limit for brush size 1-2000, to allow it to grow to larger than the screen when using lock size. UI soft limit is still 1-200
Modified Paths:
--------------
branches/soc-2010-jwilkins/release/scripts/ui/space_view3d_toolbar.py
branches/soc-2010-jwilkins/source/blender/blenkernel/BKE_paint.h
branches/soc-2010-jwilkins/source/blender/blenloader/intern/readfile.c
branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c
branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c
branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt_intern.h
branches/soc-2010-jwilkins/source/blender/makesdna/DNA_brush_types.h
branches/soc-2010-jwilkins/source/blender/makesdna/DNA_scene_types.h
branches/soc-2010-jwilkins/source/blender/makesrna/intern/rna_brush.c
Modified: branches/soc-2010-jwilkins/release/scripts/ui/space_view3d_toolbar.py
===================================================================
--- branches/soc-2010-jwilkins/release/scripts/ui/space_view3d_toolbar.py 2010-06-05 00:21:26 UTC (rev 29231)
+++ branches/soc-2010-jwilkins/release/scripts/ui/space_view3d_toolbar.py 2010-06-05 03:14:34 UTC (rev 29232)
@@ -547,7 +547,11 @@
col.separator()
row = col.row(align=True)
+ row.prop(brush, "lock_brush_size")
+
+ row = col.row(align=True)
row.prop(brush, "size", slider=True)
+ row.active = not brush.lock_brush_size
if brush.sculpt_tool != 'GRAB':
row.prop(brush, "use_size_pressure", toggle=True, text="")
@@ -815,7 +819,7 @@
col.prop(sculpt, "symmetry_x", text="X")
col.prop(sculpt, "symmetry_y", text="Y")
col.prop(sculpt, "symmetry_z", text="Z")
- col.prop(sculpt, "use_symmetry_feather", text="Feather")
+ #col.prop(sculpt, "use_symmetry_feather", text="Feather")
col = split.column()
col.label(text="Lock:")
Modified: branches/soc-2010-jwilkins/source/blender/blenkernel/BKE_paint.h
===================================================================
--- branches/soc-2010-jwilkins/source/blender/blenkernel/BKE_paint.h 2010-06-05 00:21:26 UTC (rev 29231)
+++ branches/soc-2010-jwilkins/source/blender/blenkernel/BKE_paint.h 2010-06-05 03:14:34 UTC (rev 29232)
@@ -74,7 +74,7 @@
struct Scene *scene; //Mio
struct EditMesh *em; //Mio
-
+
/* Mesh connectivity */
struct ListBase *fmap;
Modified: branches/soc-2010-jwilkins/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/blenloader/intern/readfile.c 2010-06-05 00:21:26 UTC (rev 29231)
+++ branches/soc-2010-jwilkins/source/blender/blenloader/intern/readfile.c 2010-06-05 03:14:34 UTC (rev 29232)
@@ -10914,8 +10914,8 @@
for (brush= main->brush.first; brush; brush= brush->id.next) {
if(brush->detail == 0.0f)
brush->detail = 0.25f;
- if (brush->smoothness == 0.0f)
- brush->smoothness = 0.25f;
+ if (brush->smoothness == 0.0f)
+ brush->smoothness = 0.25f;
}
}
Modified: branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c 2010-06-05 00:21:26 UTC (rev 29231)
+++ branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/paint_stroke.c 2010-06-05 03:14:34 UTC (rev 29232)
@@ -49,6 +49,7 @@
#include "ED_view3d.h"
#include "paint_intern.h"
+#include "sculpt_intern.h" // XXX, for expedience in getting this working, refactor later (or this just shows that this needs unification)
#include <float.h>
#include <math.h>
@@ -96,14 +97,107 @@
glDisable(GL_LINE_SMOOTH);
}
+/* Convert a point in model coordinates to 2D screen coordinates. */
+// XXX duplicated from sculpt.c, deal with this later.
+static void projectf(bglMats *mats, const float v[3], float p[2])
+{
+ double ux, uy, uz;
+
+ gluProject(v[0],v[1],v[2], mats->modelview, mats->projection,
+ (GLint *)mats->viewport, &ux, &uy, &uz);
+ p[0]= ux;
+ p[1]= uy;
+}
+
+static int project_brush_radius(RegionView3D* rv3d, float radius, float location[3], bglMats* mats)
+{
+ float view[3], nonortho[3], ortho[3], offset[3], p1[2], p2[2];
+
+ viewvector(rv3d, location, view);
+
+ // create a vector that is not orthogonal to view
+
+ if (fabsf(view[0]) < 0.1) {
+ nonortho[0] = view[0] + 1;
+ nonortho[1] = view[1];
+ nonortho[2] = view[2];
+ }
+ else if (fabsf(view[1]) < 0.1) {
+ nonortho[0] = view[0];
+ nonortho[1] = view[1] + 1;
+ nonortho[2] = view[2];
+ }
+ else {
+ nonortho[0] = view[0];
+ nonortho[1] = view[1];
+ nonortho[2] = view[2] + 1;
+ }
+
+ // get a vector in the plane of the view
+ cross_v3_v3v3(ortho, nonortho, view);
+ normalize_v3(ortho);
+
+ // make a point on the surface of the brush tagent to the view
+ mul_v3_fl(ortho, radius);
+ add_v3_v3v3(offset, location, ortho);
+
+ // project the center of the brush, and the tagent point to the view onto the screen
+ projectf(mats, location, p1);
+ projectf(mats, offset, p2);
+
+ // the distance between these points is the size of the projected brush in pixels
+ return len_v2v2(p1, p2);
+}
+
+static void sculpt_set_brush_radius(Brush *brush, int value)
+{
+ PointerRNA brushptr;
+ PropertyRNA *size;
+
+ /* brush.size = value */
+
+ RNA_id_pointer_create(&brush->id, &brushptr);
+
+ size= RNA_struct_find_property(&brushptr, "size");
+ RNA_property_int_set(&brushptr, size, value);
+}
+
+static int sculpt_get_brush_radius(bContext* C, int mouse[2])
+{
+ int radius;
+ struct PaintStroke *stroke;
+ float location[3], window[2];
+
+ stroke = paint_stroke_new(C, NULL, NULL, NULL, NULL);
+
+ window[0] = mouse[0] + stroke->vc.ar->winrct.xmin;
+ window[1] = mouse[1] + stroke->vc.ar->winrct.ymin;
+
+ if (stroke->vc.obact->sculpt->pbvh && sculpt_stroke_get_location(C, stroke, location, window)) {
+ radius = project_brush_radius(stroke->vc.rv3d, stroke->brush->unprojected_radius, location, &stroke->mats);
+ }
+ else {
+ Sculpt* sd = CTX_data_tool_settings(C)->sculpt;
+ Brush* brush = paint_brush(&sd->paint);
+
+ radius = brush->size;
+ }
+
+ paint_stroke_free(stroke);
+
+ return radius;
+}
+
static void paint_draw_cursor(bContext *C, int x, int y, void *customdata)
{
+ int mouse[3] = { x, y };
Paint *paint = paint_get_active(CTX_data_scene(C));
Brush *brush = paint_brush(paint);
- if(!(paint->flags & PAINT_SHOW_BRUSH))
- return;
+ if(!(paint->flags & PAINT_SHOW_BRUSH)) return;
+ if (brush->flag & BRUSH_LOCK_SIZE) sculpt_set_brush_radius(brush, sculpt_get_brush_radius(C, mouse));
+
glColor4ubv(paint_get_active(CTX_data_scene(C))->paint_cursor_col);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
Modified: branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c 2010-06-05 00:21:26 UTC (rev 29231)
+++ branches/soc-2010-jwilkins/source/blender/editors/sculpt_paint/sculpt.c 2010-06-05 03:14:34 UTC (rev 29232)
@@ -541,51 +541,62 @@
float location[3];
float dist;
+
+ //float true_location[3];
+ //int symmetry;
+ //int symmetry_pass;
} SculptBrushTest;
static void sculpt_brush_test_init(SculptSession *ss, SculptBrushTest *test)
{
test->radius_squared= ss->cache->radius*ss->cache->radius;
copy_v3_v3(test->location, ss->cache->location);
+
+ //copy_v3_v3(test->true_location, ss->cache->true_location);
+ //test->symmetry = ss->cache->symmetry;
+ //test->symmetry_pass = ss->cache->symmetry_pass;
}
-//static int sculpt_brush_test_clip(SculptBrushTest* test, float co[3])
-//{
-// if (test->symmetry) {
-// int i;
-//
-// for (i = 0; i < 3; i++) {
-// if (test->symmetry & (1<<i)) {
-// if (test->symmetry_pass & (1<<i)) {
-// if (test->true_location[i] > 0) {
-// if (co[i] > 0) return 0;
-// }
-// else if (test->true_location[i] < 0) {
-// if (co[i] < 0) return 0;
-// }
-// }
-// else {
-// if (test->true_location[i] > 0) {
-// if (co[i] < 0) return 0;
-// }
-// else if (test->true_location[i] < 0) {
-// if (co[i] > 0) return 0;
-// }
-// }
-// }
-// }
-// }
-//
-// return 1;
-//}
+static int sculpt_brush_test_clip(SculptBrushTest* test, float co[3])
+{
+ //if (test->symmetry) {
+ // int i;
+ // for (i = 0; i < 3; i++) {
+ // if (test->symmetry_pass & (1<<i)) {
+ // if (test->true_location[i] >= 0) {
+ // if (co[i] >= 0) return 0;
+ // }
+ // else if (test->true_location[i] < 0) {
+ // if (co[i] < 0) return 0;
+ // }
+ // }
+ // else {
+ // if (test->true_location[i] >= 0) {
+ // if (co[i] < 0) return 0;
+ // }
+ // else if (test->true_location[i] < 0) {
+ // if (co[i] >= 0) return 0;
+ // }
+ // }
+ // }
+ //}
+
+ return 1;
+}
+
static int sculpt_brush_test(SculptBrushTest *test, float co[3])
{
- float distsq = len_squared_v3v3(co, test->location);
+ if (sculpt_brush_test_clip(test, co)) {
+ float distsq = len_squared_v3v3(co, test->location);
- if(distsq < test->radius_squared) {
- test->dist = sqrt(distsq);
- return 1;
+ if(distsq < test->radius_squared) {
+ test->dist = sqrt(distsq);
+ return 1;
+ }
+ else {
+ return 0;
+ }
}
else {
return 0;
@@ -594,11 +605,16 @@
static int sculpt_brush_test_sq(SculptBrushTest *test, float co[3])
{
- float distsq = len_squared_v3v3(co, test->location);
+ if (sculpt_brush_test_clip(test, co)) {
+ float distsq = len_squared_v3v3(co, test->location);
- if(distsq < test->radius_squared) {
- test->dist = distsq;
- return 1;
+ if(distsq < test->radius_squared) {
+ test->dist = distsq;
+ return 1;
+ }
+ else {
+ return 0;
+ }
}
else {
return 0;
@@ -607,7 +623,12 @@
static int sculpt_brush_test_fast(SculptBrushTest *test, float co[3])
{
- return len_squared_v3v3(co, test->location) < test->radius_squared;
+ if (sculpt_brush_test_clip(test, co)) {
+ return len_squared_v3v3(co, test->location) < test->radius_squared;
+ }
+ else {
+ return 0;
+ }
}
/* area of overlap of two circles of radius 1 seperated by d units from their centers */
@@ -1090,16 +1111,16 @@
calc_area_normal(sd, ss, area_normal, nodes, totnode);
/* offset with as much as possible factored in already */
- offset[0]= area_normal[0]*ss->cache->radius*ss->cache->scale[0]*bstrength;
- offset[1]= area_normal[1]*ss->cache->radius*ss->cache->scale[1]*bstrength;
- offset[2]= area_normal[2]*ss->cache->radius*ss->cache->scale[2]*bstrength;
+ mul_v3_v3fl(offset, area_normal, ss->cache->radius);
+ mul_v3_v3(offset, ss->cache->scale);
+ mul_v3_fl(offset, bstrength);
/* threaded loop over nodes */
//#pragma omp parallel for private(n) schedule(static)
for(n=0; n<totnode; n++) {
PBVHVertexIter vd;
SculptBrushTest test;
-
+
sculpt_undo_push_node(ss, nodes[n]);
sculpt_brush_test_init(ss, &test);
@@ -2035,15 +2056,15 @@
case SCULPT_TOOL_CLAY:
do_clay_brush(sd, ss, nodes, totnode);
break;
- case SCULPT_TOOL_FILL:
- do_fill_brush(sd, ss, nodes, totnode);
- break;
- case SCULPT_TOOL_SCRAPE:
- do_scrape_brush(sd, ss, nodes, totnode);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list