> Painting sometimes is slower than before my changes, probably because of too 
> many RNA queries?
I'd suggest to profile that and see if RNA is indeed the problem; if
so you could do something similar to what sculpt mode does and create
a cache for values. (Of course, if multiple modes have such caches you
might be able to come up with a generic solution between them, or at
least a partially-shared cache.)

> The stroke system didn't distinguish between different spaces and only works 
> with 3D Space. Now I added a stub condition to check if one is painting in 2D 
> mode. There need to be made some changes to stroke->mats maybe but for now I 
> couldn't find a place in paint_stroke.c where these matrices are actually 
> used. This problem requires more research.
Hmm, mats indeed is not used. Probably this was either used
originally, and when something changed that field was forgotten about,
or I added the mats field, and never used it at all :) Either way, you
can remove it if you don't end up needing it for your other changes.

-Nicholas

>
> Modified Paths:
> --------------
>    branches/soc-2010-kwk/source/blender/editors/sculpt_paint/paint_image.c
>    branches/soc-2010-kwk/source/blender/editors/sculpt_paint/paint_stroke.c
>
> Modified: 
> branches/soc-2010-kwk/source/blender/editors/sculpt_paint/paint_image.c
> ===================================================================
> --- branches/soc-2010-kwk/source/blender/editors/sculpt_paint/paint_image.c   
>   2010-06-18 05:18:46 UTC (rev 29538)
> +++ branches/soc-2010-kwk/source/blender/editors/sculpt_paint/paint_image.c   
>   2010-06-18 08:04:15 UTC (rev 29539)
> @@ -4514,7 +4514,7 @@
>
>        int first;
>        int prevmouse[2];
> -       float prev_pressure; /* need this since we dont get tablet events for 
> pressure change */
> +//     float prev_pressure; /* need this since we dont get tablet events for 
> pressure change */
>        int brush_size_orig;
>        double starttime;
>
> @@ -4616,7 +4616,7 @@
>                ps->do_mask_normal = 0; /* no need to do blending */
>  }
>
> -static int texture_paint_init(bContext *C, wmOperator *op)
> +static int texture_paint_init(bContext *C, wmOperator *op, struct 
> PaintStroke *stroke)
>  {
>        Scene *scene= CTX_data_scene(C);
>        ToolSettings *settings= scene->toolsettings;
> @@ -4624,7 +4624,8 @@
>        PaintOperation *pop= MEM_callocN(sizeof(PaintOperation), 
> "PaintOperation"); /* caller frees */
>
>        pop->first= 1;
> -       op->customdata= pop;
> +       paint_stroke_set_mode_data(stroke, pop);
> +//     op->customdata= pop;
>
>        /* initialize from context */
>        if(CTX_wm_region_view3d(C)) {
> @@ -4700,9 +4701,9 @@
>        return 1;
>  }
>
> -static void paint_apply(bContext *C, wmOperator *op, PointerRNA *itemptr)
> +static void paint_apply(bContext *C, struct PaintStroke *stroke, PointerRNA 
> *itemptr)
>  {
> -       PaintOperation *pop= op->customdata;
> +       PaintOperation *pop= paint_stroke_mode_data(stroke);
>        float time, mousef[2];
>        float pressure;
>        int mouse[2], redraw;
> @@ -4737,11 +4738,110 @@
>        pop->first= 0;
>  }
>
> -static void paint_exit(bContext *C, wmOperator *op)
> +//static void paint_exit(bContext *C, wmOperator *op)
> +//{
> +//     Scene *scene= CTX_data_scene(C);
> +//     ToolSettings *settings= scene->toolsettings;
> +//     PaintOperation *pop= op->customdata;
> +//
> +//     if(pop->timer)
> +//             WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), 
> pop->timer);
> +//
> +//     settings->imapaint.flag &= ~IMAGEPAINT_DRAWING;
> +//     imapaint_canvas_free(&pop->s);
> +//     brush_painter_free(pop->painter);
> +//
> +//     if(pop->mode == PAINT_MODE_3D_PROJECT) {
> +//             pop->ps.brush->size = pop->brush_size_orig;
> +//             project_paint_end(&pop->ps);
> +//     }
> +//
> +//     paint_redraw(C, &pop->s, 1);
> +//     undo_paint_push_end(UNDO_PAINT_IMAGE);
> +//
> +//     if(pop->s.warnmultifile)
> +//             BKE_reportf(op->reports, RPT_WARNING, "Image requires 4 color 
> channels to paint: %s", pop->s.warnmultifile);
> +//     if(pop->s.warnpackedfile)
> +//             BKE_reportf(op->reports, RPT_WARNING, "Packed MultiLayer 
> files cannot be painted: %s", pop->s.warnpackedfile);
> +//
> +//     MEM_freeN(pop);
> +//}
> +
> +// XXX: (kwk) comment back in when ready.
> +//static int paint_exec(bContext *C, wmOperator *op)
> +//{
> +//     struct PaintStroke *stroke = op->customdata;
> +//
> +//     if(!texture_paint_init(C, op, stroke)) {
> +//             MEM_freeN(op->customdata);
> +//             return OPERATOR_CANCELLED;
> +//     }
> +//
> +//     RNA_BEGIN(op->ptr, itemptr, "stroke") {
> +//             paint_apply(C, stroke, &itemptr);
> +//     }
> +//     RNA_END;
> +//
> +//     paint_exit(C, op);
> +//
> +//     return OPERATOR_FINISHED;
> +//}
> +
> +static void paint_stroke_update_step(bContext *C, struct PaintStroke 
> *stroke, PointerRNA *itemptr)
>  {
> +       ARegion *ar= CTX_wm_region(C);
> +       PaintOperation *pop= paint_stroke_mode_data(stroke);
> +       float pressure, mousef[2];
> +       double time;
> +       int mouse[2];
> +       int flip; // 1: Eraser, 0: Normal pen
> +
> +       // XXX +1 matches brush location better but
> +       // still not exact, find out why and fix ..
> +//     mouse[0]= event->x - ar->winrct.xmin + 1;
> +//     mouse[1]= event->y - ar->winrct.ymin + 1;
> +       // XXX: (kwk) for now we use the location from paint stroke but it 
> probably needs to be fixed.
> +       RNA_float_get_array(itemptr, "location", mousef);
> +       mouse[0] = (int) mousef[0] - ar->winrct.xmin + 1;
> +       mouse[1] = (int) mousef[1] - ar->winrct.ymin + 1;
> +
> +       time= PIL_check_seconds_timer();
> +
> +       pop->s.blend= pop->s.brush->blend;
> +
> +       // XXX: (kwk) cache these values when everything works or get rid of 
> them.
> +       flip =  RNA_boolean_get(itemptr, "flip");
> +       pressure =  RNA_float_get(itemptr, "pressure");
> +
> +       if (flip) {
> +               pop->s.blend = IMB_BLEND_ERASE_ALPHA;
> +       }
> +
> +       if(pop->first) {
> +               pop->prevmouse[0]= mouse[0];
> +               pop->prevmouse[1]= mouse[1];
> +               pop->starttime= time;
> +
> +               /* special exception here for too high pressure values on 
> first touch in
> +                  windows for some tablets, then we just skip first touch .. 
>  */
> +               if ((pop->s.brush->flag & 
> (BRUSH_ALPHA_PRESSURE|BRUSH_SIZE_PRESSURE|BRUSH_SPACING_PRESSURE)) && 
> (pressure >= 0.99f))
> +                       return;
> +       }
> +
> +       // XXX: (kwk) ok to add time to existing RNA stroke collection from 
> paint_stroke.c?
> +       RNA_float_set(itemptr, "time", (float)(time - pop->starttime));
> +
> +       /* apply */
> +//     paint_apply(C, op, &itemptr);
> +       paint_apply(C, stroke, itemptr);
> +}
> +
> +// XXX: (kwk) mainly copied from paint_exit(). Needs to be modified!
> +static void paint_stroke_done(bContext *C, struct PaintStroke *stroke)
> +{
>        Scene *scene= CTX_data_scene(C);
>        ToolSettings *settings= scene->toolsettings;
> -       PaintOperation *pop= op->customdata;
> +       PaintOperation *pop= paint_stroke_mode_data(stroke);
>
>        if(pop->timer)
>                WM_event_remove_timer(CTX_wm_manager(C), CTX_wm_window(C), 
> pop->timer);
> @@ -4755,102 +4855,48 @@
>                project_paint_end(&pop->ps);
>        }
>
> +       // XXX: (kwk) Think about how to get rid of these to lines. Undo/Redo 
> is available via new stroke system (RNA) now.
>        paint_redraw(C, &pop->s, 1);
>        undo_paint_push_end(UNDO_PAINT_IMAGE);
>
> +       // XXX: (kwk) Since there is no longer a ReportList from op->reports 
> we solely print the reports but do not store them for now.
>        if(pop->s.warnmultifile)
> -               BKE_reportf(op->reports, RPT_WARNING, "Image requires 4 color 
> channels to paint: %s", pop->s.warnmultifile);
> +               BKE_reportf(NULL, RPT_WARNING, "Image requires 4 color 
> channels to paint: %s", pop->s.warnmultifile);
>        if(pop->s.warnpackedfile)
> -               BKE_reportf(op->reports, RPT_WARNING, "Packed MultiLayer 
> files cannot be painted: %s", pop->s.warnpackedfile);
> +               BKE_reportf(NULL, RPT_WARNING, "Packed MultiLayer files 
> cannot be painted: %s", pop->s.warnpackedfile);
>
>        MEM_freeN(pop);
>  }
>
> -static int paint_exec(bContext *C, wmOperator *op)
> +static int paint_stroke_test_start(bContext *C, struct wmOperator *op, 
> wmEvent *event)
>  {
> -       if(!texture_paint_init(C, op)) {
> -               MEM_freeN(op->customdata);
> +       struct PaintStroke *stroke = op->customdata;
> +
> +       if(!texture_paint_init(C, op, stroke)) {
> +               MEM_freeN(paint_stroke_mode_data(stroke));
>                return OPERATOR_CANCELLED;
>        }
> -
> -       RNA_BEGIN(op->ptr, itemptr, "stroke") {
> -               paint_apply(C, op, &itemptr);
> -       }
> -       RNA_END;
> -
> -       paint_exit(C, op);
> -
> -       return OPERATOR_FINISHED;
> +
> +       return 1;
>  }
>
> -static void paint_apply_event(bContext *C, wmOperator *op, wmEvent *event)
> -{
> -       ARegion *ar= CTX_wm_region(C);
> -       PaintOperation *pop= op->customdata;
> -       wmTabletData *wmtab;
> -       PointerRNA itemptr;
> -       float pressure, mousef[2];
> -       double time;
> -       int tablet, mouse[2];
> -
> -       // XXX +1 matches brush location better but
> -       // still not exact, find out why and fix ..
> -       mouse[0]= event->x - ar->winrct.xmin + 1;
> -       mouse[1]= event->y - ar->winrct.ymin + 1;
> -
> -       time= PIL_check_seconds_timer();
> -
> -       tablet= 0;
> -       pressure= 0;
> -       pop->s.blend= pop->s.brush->blend;
> -
> -       if(event->custom == EVT_DATA_TABLET) {
> -               wmtab= event->customdata;
> -
> -               tablet= (wmtab->Active != EVT_TABLET_NONE);
> -               pressure= wmtab->Pressure;
> -               if(wmtab->Active == EVT_TABLET_ERASER)
> -                       pop->s.blend= IMB_BLEND_ERASE_ALPHA;
> -       }
> -       else /* otherwise airbrush becomes 1.0 pressure instantly */
> -               pressure= pop->prev_pressure ? pop->prev_pressure : 1.0f;
> -
> -       if(pop->first) {
> -               pop->prevmouse[0]= mouse[0];
> -               pop->prevmouse[1]= mouse[1];
> -               pop->starttime= time;
> -
> -               /* special exception here for too high pressure values on 
> first touch in
> -                  windows for some tablets, then we just skip first touch .. 
>  */
> -               if ((pop->s.brush->flag & 
> (BRUSH_ALPHA_PRESSURE|BRUSH_SIZE_PRESSURE|BRUSH_SPACING_PRESSURE)) && tablet 
> && (pressure >= 0.99f))
> -                       return;
> -       }
> -
> -       /* fill in stroke */
> -       RNA_collection_add(op->ptr, "stroke", &itemptr);
> -
> -       mousef[0] = mouse[0];
> -       mousef[1] = mouse[1];
> -       RNA_float_set_array(&itemptr, "mouse", mousef);
> -       RNA_float_set(&itemptr, "time", (float)(time - pop->starttime));
> -       RNA_float_set(&itemptr, "pressure", pressure);
> -
> -       /* apply */
> -       paint_apply(C, op, &itemptr);
> -
> -       pop->prev_pressure= pressure;
> -}
> -
>  static int paint_invoke(bContext *C, wmOperator *op, wmEvent *event)
>  {
>        PaintOperation *pop;
>
> -       if(!texture_paint_init(C, op)) {
> -               MEM_freeN(op->customdata);
> -               return OPERATOR_CANCELLED;
> -       }
> +       op->customdata = paint_stroke_new(C,
> +                                                                         
> NULL,
> +                                                                         
> paint_stroke_test_start,
> +                                                                         
> paint_stroke_update_step,
> +                                                                         
> paint_stroke_done);
>
> -       paint_apply_event(C, op, event);
> +//     if(!texture_paint_init(C, op)) {
> +//             MEM_freeN(op->customdata);
> +//             return OPERATOR_CANCELLED;
> +//     }
> +
> +       // XXX: (kwk) This function is now mostly in paint_update_step() 
> which gets called automatically.
> +       //paint_apply_event(C, op, event);
>
>        pop= op->customdata;
>        WM_event_add_modal_handler(C, op);
> @@ -4858,38 +4904,21 @@
>        if(pop->s.brush->flag & BRUSH_AIRBRUSH)
>                pop->timer= WM_event_add_timer(CTX_wm_manager(C), 
> CTX_wm_window(C), TIMER, 0.01f);
>
> +       /* XXX (kwk) copied from vpaint_stroke_invoke() and not sure what it 
> does :( */
> +       op->type->modal(C, op, event);
> +
>        return OPERATOR_RUNNING_MODAL;
>  }
>
> -static int paint_modal(bContext *C, wmOperator *op, wmEvent *event)
> -{
> -       PaintOperation *pop= op->customdata;
> +// XXX: (kwk) ot->cancel not needed with new stroke system? like in 
> PAINT_OT_vertex_paint() ?
> +//static int paint_cancel(bContext *C, wmOperator *op)
> +//{
> +//     struct PaintStroke *stroke = op->customdata;
> +//     paint_stroke_done(C, stroke); /* XXX (kwk) OK to call directly? */
> +//
> +//     return OPERATOR_CANCELLED;
> +//}
>
> -       switch(event->type) {
> -               case LEFTMOUSE:
> -               case MIDDLEMOUSE:
> -               case RIGHTMOUSE: // XXX hardcoded
> -                       paint_exit(C, op);
> -                       return OPERATOR_FINISHED;
> -               case MOUSEMOVE:
> -                       paint_apply_event(C, op, event);
> -                       break;
> -               case TIMER:
> -                       if(event->customdata == pop->timer)
> -                               paint_apply_event(C, op, event);
> -                       break;
> -       }
> -
> -       return OPERATOR_RUNNING_MODAL;
> -}
> -
> -static int paint_cancel(bContext *C, wmOperator *op)
> -{
> -       paint_exit(C, op);
> -
> -       return OPERATOR_CANCELLED;
> -}
> -
>  void PAINT_OT_image_paint(wmOperatorType *ot)
>  {
>        /* identifiers */
> @@ -4897,10 +4926,12 @@
>        ot->idname= "PAINT_OT_image_paint";
>
>        /* api callbacks */
> -       ot->exec= paint_exec;
>        ot->invoke= paint_invoke;
> -       ot->modal= paint_modal;
> -       ot->cancel= paint_cancel;
>
> @@ Diff output truncated at 10240 characters. @@
>
> _______________________________________________
> Bf-blender-cvs mailing list
> bf-blender-...@blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
_______________________________________________
Bf-committers mailing list
Bf-committers@blender.org
http://lists.blender.org/mailman/listinfo/bf-committers

Reply via email to