Dynamic Paint:
authorMiika Hamalainen <blender@miikah.org>
Fri, 28 Oct 2011 14:46:09 +0000 (14:46 +0000)
committerMiika Hamalainen <blender@miikah.org>
Fri, 28 Oct 2011 14:46:09 +0000 (14:46 +0000)
* More code changes pointed by Brecht in codereview.
* Some user interface improvements.
* Updating brush settings now also updates canvas preview.

14 files changed:
release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
source/blender/blenkernel/BKE_bvhutils.h
source/blender/blenkernel/BKE_dynamicpaint.h
source/blender/blenkernel/intern/bvhutils.c
source/blender/blenkernel/intern/dynamicpaint.c
source/blender/blenlib/BLI_math_geom.h
source/blender/blenlib/intern/math_geom.c
source/blender/blenloader/intern/readfile.c
source/blender/editors/physics/dynamicpaint_ops.c
source/blender/editors/space_view3d/drawobject.c
source/blender/makesdna/DNA_dynamicpaint_types.h
source/blender/makesrna/intern/rna_dynamicpaint.c
source/blender/modifiers/intern/MOD_dynamicpaint.c
source/blenderplayer/bad_level_call_stubs/stubs.c

index 4a116707d0eafdbe098bc7a147e59d3a8e02e432..75b4719bf204e0f660d2a22ce730b0b2a330fbec 100644 (file)
@@ -72,18 +72,18 @@ class PHYSICS_PT_dynamic_paint(PhysicButtonsPanel, bpy.types.Panel):
                         if surface.surface_format != "VERTEX":
                             col.label(text="Quality:")
                             col.prop(surface, "image_resolution")
-                        col.prop(surface, "use_anti_aliasing")
+                        col.prop(surface, "use_antialiasing")
                     
                         col = layout.column()
                         col.label(text="Frames:")
                         split = col.split()
                     
                         col = split.column(align=True)
-                        col.prop(surface, "start_frame", text="Start")
-                        col.prop(surface, "end_frame", text="End")
+                        col.prop(surface, "frame_start", text="Start")
+                        col.prop(surface, "frame_end", text="End")
                     
                         col = split.column()
-                        col.prop(surface, "substeps")
+                        col.prop(surface, "frame_substeps")
 
             elif (md.ui_type == "BRUSH"):
                 brush = md.brush_settings
@@ -102,9 +102,9 @@ class PHYSICS_PT_dynamic_paint(PhysicButtonsPanel, bpy.types.Panel):
                 
                     col = split.column()
                     sub = col.column()
-                    sub.active = (brush.paint_source != "PSYS");
+                    sub.active = (brush.paint_source != "PARTICLE_SYSTEM");
                     sub.prop(brush, "use_material")
-                    if brush.use_material and brush.paint_source != "PSYS":
+                    if brush.use_material and brush.paint_source != "PARTICLE_SYSTEM":
                         col.prop(brush, "material", text="")
                         col.prop(brush, "paint_alpha", text="Alpha Factor")
                     else:
@@ -132,33 +132,42 @@ class PHYSICS_PT_dp_advanced_canvas(PhysicButtonsPanel, bpy.types.Panel):
 
         # dissolve
         if (surface.surface_type == "PAINT"):
-            layout.label(text="Wetmap drying:")
-            split = layout.split(percentage=0.8)
-            split.prop(surface, "dry_speed", text="Dry Time")
-            split.prop(surface, "use_dry_log", text="Slow")
+            split = layout.split(percentage=0.35)
+            col = split.column()
+            col.label(text="Wetmap drying:")
+            col = split.column()
+            split = col.split(percentage=0.7)
+            col = split.column()
+            col.prop(surface, "dry_speed", text="Time")
+            col = split.column()
+            col.prop(surface, "use_dry_log", text="Slow")
             
         if (surface.surface_type != "WAVE"):
+            split = layout.split(percentage=0.35)
+            col = split.column()
             if (surface.surface_type == "DISPLACE"):
-                layout.prop(surface, "use_dissolve", text="Dissolve:")
+                col.prop(surface, "use_dissolve", text="Dissolve:")
             elif (surface.surface_type == "WEIGHT"):
-                layout.prop(surface, "use_dissolve", text="Fade:")
+                col.prop(surface, "use_dissolve", text="Fade:")
             else:
-                layout.prop(surface, "use_dissolve", text="Dissolve:")
-            sub = layout.column()
-            sub.active = surface.use_dissolve
-            split = sub.split(percentage=0.8)
-            split.prop(surface, "dissolve_speed", text="Time")
-            split.prop(surface, "use_dissolve_log", text="Slow")
+                col.prop(surface, "use_dissolve", text="Dissolve:")
+            col = split.column()
+            col.active = surface.use_dissolve
+            split = col.split(percentage=0.7)
+            col = split.column()
+            col.prop(surface, "dissolve_speed", text="Time")
+            col = split.column()
+            col.prop(surface, "use_dissolve_log", text="Slow")
         
         # per type settings
         if (surface.surface_type == "DISPLACE"):
-            layout.prop(surface, "incremental_disp")
+            layout.prop(surface, "use_incremental_displace")
             if (surface.surface_format == "VERTEX"):
                 split = layout.split()
                 col = split.column()
                 col.prop(surface, "depth_clamp")
                 col = split.column()
-                col.prop(surface, "disp_factor")
+                col.prop(surface, "displace_factor")
             
         if (surface.surface_type == "WAVE"):
             layout.prop(surface, "wave_open_borders")
@@ -173,8 +182,8 @@ class PHYSICS_PT_dp_advanced_canvas(PhysicButtonsPanel, bpy.types.Panel):
             col.prop(surface, "wave_damping")
             col.prop(surface, "wave_spring")
             
-        layout.label(text="Brush Group:")
-        layout.prop(surface, "brush_group", text="")
+        layout.separator()
+        layout.prop(surface, "brush_group", text="Brush Group")
 
 class PHYSICS_PT_dp_canvas_output(PhysicButtonsPanel, bpy.types.Panel):
     bl_label = "Dynamic Paint Output"
@@ -230,42 +239,42 @@ class PHYSICS_PT_dp_canvas_output(PhysicButtonsPanel, bpy.types.Panel):
         # image format outputs
         if (surface.surface_format == "IMAGE"):
             col = layout.column()
-            col.label(text="UV layer:")
-            col.prop_search(surface, "uv_layer", ob.data, "uv_textures", text="")
+            col.operator("dpaint.bake", text="Bake Image Sequence", icon='MOD_DYNAMICPAINT')
+            col.prop_search(surface, "uv_layer", ob.data, "uv_textures", text="UV layer:")
+            layout.separator()
             
             col.separator()
             col = layout.column()
-            col.prop(surface, "image_output_path", text="Output directory")
-            col.prop(surface, "image_fileformat", text="Image Format")
+            col.prop(surface, "image_output_path", text="")
+            split = layout.split()
+            col = split.column()
+            col.prop(surface, "image_fileformat", text="")
+            col = split.column()
+            col.prop(surface, "premultiply", text="Premultiply alpha")
             col.separator()
+            
             if (surface.surface_type == "PAINT"):
-                split = col.split()
+                split = layout.split(percentage=0.4)
                 col = split.column()
-                col.prop(surface, "do_output1", text="Output Paintmaps:")
+                col.prop(surface, "do_output1", text="Paintmaps:")
                 sub = split.column()
-                sub.prop(surface, "premultiply", text="Premultiply alpha")
-                sub.active = surface.do_output1
-                sub = layout.column()
                 sub.active = surface.do_output1
-                sub.prop(surface, "output_name", text="Filename: ")
+                sub.prop(surface, "output_name", text="")
                 
-                col = layout.column()
-                col.prop(surface, "do_output2", text="Output Wetmaps:")
-                sub = col.column()
+                split = layout.split(percentage=0.4)
+                col = split.column()
+                col.prop(surface, "do_output2", text="Wetmaps:")
+                sub = split.column()
                 sub.active = surface.do_output2
-                sub.prop(surface, "output_name2", text="Filename: ")
+                sub.prop(surface, "output_name2", text="")
             else:
+                col = layout.column()
                 col.prop(surface, "output_name", text="Filename: ")
                 if (surface.surface_type == "DISPLACE"):
-                    col.prop(surface, "disp_type", text="Displace Type")
+                    col.prop(surface, "displace_type", text="Displace Type")
                     col.prop(surface, "depth_clamp")
                 if (surface.surface_type == "WAVE"):
                     col.prop(surface, "depth_clamp", text="Wave Clamp")
-            
-            layout.separator()
-            layout.operator("dpaint.bake", text="Bake Image Sequence", icon='MOD_DYNAMICPAINT')
-            if len(canvas.ui_info) != 0:
-                layout.label(text=canvas.ui_info)
 
 class PHYSICS_PT_dp_canvas_initial_color(PhysicButtonsPanel, bpy.types.Panel):
     bl_label = "Dynamic Paint Initial Color"
@@ -297,7 +306,7 @@ class PHYSICS_PT_dp_canvas_initial_color(PhysicButtonsPanel, bpy.types.Panel):
             layout.prop(surface, "init_texture")
             layout.prop_search(surface, "init_layername", ob.data, "uv_textures", text="UV Layer:")
         
-        if (surface.init_color_type == "VERTEXCOLOR"):
+        if (surface.init_color_type == "VERTEX_COLOR"):
             layout.prop_search(surface, "init_layername", ob.data, "vertex_colors", text="Color Layer: ")
 
 class PHYSICS_PT_dp_effects(PhysicButtonsPanel, bpy.types.Panel):
@@ -388,35 +397,35 @@ class PHYSICS_PT_dp_brush_source(PhysicButtonsPanel, bpy.types.Panel):
         col = split.column()
         col.prop(brush, "paint_source")
 
-        if brush.paint_source == "PSYS":
-            col.prop_search(brush, "psys", ob, "particle_systems", text="")
-            if brush.psys:
+        if brush.paint_source == "PARTICLE_SYSTEM":
+            col.prop_search(brush, "particle_system", ob, "particle_systems", text="")
+            if brush.particle_system:
                 col.label(text="Particle effect:")
                 sub = col.column()
                 sub.active = not brush.use_part_radius
                 sub.prop(brush, "solid_radius", text="Solid Radius")
-                col.prop(brush, "use_part_radius", text="Use Particle's Radius")
+                col.prop(brush, "use_particle_radius", text="Use Particle's Radius")
                 col.prop(brush, "smooth_radius", text="Smooth radius")
                 
-        if brush.paint_source in {'DISTANCE', 'VOLDIST', 'POINT'}:
+        if brush.paint_source in {'DISTANCE', 'VOLUME_DISTANCE', 'POINT'}:
             col.prop(brush, "paint_distance", text="Paint Distance")
             split = layout.row().split(percentage=0.4)
             sub = split.column()
             if brush.paint_source == 'DISTANCE':
-                sub.prop(brush, "prox_project")
-            if brush.paint_source == "VOLDIST":
-                sub.prop(brush, "prox_inverse")
+                sub.prop(brush, "proximity_project")
+            if brush.paint_source == "VOLUME_DISTANCE":
+                sub.prop(brush, "proximity_inverse")
                 
             sub = split.column()
             if brush.paint_source == 'DISTANCE':
                 column = sub.column()
-                column.active = brush.prox_project
-                column.prop(brush, "ray_dir")
-            sub.prop(brush, "prox_falloff")
-            if brush.prox_falloff == "RAMP":
+                column.active = brush.proximity_project
+                column.prop(brush, "ray_direction")
+            sub.prop(brush, "proximity_falloff")
+            if brush.proximity_falloff == "RAMP":
                 col = layout.row().column()
                 col.separator()
-                col.prop(brush, "prox_ramp_alpha", text="Only Use Alpha")
+                col.prop(brush, "proximity_ramp_alpha", text="Only Use Alpha")
                 col.template_color_ramp(brush, "paint_ramp", expand=True)
                 
 class PHYSICS_PT_dp_brush_velocity(PhysicButtonsPanel, bpy.types.Panel):
@@ -434,8 +443,6 @@ class PHYSICS_PT_dp_brush_velocity(PhysicButtonsPanel, bpy.types.Panel):
         brush = context.dynamic_paint.brush_settings
         ob = context.object
                
-        col = layout.row().column()
-        col.label(text="Brush Velocity Settings:")
         split = layout.split()
         col = split.column()
         col.prop(brush, "velocity_alpha")
@@ -447,9 +454,12 @@ class PHYSICS_PT_dp_brush_velocity(PhysicButtonsPanel, bpy.types.Panel):
         sub.prop(brush, "max_velocity")
         sub.template_color_ramp(brush, "velocity_ramp", expand=True)
         layout.separator()
-        layout.label(text="Smudge:")
-        layout.prop(brush, "do_smudge")
-        layout.prop(brush, "smudge_strength")
+        split = layout.split()
+        col = split.column()
+        col.prop(brush, "do_smudge")
+        col = split.column()
+        col.active = brush.do_smudge
+        col.prop(brush, "smudge_strength")
         
 class PHYSICS_PT_dp_brush_wave(PhysicButtonsPanel, bpy.types.Panel):
     bl_label = "Dynamic Paint Wave"
index 11f5e93809f935fc95b9871deaa53876facf943a..5846b86e68a2694d229636a17af80383caf567c3 100644 (file)
@@ -110,8 +110,8 @@ void free_bvhtree_from_mesh(struct BVHTreeFromMesh *data);
 /*
 * Math functions used by callbacks
 */
-float ray_tri_intersection(const BVHTreeRay *ray, const float m_dist, const float *v0, const float *v1, const float *v2);
-float nearest_point_in_tri_surface(const float *v0,const float *v1,const float *v2,const float *p, int *v, int *e, float *nearest );
+float bvhtree_ray_tri_intersection(const BVHTreeRay *ray, const float m_dist, const float *v0, const float *v1, const float *v2);
+float nearest_point_in_tri_surface(const float *v0,const float *v1,const float *v2,const float *p, int *v, int *e, float *nearest);
 
 /*
  * BVHCache
index d9cbed815fc12cf6f8403cf7778c2c1cb4350b85..75b1f74a40326c77ed5961e296f3fc8eea2edcd2 100644 (file)
@@ -14,8 +14,6 @@
 #ifndef BKE_DYNAMIC_PAINT_H_
 #define BKE_DYNAMIC_PAINT_H_
 
-#include "DNA_dynamicpaint_types.h"
-
 struct bContext;
 struct wmOperator;
 
@@ -38,11 +36,7 @@ typedef struct PaintPoint {
        float e_color[3];
        float e_alpha;
        float wetness;
-       short state;    /* -1 = doesn't exist (On UV mapped image
-                                       *           there can be points that doesn't exist on mesh surface)
-                                       *  0 = empty or dry
-                                       *  1 = wet paint
-                                       *  2 = new paint */
+       short state;
        float color[3];
        float alpha;
 } PaintPoint;
@@ -52,9 +46,7 @@ typedef struct PaintWavePoint {
 
        float height;
        float velocity;
-       short state; /* 0 = neutral
-                                *  1 = obstacle
-                                *  2 = reflect only */
+       short state;
 } PaintWavePoint;
 
 struct DerivedMesh *dynamicPaint_Modifier_do(struct DynamicPaintModifierData *pmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm);
@@ -81,17 +73,17 @@ struct DynamicPaintSurface *get_activeSurface(struct DynamicPaintCanvasSettings
 /* image sequence baking */
 int dynamicPaint_createUVSurface(struct DynamicPaintSurface *surface);
 int dynamicPaint_calculateFrame(struct DynamicPaintSurface *surface, struct Scene *scene, struct Object *cObject, int frame);
-void dynamicPaint_outputImage(struct DynamicPaintSurface *surface, char* filename, short format, short type);
-
-
-/* surface -> image file flags */
-#define DPOUTPUT_JPEG 0
-#define DPOUTPUT_PNG 1
-#define DPOUTPUT_OPENEXR 2
-
-#define DPOUTPUT_PAINT 0
-#define DPOUTPUT_WET 1
-#define DPOUTPUT_DISPLACE 2
-#define DPOUTPUT_WAVES 3
+void dynamicPaint_outputSurfaceImage(struct DynamicPaintSurface *surface, char* filename, short output_layer);
+
+/* PaintPoint state */
+#define DPAINT_PAINT_NONE -1
+#define DPAINT_PAINT_DRY 0
+#define DPAINT_PAINT_WET 1
+#define DPAINT_PAINT_NEW 2
+
+/* PaintWavePoint state */
+#define DPAINT_WAVE_NONE 0
+#define DPAINT_WAVE_OBSTACLE 1
+#define DPAINT_WAVE_REFLECT_ONLY 2
 
 #endif /* BKE_DYNAMIC_PAINT_H_ */
index 72b456fa9ab2e56cb4eb506efa63c9c30d2cfd74..b81b52676fc130e37c38e9e35cd1195300bac839 100644 (file)
@@ -50,7 +50,7 @@
 
 /* Math stuff for ray casting on mesh faces and for nearest surface */
 
-float ray_tri_intersection(const BVHTreeRay *ray, const float UNUSED(m_dist), const float *v0, const float *v1, const float *v2)
+float bvhtree_ray_tri_intersection(const BVHTreeRay *ray, const float UNUSED(m_dist), const float *v0, const float *v1, const float *v2)
 {
        float dist;
 
@@ -458,7 +458,7 @@ static void mesh_faces_spherecast(void *userdata, int index, const BVHTreeRay *r
        {       
                float dist;
                if(data->sphere_radius == 0.0f)
-                       dist = ray_tri_intersection(ray, hit->dist, t0, t1, t2);
+                       dist = bvhtree_ray_tri_intersection(ray, hit->dist, t0, t1, t2);
                else
                        dist = sphereray_tri_intersection(ray, data->sphere_radius, hit->dist, t0, t1, t2);
 
index 0aa06e5fda4947e007c36f0701eae450f0b354f3..eb776bf2edac06ddfc58a4737ec75c35b5b9ce3f 100644 (file)
@@ -32,6 +32,7 @@
 #include "DNA_modifier_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
+#include "DNA_space_types.h"
 #include "DNA_texture_types.h"
 
 #include "BKE_animsys.h"
@@ -98,9 +99,6 @@ static int neighY[8] = {0,1,1, 1, 0,-1,-1,-1};
 #define EFF_MOVEMENT_PER_FRAME 0.05f
 /* initial wave time factor */
 #define WAVE_TIME_FAC 0.1
-/* vector macros */
-#define VECADDVAL(v,val)       {*(v)+=(val); *(v+1)+=(val); *(v+2)+=(val);}
-#define VECMULVAL(v,val)       {*(v)*=(val); *(v+1)*=(val); *(v+2)*=(val);}
 /* dissolve macro */
 #define VALUE_DISSOLVE(VALUE, SPEED, SCALE, LOG) (VALUE) = (LOG) ? (VALUE) * 1.0f - 1.0f/((SPEED)/(SCALE)) : (VALUE) - 1.0f/(SPEED)*(SCALE)
 
@@ -205,17 +203,11 @@ typedef struct PaintAdjData {
 
 /***************************** General Utils ******************************/
 
-/*
-*      Output error message to both ui and console
-*/
-static int printError(DynamicPaintCanvasSettings *canvas, char *string)
+/* Set canvas error string to display at the bake report */
+static int setError(DynamicPaintCanvasSettings *canvas, char *string)
 {
        /* Add error to canvas ui info label */
        BLI_snprintf(canvas->error, sizeof(canvas->error), string);
-
-       /* Print console output */
-       printf("DynamicPaint bake failed: %s\n", canvas->error);
-
        return 0;
 }
 
@@ -328,7 +320,7 @@ static int surface_duplicateOutputExists(void *arg, const char *name)
 void surface_setUniqueOutputName(DynamicPaintSurface *surface, char *basename, int output)
 {
        char name[64];
-       strncpy(name, basename, 62); /* in case basename is surface->name use a copy */
+       BLI_strncpy(name, basename, sizeof(name)); /* in case basename is surface->name use a copy */
        if (!output)
                BLI_uniquename_cb(surface_duplicateOutputExists, surface, name, '.', surface->output_name, sizeof(surface->output_name));
        if (output)
@@ -350,7 +342,7 @@ static int surface_duplicateNameExists(void *arg, const char *name)
 void dynamicPaintSurface_setUniqueName(DynamicPaintSurface *surface, char *basename)
 {
        char name[64];
-       strncpy(name, basename, 62); /* in case basename is surface->name use a copy */
+       BLI_strncpy(name, basename, sizeof(name)); /* in case basename is surface->name use a copy */
        BLI_uniquename_cb(surface_duplicateNameExists, surface, name, '.', surface->name, sizeof(surface->name));
 }
 
@@ -410,20 +402,12 @@ static int surface_totalSamples(DynamicPaintSurface *surface)
 /* assumes source alpha > 0.0f or results NaN colors */
 static void mixColors(float *t_color, float t_alpha, float *s_color, float s_alpha)
 {
-       float invFact = (s_alpha<t_alpha) ? 1.0f : t_alpha/s_alpha;
-       float factor = 1.0f - invFact;
+       float factor = (s_alpha<t_alpha) ? 1.0f : t_alpha/s_alpha;
 
        /* set initial color depending on existing alpha */
-       t_color[0] = t_color[0]*invFact + s_color[0]*factor;
-       t_color[1] = t_color[1]*invFact + s_color[1]*factor;
-       t_color[2] = t_color[2]*invFact + s_color[2]*factor;
-
+       interp_v3_v3v3(t_color, s_color, t_color, factor);
        /* mix final color */
-       factor = s_alpha;
-       invFact = 1.0f - factor;
-       t_color[0] = t_color[0]*invFact + s_color[0]*factor;
-       t_color[1] = t_color[1]*invFact + s_color[1]*factor;
-       t_color[2] = t_color[2]*invFact + s_color[2]*factor;
+       interp_v3_v3v3(t_color, t_color, s_color, s_alpha);
 }
 
 /* set "ignore cache" flag for all caches on this object */
@@ -575,8 +559,8 @@ static void boundInsert(Bounds3D *b, float point[3])
 {
        int i=2;
        if (!b->valid) {
-               VECCOPY(b->min, point);
-               VECCOPY(b->max, point);
+               copy_v3_v3(b->min, point);
+               copy_v3_v3(b->max, point);
                b->valid = 1;
        }
        else {
@@ -632,9 +616,7 @@ static void surfaceGenerateGrid(struct DynamicPaintSurface *surface)
                float min_dim;
 
                /* calculate canvas dimensions */
-               #ifdef _OPENMP
                #pragma omp parallel for schedule(static)
-               #endif
                for (i=0; i<sData->total_points; i++) {
                        #ifdef _OPENMP
                        int id = omp_get_thread_num();
@@ -694,9 +676,7 @@ static void surfaceGenerateGrid(struct DynamicPaintSurface *surface)
 
                if (!error) {
                        /* calculate number of points withing each cell */
-                       #ifdef _OPENMP
                        #pragma omp parallel for schedule(static)
-                       #endif
                        for (i=0; i<sData->total_points; i++) {
                                int co[3], j;
                                for (j=0; j<3; j++) {
@@ -737,9 +717,7 @@ static void surfaceGenerateGrid(struct DynamicPaintSurface *surface)
                        /* calculate cell bounds */
                        {
                                int x;
-                               #ifdef _OPENMP
                                #pragma omp parallel for schedule(static)
-                               #endif
                                for (x=0; x<grid->dim[0]; x++) {
                                        int y;
                                        for (y=0; y<grid->dim[1]; y++) {
@@ -766,7 +744,7 @@ static void surfaceGenerateGrid(struct DynamicPaintSurface *surface)
                grid->s_num = MEM_reallocN(grid->s_num, sizeof(int) * grid_cells);
 
                if (error || !grid->s_num) {
-                       printError(surface->canvas, "Not enough free memory.");
+                       setError(surface->canvas, "Not enough free memory.");
                        freeGrid(sData);
                }
        }
@@ -972,7 +950,8 @@ struct DynamicPaintSurface *dynamicPaint_createNewSurface(DynamicPaintCanvasSett
        surface->wave_timescale = 1.0f;
        surface->wave_spring = 0.20;
 
-       sprintf(surface->image_output_path, "%sdynamicpaint/", "/tmp/");
+       BLI_snprintf(surface->image_output_path, sizeof(surface->image_output_path), "%sdynamicpaint", U.textudir);
+       BLI_cleanup_dir(NULL, surface->image_output_path);
        dynamicPaintSurface_setUniqueName(surface, "Surface");
 
        surface->effector_weights = BKE_add_effector_weights(NULL);
@@ -1004,8 +983,6 @@ int dynamicPaint_createType(struct DynamicPaintModifierData *pmd, int type, stru
                        if (!dynamicPaint_createNewSurface(pmd->canvas, scene))
                                return 0;
 
-                       pmd->canvas->ui_info[0] = '\0';
-
                }
                else if(type == MOD_DYNAMICPAINT_TYPE_BRUSH) {
                        if(pmd->brush)
@@ -1022,9 +999,9 @@ int dynamicPaint_createType(struct DynamicPaintModifierData *pmd, int type, stru
                        pmd->brush->collision = MOD_DPAINT_COL_VOLUME;
                        
                        pmd->brush->mat = NULL;
-                       pmd->brush->r = 0.0f;
-                       pmd->brush->g = 0.0f;
-                       pmd->brush->b = 1.0f;
+                       pmd->brush->r = 0.15f;
+                       pmd->brush->g = 0.4f;
+                       pmd->brush->b = 0.8f;
                        pmd->brush->alpha = 1.0f;
                        pmd->brush->wetness = 1.0f;
 
@@ -1090,8 +1067,6 @@ void dynamicPaint_Modifier_copy(struct DynamicPaintModifierData *pmd, struct Dyn
        if (tpmd->canvas) {
                tpmd->canvas->pmd = tpmd;
 
-               tpmd->canvas->ui_info[0] = '\0';
-
        } else if (tpmd->brush) {
                tpmd->brush->pmd = tpmd;
 
@@ -1146,7 +1121,7 @@ static void dynamicPaint_allocateSurfaceType(DynamicPaintSurface *surface)
                        break;
        }
 
-       if (sData->type_data == NULL) printError(surface->canvas, "Not enough free memory!");
+       if (sData->type_data == NULL) setError(surface->canvas, "Not enough free memory!");
 }
 
 static int surface_usesAdjDistance(DynamicPaintSurface *surface)
@@ -1198,7 +1173,7 @@ static void dynamicPaint_initAdjacencyData(DynamicPaintSurface *surface, int for
        if (!ed->n_index || !ed->n_num || !ed->n_target || !temp_data) {
                dynamicPaint_freeAdjData(sData);
                if (temp_data) MEM_freeN(temp_data);
-               printError(surface->canvas, "Not enough free memory.");
+               setError(surface->canvas, "Not enough free memory.");
                return;
        }
 
@@ -1286,11 +1261,9 @@ void dynamicPaint_setInitialColor(DynamicPaintSurface *surface)
        /* Single color */
        else if (surface->init_color_type == MOD_DPAINT_INITIAL_COLOR) {
                /* apply color to every surface point */
-               #ifdef _OPENMP
                #pragma omp parallel for schedule(static)
-               #endif
                for (i=0; i<sData->total_points; i++) {
-                       VECCOPY(pPoint[i].color, surface->init_color);
+                       copy_v3_v3(pPoint[i].color, surface->init_color);
                        pPoint[i].alpha = surface->init_color[3];
                }
        }
@@ -1312,9 +1285,7 @@ void dynamicPaint_setInitialColor(DynamicPaintSurface *surface)
                /* for vertex surface loop through tfaces and find uv color
                *  that provides highest alpha */
                if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
-                       #ifdef _OPENMP
                        #pragma omp parallel for schedule(static)
-                       #endif
                        for (i=0; i<numOfFaces; i++) {
                                int numOfVert = (mface[i].v4) ? 4 : 3;
                                float uv[3] = {0.0f};
@@ -1330,7 +1301,7 @@ void dynamicPaint_setInitialColor(DynamicPaintSurface *surface)
                                        multitex_ext_safe(tex, uv, &texres);
 
                                        if (texres.tin > pPoint[*vert].alpha) {
-                                               VECCOPY(pPoint[*vert].color, &texres.tr);
+                                               copy_v3_v3(pPoint[*vert].color, &texres.tr);
                                                pPoint[*vert].alpha = texres.tin;
                                        }
                                }
@@ -1340,9 +1311,7 @@ void dynamicPaint_setInitialColor(DynamicPaintSurface *surface)
                        ImgSeqFormatData *f_data = (ImgSeqFormatData*)sData->format_data;
                        int samples = (surface->flags & MOD_DPAINT_ANTIALIAS) ? 5 : 1;
 
-                       #ifdef _OPENMP
                        #pragma omp parallel for schedule(static)
-                       #endif
                        for (i=0; i<sData->total_points; i++) {
                                float uv[9] = {0.0f};
                                float uv_final[3] = {0.0f};
@@ -1352,7 +1321,7 @@ void dynamicPaint_setInitialColor(DynamicPaintSurface *surface)
                                /* collect all uvs */
                                for (j=0; j<3; j++) {
                                        int v=(f_data->uv_p[i].quad && j>0) ? j+1 : j;
-                                       VECCOPY2D(&uv[j*3], tface[f_data->uv_p[i].face_index].uv[v]);
+                                       copy_v2_v2(&uv[j*3], tface[f_data->uv_p[i].face_index].uv[v]);
                                }
 
                                /* interpolate final uv pos */
@@ -1365,7 +1334,7 @@ void dynamicPaint_setInitialColor(DynamicPaintSurface *surface)
                                multitex_ext_safe(tex, uv_final, &texres);
 
                                /* apply color */
-                               VECCOPY(pPoint[i].color, &texres.tr);
+                               copy_v3_v3(pPoint[i].color, &texres.tr);
                                pPoint[i].alpha = texres.tin;
                        }
                }
@@ -1380,9 +1349,7 @@ void dynamicPaint_setInitialColor(DynamicPaintSurface *surface)
                        MFace *mface = dm->getFaceArray(dm);
                        int numOfFaces = dm->getNumFaces(dm);
 
-                       #ifdef _OPENMP
                        #pragma omp parallel for schedule(static)
-                       #endif
                        for (i=0; i<numOfFaces; i++) {
                                int numOfVert = (mface[i].v4) ? 4 : 3;
                                int j;
@@ -1400,9 +1367,7 @@ void dynamicPaint_setInitialColor(DynamicPaintSurface *surface)
                        ImgSeqFormatData *f_data = (ImgSeqFormatData*)sData->format_data;
                        int samples = (surface->flags & MOD_DPAINT_ANTIALIAS) ? 5 : 1;
 
-                       #ifdef _OPENMP
                        #pragma omp parallel for schedule(static)
-                       #endif
                        for (i=0; i<sData->total_points; i++) {
                                int face_ind = f_data->uv_p[i].face_index;
                                float colors[3][4] = {{0.0f,0.0f,0.0f,0.0f}};
@@ -1421,7 +1386,7 @@ void dynamicPaint_setInitialColor(DynamicPaintSurface *surface)
                                interp_v4_v4v4v4(       final_color, colors[0], colors[1], colors[2],
                                                f_data->barycentricWeights[i*samples].v);
 
-                               VECCOPY(pPoint[i].color, final_color);
+                               copy_v3_v3(pPoint[i].color, final_color);
                                pPoint[i].alpha = final_color[3];
                        }
                }
@@ -1504,9 +1469,7 @@ static void dynamicPaint_applySurfaceDisplace(DynamicPaintSurface *surface, Deri
                int i;
                float* value = (float*)sData->type_data;
 
-               #ifdef _OPENMP
                #pragma omp parallel for schedule(static)
-               #endif
                for (i=0; i<sData->total_points; i++) {
                        float normal[3], val=value[i]*surface->disp_factor;
                        normal_short_to_float_v3(normal, mvert[i].no);
@@ -1557,9 +1520,7 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData
                                                /* paint is stored on dry and wet layers, so mix final color first */
                                                float *fcolor = MEM_callocN(sizeof(float)*sData->total_points*4, "Temp paint color");
 
-                                               #ifdef _OPENMP
                                                #pragma omp parallel for schedule(static)
-                                               #endif
                                                for (i=0; i<sData->total_points; i++) {
                                                        int j=i*4;
 
@@ -1581,45 +1542,42 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData
                                                        if (!col) col = CustomData_add_layer(&result->faceData, CD_WEIGHT_MCOL, CD_CALLOC, NULL, numOfFaces);
 
                                                        if (col) {
-                                                               #ifdef _OPENMP
                                                                #pragma omp parallel for schedule(static)
-                                                               #endif
                                                                for (i=0; i<numOfFaces; i++) {
                                                                        int j=0;
-                                                                       float invAlpha;
                                                                        Material *material = give_current_material(ob, mface[i].mat_nr+1);
 
                                                                        for (; j<((mface[i].v4)?4:3); j++) {
                                                                                int index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: mface[i].v4;
 
                                                                                if (surface->preview_id == MOD_DPAINT_SURFACE_PREV_PAINT) {
+                                                                                       float c[3];
                                                                                        index *= 4;
-                                                                                       invAlpha = 1.0f - fcolor[index+3];
 
                                                                                        /* Apply material color as base vertex color for preview */
                                                                                        col[i*4+j].a = 255;
                                                                                        if (material) {
-                                                                                               col[i*4+j].r = (unsigned char)(material->b*255);
-                                                                                               col[i*4+j].g = (unsigned char)(material->g*255);
-                                                                                               col[i*4+j].b = (unsigned char)(material->r*255);
+                                                                                               c[0] = material->r;
+                                                                                               c[1] = material->g;
+                                                                                               c[2] = material->b;
                                                                                        }
-                                                                                       else {
-                                                                                               col[i*4+j].r = 165;
-                                                                                               col[i*4+j].g = 165;
-                                                                                               col[i*4+j].b = 165;
+                                                                                       else { /* default grey */
+                                                                                               c[0] = 0.65f;
+                                                                                               c[1] = 0.65f;
+                                                                                               c[2] = 0.65f;
                                                                                        }
-
                                                                                        /* mix surface color */
-                                                                                       col[i*4+j].r = (char)(((float)col[i*4+j].r)*invAlpha + (fcolor[index+2]*255*fcolor[index+3]));
-                                                                                       col[i*4+j].g = (char)(((float)col[i*4+j].g)*invAlpha + (fcolor[index+1]*255*fcolor[index+3]));
-                                                                                       col[i*4+j].b = (char)(((float)col[i*4+j].b)*invAlpha + (fcolor[index]*255*fcolor[index+3]));
+                                                                                       interp_v3_v3v3(c, c, &fcolor[index], fcolor[index+3]);
+
+                                                                                       col[i*4+j].r = FTOCHAR(c[2]);
+                                                                                       col[i*4+j].g = FTOCHAR(c[1]);
+                                                                                       col[i*4+j].b = FTOCHAR(c[0]);
                                                                                }
                                                                                else {
-                                                                                       float wetness = (pPoint[index].wetness<1.0f) ? pPoint[index].wetness : 1.0f;
                                                                                        col[i*4+j].a = 255;
-                                                                                       col[i*4+j].r = (char)(wetness*255);
-                                                                                       col[i*4+j].g = (char)(wetness*255);
-                                                                                       col[i*4+j].b = (char)(wetness*255);
+                                                                                       col[i*4+j].r = FTOCHAR(pPoint[index].wetness);
+                                                                                       col[i*4+j].g = FTOCHAR(pPoint[index].wetness);
+                                                                                       col[i*4+j].b = FTOCHAR(pPoint[index].wetness);
                                                                                }
                                                                        }
                                                                }
@@ -1633,19 +1591,17 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData
                                                /* paint layer */
                                                col = CustomData_get_layer_named(&result->faceData, CD_MCOL, surface->output_name);
                                                if (col) {
-                                                       #ifdef _OPENMP
                                                        #pragma omp parallel for schedule(static)
-                                                       #endif
                                                        for (i=0; i<numOfFaces; i++) {
                                                                int j=0;
                                                                for (; j<((mface[i].v4)?4:3); j++) {
                                                                        int index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: mface[i].v4;
                                                                        index *= 4;
 
-                                                                       col[i*4+j].a = (char)(fcolor[index+3]*255);
-                                                                       col[i*4+j].r = (char)(fcolor[index+2]*255);
-                                                                       col[i*4+j].g = (char)(fcolor[index+1]*255);
-                                                                       col[i*4+j].b = (char)(fcolor[index]*255);
+                                                                       col[i*4+j].a = FTOCHAR(fcolor[index+3]);
+                                                                       col[i*4+j].r = FTOCHAR(fcolor[index+2]);
+                                                                       col[i*4+j].g = FTOCHAR(fcolor[index+1]);
+                                                                       col[i*4+j].b = FTOCHAR(fcolor[index]);
                                                                }
                                                        }
                                                }
@@ -1655,20 +1611,16 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData
                                                /* wet layer */
                                                col = CustomData_get_layer_named(&result->faceData, CD_MCOL, surface->output_name2);
                                                if (col) {
-                                                       #ifdef _OPENMP
                                                        #pragma omp parallel for schedule(static)
-                                                       #endif
                                                        for (i=0; i<numOfFaces; i++) {
                                                                int j=0;
 
                                                                for (; j<((mface[i].v4)?4:3); j++) {
                                                                        int index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: mface[i].v4;
-
-                                                                       float wetness = (pPoint[index].wetness<1.0f) ? pPoint[index].wetness : 1.0f;
                                                                        col[i*4+j].a = 255;
-                                                                       col[i*4+j].r = (char)(wetness*255);
-                                                                       col[i*4+j].g = (char)(wetness*255);
-                                                                       col[i*4+j].b = (char)(wetness*255);
+                                                                       col[i*4+j].r = FTOCHAR(pPoint[index].wetness);
+                                                                       col[i*4+j].g = FTOCHAR(pPoint[index].wetness);
+                                                                       col[i*4+j].b = FTOCHAR(pPoint[index].wetness);
                                                                }
                                                        }
                                                }
@@ -1689,21 +1641,18 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData
                                                        if (!col) col = CustomData_add_layer(&result->faceData, CD_WEIGHT_MCOL, CD_CALLOC, NULL, numOfFaces);
 
                                                        if (col) {
-                                                               #ifdef _OPENMP
                                                                #pragma omp parallel for schedule(static)
-                                                               #endif
                                                                for (i=0; i<numOfFaces; i++) {
                                                                        float temp_color[3];
                                                                        int j=0;
                                                                        for (; j<((mface[i].v4)?4:3); j++) {
                                                                                int index = (j==0)?mface[i].v1: (j==1)?mface[i].v2: (j==2)?mface[i].v3: mface[i].v4;
 
-                                                                               col[i*4+j].a = 255;
-
                                                                                weight_to_rgb(weight[index], temp_color, temp_color+1, temp_color+2);
-                                                                               col[i*4+j].r = (char)(temp_color[2]*255);
-                                                                               col[i*4+j].g = (char)(temp_color[1]*255);
-                                                                               col[i*4+j].b = (char)(temp_color[0]*255);
+                                                                               col[i*4+j].r = FTOCHAR(temp_color[2]);
+                                                                               col[i*4+j].g = FTOCHAR(temp_color[1]);
+                                                                               col[i*4+j].b = FTOCHAR(temp_color[0]);
+                                                                               col[i*4+j].a = 255;
                                                                        }
                                                                }
                                                                pmd->canvas->flags |= MOD_DPAINT_PREVIEW_READY;
@@ -1717,17 +1666,8 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData
                                                if (defgrp_index >= 0 && dvert) {
                                                        int i;
                                                        for(i=0; i<sData->total_points; i++) {
-                                                               int j;
                                                                MDeformVert *dv= &dvert[i];
-                                                               MDeformWeight *def_weight = NULL;
-
-                                                               /* check if this vertex has a weight */
-                                                               for (j=0; j<dv->totweight; j++) {
-                                                                       if (dv->dw[j].def_nr == defgrp_index) {
-                                                                               def_weight = &dv->dw[j];
-                                                                               break;
-                                                                       }
-                                                               }
+                                                               MDeformWeight *def_weight = defvert_find_index(dv, defgrp_index);
 
                                                                /* skip if weight value is 0 and no existing weight is found */
                                                                if (!def_weight && !weight[i])
@@ -1758,9 +1698,7 @@ static struct DerivedMesh *dynamicPaint_Modifier_apply(DynamicPaintModifierData
                                                int i;
                                                PaintWavePoint* wPoint = (PaintWavePoint*)sData->type_data;
 
-                                               #ifdef _OPENMP
                                                #pragma omp parallel for schedule(static)
-                                               #endif
                                                for (i=0; i<sData->total_points; i++) {
                                                        float normal[3];
                                                        normal_short_to_float_v3(normal, mvert[i].no);
@@ -2118,8 +2056,8 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
        int *final_index;
        int aa_samples;
 
-       if (!dm) return printError(canvas, "Canvas mesh not updated.");
-       if (surface->format != MOD_DPAINT_SURFACE_F_IMAGESEQ) return printError(canvas, "Can't bake non-\"image sequence\" formats.");
+       if (!dm) return setError(canvas, "Canvas mesh not updated.");
+       if (surface->format != MOD_DPAINT_SURFACE_F_IMAGESEQ) return setError(canvas, "Can't bake non-\"image sequence\" formats.");
 
        numOfFaces = dm->getNumFaces(dm);
        mvert = dm->getVertArray(dm);
@@ -2130,8 +2068,8 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
        tface = CustomData_get_layer_named(&dm->faceData, CD_MTFACE, uvname);
 
        /* Check for validity   */
-       if (!tface) return printError(canvas, "No UV data on canvas.");
-       if (surface->image_resolution < 16 || surface->image_resolution > 8192) return printError(canvas, "Invalid resolution.");
+       if (!tface) return setError(canvas, "No UV data on canvas.");
+       if (surface->image_resolution < 16 || surface->image_resolution > 8192) return setError(canvas, "Invalid resolution.");
 
        w = h = surface->image_resolution;
 
@@ -2143,7 +2081,7 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
        /* Init data struct */
        if (surface->data) dynamicPaint_freeSurfaceData(surface);
        sData = surface->data = MEM_callocN(sizeof(PaintSurfaceData), "PaintSurfaceData");
-       if (!surface->data) return printError(canvas, "Not enough free memory.");
+       if (!surface->data) return setError(canvas, "Not enough free memory.");
 
        aa_samples = (surface->flags & MOD_DPAINT_ANTIALIAS) ? 5 : 1;
        tempPoints = (struct PaintUVPoint *) MEM_callocN(w*h*sizeof(struct PaintUVPoint), "Temp PaintUVPoint");
@@ -2169,8 +2107,8 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
                int numOfVert = (mface[ty].v4) ? 4 : 3;
                int i;
 
-               VECCOPY2D(faceBB[ty].min, tface[ty].uv[0]);
-               VECCOPY2D(faceBB[ty].max, tface[ty].uv[0]);
+               copy_v2_v2(faceBB[ty].min, tface[ty].uv[0]);
+               copy_v2_v2(faceBB[ty].max, tface[ty].uv[0]);
 
                for (i = 1; i<numOfVert; i++) {
                        if (tface[ty].uv[i][0] < faceBB[ty].min[0]) faceBB[ty].min[0] = tface[ty].uv[i][0];
@@ -2186,9 +2124,7 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
        *       if pixel is uv-mapped on a canvas face.
        */
        if (!error) {
-               #ifdef _OPENMP
                #pragma omp parallel for schedule(static)
-               #endif
                for (ty = 0; ty < h; ty++)
                {
                        int tx;
@@ -2243,9 +2179,9 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
 
                                                /*  Calculate point inside a triangle check
                                                *       for uv0,1,2 */
-                                               VECSUB2D(d1,  tface[i].uv[2], tface[i].uv[0]);  // uv2 - uv0
-                                               VECSUB2D(d2,  tface[i].uv[1], tface[i].uv[0]);  // uv1 - uv0
-                                               VECSUB2D(d3,  point[sample], tface[i].uv[0]);   // point - uv0
+                                               sub_v2_v2v2(d1,  tface[i].uv[2], tface[i].uv[0]);       // uv2 - uv0
+                                               sub_v2_v2v2(d2,  tface[i].uv[1], tface[i].uv[0]);       // uv1 - uv0
+                                               sub_v2_v2v2(d3,  point[sample], tface[i].uv[0]);        // point - uv0
 
                                                dot00 = d1[0]*d1[0] + d1[1]*d1[1];
                                                dot01 = d1[0]*d2[0] + d1[1]*d2[1];
@@ -2265,7 +2201,7 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
                                                {
 
                                                        /* change d2 to test the other half     */
-                                                       VECSUB2D(d2,  tface[i].uv[3], tface[i].uv[0]);  // uv3 - uv0
+                                                       sub_v2_v2v2(d2,  tface[i].uv[3], tface[i].uv[0]);       // uv3 - uv0
 
                                                        /* test again   */
                                                        dot00 = d1[0]*d1[0] + d1[1]*d1[1];
@@ -2292,14 +2228,14 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
 
                                                        /* Get triagnle uvs     */
                                                        if (isInside==1) {
-                                                               VECCOPY2D(uv1co, tface[i].uv[0]);
-                                                               VECCOPY2D(uv2co, tface[i].uv[1]);
-                                                               VECCOPY2D(uv3co, tface[i].uv[2]);
+                                                               copy_v2_v2(uv1co, tface[i].uv[0]);
+                                                               copy_v2_v2(uv2co, tface[i].uv[1]);
+                                                               copy_v2_v2(uv3co, tface[i].uv[2]);
                                                        }
                                                        else {
-                                                               VECCOPY2D(uv1co, tface[i].uv[0]);
-                                                               VECCOPY2D(uv2co, tface[i].uv[2]);
-                                                               VECCOPY2D(uv3co, tface[i].uv[3]);
+                                                               copy_v2_v2(uv1co, tface[i].uv[0]);
+                                                               copy_v2_v2(uv2co, tface[i].uv[2]);
+                                                               copy_v2_v2(uv3co, tface[i].uv[3]);
                                                        }
 
                                                        /* Add b-weights per anti-aliasing sample       */
@@ -2333,9 +2269,7 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
                *       If so use that polygon as pixel surface.
                *       (To avoid seams on uv island edges)
                */
-               #ifdef _OPENMP
                #pragma omp parallel for schedule(static)
-               #endif
                for (ty = 0; ty < h; ty++)
                {
                        int tx;
@@ -2374,14 +2308,14 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
 
                                                                        /* Now calculate pixel data for this pixel as it was on polygon surface */
                                                                        if (!tempPoints[ind].quad) {
-                                                                               VECCOPY2D(uv1co, tface[i].uv[0]);
-                                                                               VECCOPY2D(uv2co, tface[i].uv[1]);
-                                                                               VECCOPY2D(uv3co, tface[i].uv[2]);
+                                                                               copy_v2_v2(uv1co, tface[i].uv[0]);
+                                                                               copy_v2_v2(uv2co, tface[i].uv[1]);
+                                                                               copy_v2_v2(uv3co, tface[i].uv[2]);
                                                                        }
                                                                        else {
-                                                                               VECCOPY2D(uv1co, tface[i].uv[0]);
-                                                                               VECCOPY2D(uv2co, tface[i].uv[2]);
-                                                                               VECCOPY2D(uv3co, tface[i].uv[3]);
+                                                                               copy_v2_v2(uv1co, tface[i].uv[0]);
+                                                                               copy_v2_v2(uv2co, tface[i].uv[2]);
+                                                                               copy_v2_v2(uv3co, tface[i].uv[3]);
                                                                        }
 
                                                                        /* Add b-weights per anti-aliasing sample       */
@@ -2514,7 +2448,7 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
                        }
                }
        }
-       if (error==1) printError(canvas, "Not enough free memory.");
+       if (error==1) setError(canvas, "Not enough free memory.");
 
        if (faceBB) MEM_freeN(faceBB);
        if (tempPoints) MEM_freeN(tempPoints);
@@ -2529,9 +2463,7 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
                /*  -----------------------------------------------------------------
                *       For debug, output pixel statuses to the color map
                *       -----------------------------------------------------------------*/
-               #ifdef _OPENMP
                #pragma omp parallel for schedule(static)
-               #endif
                for (index = 0; index < sData->total_points; index++)
                {
                        ImgSeqFormatData *f_data = (ImgSeqFormatData*)sData->format_data;
@@ -2557,19 +2489,23 @@ int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
 /*
 *      Outputs an image file from uv surface data.
 */
-void dynamicPaint_outputImage(DynamicPaintSurface *surface, char* filename, short format, short type)
+void dynamicPaint_outputSurfaceImage(DynamicPaintSurface *surface, char* filename, short output_layer)
 {
        int index;
        ImBuf* ibuf = NULL;
        PaintSurfaceData *sData = surface->data;
        ImgSeqFormatData *f_data = (ImgSeqFormatData*)sData->format_data;
-       char output_file[250];
-
-       if (sData == NULL || sData->type_data == NULL) {printError(surface->canvas, "Image save failed: Invalid surface.");return;}
-
-       if (format == DPOUTPUT_JPEG) BLI_snprintf(output_file, sizeof(output_file),"%s.jpg",filename);
-       else if (format == DPOUTPUT_OPENEXR) BLI_snprintf(output_file, sizeof(output_file),"%s.exr",filename);
-       else BLI_snprintf(output_file, sizeof(output_file),"%s.png",filename);
+       /* OpenEXR or PNG       */
+       int format = (surface->image_fileformat & MOD_DPAINT_IMGFORMAT_OPENEXR) ? R_OPENEXR : R_PNG;
+       char output_file[FILE_MAX];
+
+       if (!sData || !sData->type_data) {setError(surface->canvas, "Image save failed: Invalid surface.");return;}
+       /* if selected format is openexr, but current build doesnt support one */
+       #ifndef WITH_OPENEXR
+       if (format == R_OPENEXR) format = R_PNG;
+       #endif
+       BLI_strncpy(output_file, filename, sizeof(output_file));
+       BKE_add_image_extension(output_file, format);
 
        /* Validate output file path    */
        BLI_path_abs(output_file, G.main->name);
@@ -2577,87 +2513,88 @@ void dynamicPaint_outputImage(DynamicPaintSurface *surface, char* filename, shor
 
        /* Init image buffer    */
        ibuf = IMB_allocImBuf(surface->image_resolution, surface->image_resolution, 32, IB_rectfloat);
-       if (ibuf == NULL) {printError(surface->canvas, "Image save failed: Not enough free memory.");return;}
+       if (ibuf == NULL) {setError(surface->canvas, "Image save failed: Not enough free memory.");return;}
 
-       #ifdef _OPENMP
        #pragma omp parallel for schedule(static)
-       #endif
        for (index = 0; index < sData->total_points; index++)
        {
                int pos=f_data->uv_p[index].pixel_index*4;      /* image buffer position */
 
                /* Set values of preferred type */
-               if (type == DPOUTPUT_WET) {
-                       PaintPoint *point = &((PaintPoint*)sData->type_data)[index];
-                       float value = (point->wetness > 1.0f) ? 1.0f : point->wetness;
-
-                       ibuf->rect_float[pos]=value;
-                       ibuf->rect_float[pos+1]=value;
-                       ibuf->rect_float[pos+2]=value;
-                       ibuf->rect_float[pos+3]=1.0f;
-               }
-               else if (type == DPOUTPUT_PAINT) {
-                       PaintPoint *point = &((PaintPoint*)sData->type_data)[index];
-
-                       ibuf->rect_float[pos]   = point->color[0];
-                       ibuf->rect_float[pos+1] = point->color[1];
-                       ibuf->rect_float[pos+2] = point->color[2];
-                       /* mix wet layer */
-                       if (point->e_alpha) mixColors(&ibuf->rect_float[pos], point->alpha, point->e_color, point->e_alpha);
-
-                       /* use highest alpha    */
-                       ibuf->rect_float[pos+3] = (point->e_alpha > point->alpha) ? point->e_alpha : point->alpha;
-
-                       /* Multiply color by alpha if enabled   */
-                       if (surface->flags & MOD_DPAINT_MULALPHA) {
-                               ibuf->rect_float[pos]   *= ibuf->rect_float[pos+3];
-                               ibuf->rect_float[pos+1] *= ibuf->rect_float[pos+3];
-                               ibuf->rect_float[pos+2] *= ibuf->rect_float[pos+3];
+               if (output_layer == 1) {
+                       /* wetmap */
+                       if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+                               PaintPoint *point = &((PaintPoint*)sData->type_data)[index];
+                               float value = (point->wetness > 1.0f) ? 1.0f : point->wetness;
+
+                               ibuf->rect_float[pos]=value;
+                               ibuf->rect_float[pos+1]=value;
+                               ibuf->rect_float[pos+2]=value;
+                               ibuf->rect_float[pos+3]=1.0f;
                        }
                }
-               else if (type == DPOUTPUT_DISPLACE) {
-                       float depth = ((float*)sData->type_data)[index];
-                       if (surface->depth_clamp)
-                               depth /= surface->depth_clamp;
-
-                       if (surface->disp_type == MOD_DPAINT_DISP_DISPLACE) {
-                               depth = (0.5f - depth/2.0f);
+               else if (output_layer == 0) {
+                       /* Paintmap */
+                       if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+                               PaintPoint *point = &((PaintPoint*)sData->type_data)[index];
+
+                               ibuf->rect_float[pos]   = point->color[0];
+                               ibuf->rect_float[pos+1] = point->color[1];
+                               ibuf->rect_float[pos+2] = point->color[2];
+                               /* mix wet layer */
+                               if (point->e_alpha) mixColors(&ibuf->rect_float[pos], point->alpha, point->e_color, point->e_alpha);
+
+                               /* use highest alpha    */
+                               ibuf->rect_float[pos+3] = (point->e_alpha > point->alpha) ? point->e_alpha : point->alpha;
+
+                               /* Multiply color by alpha if enabled   */
+                               if (surface->flags & MOD_DPAINT_MULALPHA) {
+                                       ibuf->rect_float[pos]   *= ibuf->rect_float[pos+3];
+                                       ibuf->rect_float[pos+1] *= ibuf->rect_float[pos+3];
+                                       ibuf->rect_float[pos+2] *= ibuf->rect_float[pos+3];
+                               }
                        }
+                       /* displace */
+                       else if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE) {
+                               float depth = ((float*)sData->type_data)[index];
+                               if (surface->depth_clamp)
+                                       depth /= surface->depth_clamp;
 
-                       CLAMP(depth, 0.0f, 1.0f);
+                               if (surface->disp_type == MOD_DPAINT_DISP_DISPLACE) {
+                                       depth = (0.5f - depth/2.0f);
+                               }
 
-                       ibuf->rect_float[pos]=depth;
-                       ibuf->rect_float[pos+1]=depth;
-                       ibuf->rect_float[pos+2]=depth;
-                       ibuf->rect_float[pos+3]=1.0f;
-               }
-               else if (type == DPOUTPUT_WAVES) {
-                       PaintWavePoint *wPoint = &((PaintWavePoint*)sData->type_data)[index];
-                       float depth = wPoint->height;
-                       if (surface->depth_clamp)
-                                       depth /= surface->depth_clamp;
-                       depth = (0.5f + depth/2.0f);
-                       CLAMP(depth, 0.0f, 1.0f);
+                               CLAMP(depth, 0.0f, 1.0f);
 
-                       ibuf->rect_float[pos]=depth;
-                       ibuf->rect_float[pos+1]=depth;
-                       ibuf->rect_float[pos+2]=depth;
-                       ibuf->rect_float[pos+3]=1.0f;
+                               ibuf->rect_float[pos]=depth;
+                               ibuf->rect_float[pos+1]=depth;
+                               ibuf->rect_float[pos+2]=depth;
+                               ibuf->rect_float[pos+3]=1.0f;
+                       }
+                       /* waves */
+                       else if (surface->type == MOD_DPAINT_SURFACE_T_WAVE) {
+                               PaintWavePoint *wPoint = &((PaintWavePoint*)sData->type_data)[index];
+                               float depth = wPoint->height;
+                               if (surface->depth_clamp)
+                                               depth /= surface->depth_clamp;
+                               depth = (0.5f + depth/2.0f);
+                               CLAMP(depth, 0.0f, 1.0f);
+
+                               ibuf->rect_float[pos]=depth;
+                               ibuf->rect_float[pos+1]=depth;
+                               ibuf->rect_float[pos+2]=depth;
+                               ibuf->rect_float[pos+3]=1.0f;
+                       }
                }
        }
 
-       /* Set output format*/
-       if (format == DPOUTPUT_JPEG) {  /* JPEG */
-               ibuf->ftype= JPG|95;
-       }
+       /* Set output format, png in case exr isnt supported */
+       ibuf->ftype= PNG|95;
 #ifdef WITH_OPENEXR
-       else if (format == DPOUTPUT_OPENEXR) {  /* OpenEXR 32-bit float */
+       if (format == R_OPENEXR) {      /* OpenEXR 32-bit float */
                ibuf->ftype = OPENEXR | OPENEXR_COMPRESS;
        }
 #endif
-       else {  /* DPOUTPUT_PNG */
-               ibuf->ftype= PNG|95;
-       }
 
        /* Save image */
        IMB_saveiff(ibuf, output_file, IB_rectfloat);
@@ -2766,7 +2703,7 @@ static void mesh_faces_spherecast_dp(void *userdata, int index, const BVHTreeRay
 
        do
        {       
-               float dist = ray_tri_intersection(ray, hit->dist, t0, t1, t2);
+               float dist = bvhtree_ray_tri_intersection(ray, hit->dist, t0, t1, t2);
 
                if(dist >= 0 && dist < hit->dist)
                {
@@ -2812,7 +2749,7 @@ static void mesh_faces_nearest_point_dp(void *userdata, int index, const float *
                {
                        nearest->index = index;
                        nearest->dist = dist;
-                       VECCOPY(nearest->co, nearest_tmp);
+                       copy_v3_v3(nearest->co, nearest_tmp);
                        nearest->no[0] = (quad) ? 1.0f : 0.0f;
                }
 
@@ -2861,7 +2798,7 @@ static void dynamicPaint_mixPaintColors(DynamicPaintSurface *surface, int index,
                /* only increase wetness if it's below paint level      */
                wetness = (*paintWetness) * pPoint->e_alpha;
                if (pPoint->wetness < wetness) pPoint->wetness = wetness;
-               pPoint->state = 2;
+               pPoint->state = DPAINT_PAINT_NEW;
        }
        /* Erase paint  */
        else {
@@ -2909,13 +2846,13 @@ static void dynamicPaint_mixWaveHeight(PaintWavePoint *wPoint, DynamicPaintBrush
        if (hit) {
                if (brush->wave_type == MOD_DPAINT_WAVEB_DEPTH) {
                        wPoint->height = isect_height;
-                       wPoint->state = 1;
+                       wPoint->state = DPAINT_WAVE_OBSTACLE;
                        wPoint->velocity = 0.0f;
                }
                else if (brush->wave_type == MOD_DPAINT_WAVEB_FORCE)
                        wPoint->velocity = isect_height;
                else if (brush->wave_type == MOD_DPAINT_WAVEB_REFLECT)
-                       wPoint->state = 2;
+                       wPoint->state = DPAINT_WAVE_REFLECT_ONLY;
        }
 }
 
@@ -3061,19 +2998,17 @@ static void dynamicPaint_brushMeshCalculateVelocity(Scene *scene, Object *ob, Dy
                mvert_p = mvert_c;
 
        /* calculate speed */
-       #ifdef _OPENMP
        #pragma omp parallel for schedule(static)
-       #endif
        for (i=0; i<numOfVerts_c; i++) {
                float p1[3], p2[3];
 
-               VECCOPY(p1, mvert_p[i].co);
+               copy_v3_v3(p1, mvert_p[i].co);
                mul_m4_v3(prev_obmat, p1);
 
-               VECCOPY(p2, mvert_c[i].co);
+               copy_v3_v3(p2, mvert_c[i].co);
                mul_m4_v3(ob->obmat, p2);
 
-               VECSUB((*brushVel)[i].v, p2, p1);
+               sub_v3_v3v3((*brushVel)[i].v, p2, p1);
                mul_v3_fl((*brushVel)[i].v, 1.0f/timescale);
        }
 
@@ -3111,7 +3046,7 @@ static void dynamicPaint_brushObjectCalculateVelocity(Scene *scene, Object *ob,
        mul_m4_v3(prev_obmat, prev_loc);
        mul_m4_v3(ob->obmat, cur_loc);
 
-       VECSUB(brushVel->v, cur_loc, prev_loc);
+       sub_v3_v3v3(brushVel->v, cur_loc, prev_loc);
        mul_v3_fl(brushVel->v, 1.0f/timescale);
 }
 
@@ -3158,12 +3093,12 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, DynamicPaintBrus
                                mul_mat3_m4_v3(brushOb->obmat, nor);
                                normalize_v3(nor);
 
-                               VECADD(avg_brushNor, avg_brushNor, nor);
+                               add_v3_v3(avg_brushNor, nor);
                        }
                }
 
                if (brush->collision & MOD_DPAINT_COL_DIST && brush->flags & MOD_DPAINT_PROX_PROJECT) {
-                       VECMULVAL(avg_brushNor, 1.0f/(float)numOfVerts);
+                       mul_v3_fl(avg_brushNor, 1.0f/(float)numOfVerts);
                        /* instead of null vector use positive z */
                        if (!(MIN3(avg_brushNor[0],avg_brushNor[1],avg_brushNor[2])))
                                avg_brushNor[2] = 1.0f;
@@ -3188,9 +3123,7 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, DynamicPaintBrus
                                        continue;
 
                                /* loop through cell points and process brush */
-                               #ifdef _OPENMP
                                #pragma omp parallel for schedule(static)
-                               #endif
                                for (id = 0; id < grid->s_num[c_index]; id++)
                                {
                                        int index = grid->t_index[grid->s_pos[c_index] + id];
@@ -3231,11 +3164,11 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, DynamicPaintBrus
                                                        sample_factor = 1.0f;
 
                                                /* Get current sample position in world coordinates     */
-                                               VECCOPY(ray_start, bData->realCoord[bData->s_pos[index]+ss].v);
-                                               VECCOPY(ray_dir, bData->bNormal[index].invNorm);
+                                               copy_v3_v3(ray_start, bData->realCoord[bData->s_pos[index]+ss].v);
+                                               copy_v3_v3(ray_dir, bData->bNormal[index].invNorm);
 
                                                /* a simple hack to minimize chance of ray leaks at identical ray <-> edge locations */
-                                               VECADDVAL(ray_start, 0.001f);
+                                               add_v3_fl(ray_start, 0.001f);
 
                                                hit.index = -1;
                                                hit.dist = 9999;
@@ -3265,7 +3198,7 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, DynamicPaintBrus
 
                                                                /* Also cast a ray in opposite direction to make sure
                                                                *  point is at least surrounded by two brush faces */
-                                                               VECMULVAL(ray_dir, -1.0f);
+                                                               mul_v3_fl(ray_dir, -1.0f);
                                                                hit.index = -1;
                                                                hit.dist = 9999;
 
@@ -3277,7 +3210,7 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, DynamicPaintBrus
                                                                        hit_found = HIT_VOLUME;
 
                                                                        /* Mark hit info */
-                                                                       VECADDFAC(hitCoord, ray_start, ray_dir, hit.dist);      /* Calculate final hit coordinates */
+                                                                       madd_v3_v3v3fl(hitCoord, ray_start, ray_dir, hit.dist); /* Calculate final hit coordinates */
                                                                        depth += dist*sample_factor;
                                                                        hitFace = f_index;
                                                                        hitQuad = quad;
@@ -3310,11 +3243,11 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, DynamicPaintBrus
                                                                float proj_ray[3] = {0.0f};
 
                                                                if (brush->ray_dir == MOD_DPAINT_RAY_CANVAS) {
-                                                                       VECCOPY(proj_ray, bData->bNormal[index].invNorm);
+                                                                       copy_v3_v3(proj_ray, bData->bNormal[index].invNorm);
                                                                        negate_v3(proj_ray);
                                                                }
                                                                else if (brush->ray_dir == MOD_DPAINT_RAY_BRUSH_AVG) {
-                                                                       VECCOPY(proj_ray, avg_brushNor);
+                                                                       copy_v3_v3(proj_ray, avg_brushNor);
                                                                }
                                                                else  { /* MOD_DPAINT_RAY_ZPLUS */
                                                                        proj_ray[2] = 1.0f;
@@ -3326,7 +3259,7 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, DynamicPaintBrus
                                                                if(BLI_bvhtree_ray_cast(treeData.tree, ray_start, proj_ray, 0.0f, &hit, mesh_faces_spherecast_dp, &treeData) != -1)
                                                                {
                                                                        proxDist = hit.dist;
-                                                                       VECADDFAC(hitCo, ray_start, proj_ray, hit.dist);        /* Calculate final hit coordinates */
+                                                                       madd_v3_v3v3fl(hitCo, ray_start, proj_ray, hit.dist);   /* Calculate final hit coordinates */
                                                                        hQuad = (hit.no[0] == 1.0f);
                                                                        face = hit.index;
                                                                }
@@ -3396,16 +3329,16 @@ static int dynamicPaint_paintMesh(DynamicPaintSurface *surface, DynamicPaintBrus
 
                                                        /* substract canvas point velocity */
                                                        if (bData->velocity) {
-                                                               VECSUB(velocity, brushPointVelocity, bData->velocity[index].v);
+                                                               sub_v3_v3v3(velocity, brushPointVelocity, bData->velocity[index].v);
                                                        }
                                                        else {
-                                                               VECCOPY(velocity, brushPointVelocity);
+                                                               copy_v3_v3(velocity, brushPointVelocity);
                                                        }
                                                        velocity_val = len_v3(velocity);
 
                                                        /* if brush has smudge enabled store brush velocity */
                                                        if (brush->flags & MOD_DPAINT_DO_SMUDGE && bData->brush_velocity) {
-                                                               VECCOPY(&bData->brush_velocity[index*4], velocity);
+                                                               copy_v3_v3(&bData->brush_velocity[index*4], velocity);
                                                                mul_v3_fl(&bData->brush_velocity[index*4], 1.0f/velocity_val);
                                                                bData->brush_velocity[index*4+3] = velocity_val;
                                                        }
@@ -3572,9 +3505,7 @@ static int dynamicPaint_paintParticles(DynamicPaintSurface *surface, ParticleSys
                                continue;
 
                        /* loop through cell points */
-                       #ifdef _OPENMP
                        #pragma omp parallel for schedule(static)
-                       #endif
                        for (id = 0; id < grid->s_num[c_index]; id++)
                        {
                                int index = grid->t_index[grid->s_pos[c_index] + id];
@@ -3692,13 +3623,13 @@ static int dynamicPaint_paintParticles(DynamicPaintSurface *surface, ParticleSys
 
                                                /* substract canvas point velocity */
                                                if (bData->velocity) {
-                                                       VECSUB(velocity, velocity, bData->velocity[index].v);
+                                                       sub_v3_v3(velocity, bData->velocity[index].v);
                                                }
                                                velocity_val = len_v3(velocity);
 
                                                /* store brush velocity for smudge */
                                                if (brush->flags & MOD_DPAINT_DO_SMUDGE && bData->brush_velocity) {
-                                                       VECCOPY(&bData->brush_velocity[index*4], velocity);
+                                                       copy_v3_v3(&bData->brush_velocity[index*4], velocity);
                                                        mul_v3_fl(&bData->brush_velocity[index*4], 1.0f/velocity_val);
                                                        bData->brush_velocity[index*4+3] = velocity_val;
                                                }
@@ -3743,9 +3674,7 @@ static int dynamicPaint_paintSinglePoint(DynamicPaintSurface *surface, float *po
        /*
        *       Loop through every surface point
        */
-       #ifdef _OPENMP
        #pragma omp parallel for schedule(static)
-       #endif
        for (index = 0; index < sData->total_points; index++)
        {
                float distance = len_v3v3(pointCoord, bData->realCoord[bData->s_pos[index]].v);
@@ -3774,7 +3703,7 @@ static int dynamicPaint_paintSinglePoint(DynamicPaintSurface *surface, float *po
                                float hit_coord[3];
                                MVert *mvert = brush->dm->getVertArray(brush->dm);
                                /* use dummy coord of first vertex */
-                               VECCOPY(hit_coord, mvert[0].co);
+                               copy_v3_v3(hit_coord, mvert[0].co);
                                mul_m4_v3(brushOb->obmat, hit_coord);
 
                                dynamicPaint_doMaterialTex(bMats, paintColor, &alpha_factor, brushOb, bData->realCoord[bData->s_pos[index]].v, hit_coord, 0, 0, brush->dm);
@@ -3789,16 +3718,16 @@ static int dynamicPaint_paintSinglePoint(DynamicPaintSurface *surface, float *po
 
                                /* substract canvas point velocity */
                                if (bData->velocity) {
-                                       VECSUB(velocity, brushVel.v, bData->velocity[index].v);
+                                       sub_v3_v3v3(velocity, brushVel.v, bData->velocity[index].v);
                                }
                                else {
-                                       VECCOPY(velocity, brushVel.v);
+                                       copy_v3_v3(velocity, brushVel.v);
                                }
                                velocity_val = len_v3(velocity);
 
                                /* store brush velocity for smudge */
                                if (brush->flags & MOD_DPAINT_DO_SMUDGE && bData->brush_velocity) {
-                                       VECCOPY(&bData->brush_velocity[index*4], velocity);
+                                       copy_v3_v3(&bData->brush_velocity[index*4], velocity);
                                        mul_v3_fl(&bData->brush_velocity[index*4], 1.0f/velocity_val);
                                        bData->brush_velocity[index*4+3] = velocity_val;
                                }
@@ -3855,9 +3784,7 @@ static void dynamicPaint_prepareNeighbourData(DynamicPaintSurface *surface, int
        bNeighs = bData->bNeighs = MEM_mallocN(sData->adj_data->total_targets*sizeof(struct BakeNeighPoint),"PaintEffectBake");
        if (!bNeighs) return;
 
-       #ifdef _OPENMP
        #pragma omp parallel for schedule(static)
-       #endif
        for (index = 0; index < sData->total_points; index++)
        {
                int i;
@@ -4049,9 +3976,7 @@ static int dynamicPaint_prepareEffectStep(DynamicPaintSurface *surface, Scene *s
                *force = MEM_mallocN(sData->total_points*4*sizeof(float), "PaintEffectForces");
 
                if (*force) {
-                       #ifdef _OPENMP
                        #pragma omp parallel for schedule(static)
-                       #endif
                        for (index = 0; index < sData->total_points; index++)
                        {
                                float forc[3] = {0};
@@ -4079,7 +4004,7 @@ static int dynamicPaint_prepareEffectStep(DynamicPaintSurface *surface, Scene *s
                                        /* acceleration */
                                        if (bData->prev_velocity && surface->drip_acc) {
                                                float acc[3];
-                                               VECCOPY(acc, bData->velocity[index].v);
+                                               copy_v3_v3(acc, bData->velocity[index].v);
                                                sub_v3_v3(acc, bData->prev_velocity[index].v);
                                                madd_v3_v3fl(forc, acc, surface->drip_acc*(-1.0f));
                                        }
@@ -4089,7 +4014,7 @@ static int dynamicPaint_prepareEffectStep(DynamicPaintSurface *surface, Scene *s
                                (*force)[index*4+3] = len_v3(forc);
                                /* normalize and copy */
                                if ((*force)[index*4+3]) mul_v3_fl(forc, 1.0f/(*force)[index*4+3]);
-                               VECCOPY(&((*force)[index*4]), forc);
+                               copy_v3_v3(&((*force)[index*4]), forc);
                        }
 
                        /* calculate average values (single thread) */
@@ -4140,9 +4065,7 @@ static void dynamicPaint_doEffectStep(DynamicPaintSurface *surface, float *force
                /* Copy current surface to the previous points array to read unmodified values  */
                memcpy(prevPoint, sData->type_data, sData->total_points*sizeof(struct PaintPoint));
 
-               #ifdef _OPENMP
                #pragma omp parallel for schedule(static)
-               #endif
                for (index = 0; index < sData->total_points; index++)
                {
                        int i;
@@ -4202,9 +4125,7 @@ static void dynamicPaint_doEffectStep(DynamicPaintSurface *surface, float *force
                /* Copy current surface to the previous points array to read unmodified values  */
                memcpy(prevPoint, sData->type_data, sData->total_points*sizeof(struct PaintPoint));
 
-               #ifdef _OPENMP
                #pragma omp parallel for schedule(static)
-               #endif
                for (index = 0; index < sData->total_points; index++)
                {
                        int i;
@@ -4296,9 +4217,7 @@ static void dynamicPaint_doEffectStep(DynamicPaintSurface *surface, float *force
                }
 
                /* Keep values within acceptable range */
-               #ifdef _OPENMP
                #pragma omp parallel for schedule(static)
-               #endif
                for (index = 0; index < sData->total_points; index++)
                {
                        PaintPoint *cPoint = &((PaintPoint*)sData->type_data)[index];
@@ -4353,9 +4272,7 @@ void dynamicPaint_doWaveStep(DynamicPaintSurface *surface, float timescale)
                /* copy previous frame data */
                memcpy(prevPoint, sData->type_data, sData->total_points*sizeof(PaintWavePoint));
 
-               #ifdef _OPENMP
                #pragma omp parallel for schedule(static)
-               #endif
                for (index = 0; index < sData->total_points; index++) {
                        PaintWavePoint *wPoint = &((PaintWavePoint*)sData->type_data)[index];
                        int numOfNeighs = sData->adj_data->n_num[index];
@@ -4409,12 +4326,10 @@ void dynamicPaint_doWaveStep(DynamicPaintSurface *surface, float timescale)
        }
 
        /* reset state */
-       #ifdef _OPENMP
        #pragma omp parallel for schedule(static)
-       #endif
        for (index = 0; index < sData->total_points; index++) {
                PaintWavePoint *wPoint = &((PaintWavePoint*)sData->type_data)[index];
-               wPoint->state = 0;
+               wPoint->state = DPAINT_WAVE_NONE;
        }
 
        MEM_freeN(prevPoint);
@@ -4426,9 +4341,7 @@ static void dynamicPaint_surfacePreStep(DynamicPaintSurface *surface, float time
        PaintSurfaceData *sData = surface->data;
        int index;
 
-       #ifdef _OPENMP
        #pragma omp parallel for schedule(static)
-       #endif
        for (index=0; index<sData->total_points; index++)
        {
                /* Do drying dissolve effects */
@@ -4438,7 +4351,7 @@ static void dynamicPaint_surfacePreStep(DynamicPaintSurface *surface, float time
                        if (pPoint->wetness > 0.0f || pPoint->state > 0) {
                                /* for every drying step blend wet paint to the background */
                                if (pPoint->e_alpha) mixColors(pPoint->color, pPoint->alpha, pPoint->e_color, pPoint->e_alpha);
-                               pPoint->state = 1;
+                               pPoint->state = DPAINT_PAINT_WET;
 
                                /* only increase alpha if wet paint has higher  */
                                if (pPoint->e_alpha > pPoint->alpha) pPoint->alpha = pPoint->e_alpha;
@@ -4450,7 +4363,7 @@ static void dynamicPaint_surfacePreStep(DynamicPaintSurface *surface, float time
                        if (pPoint->wetness <= 0.0f) {
                                pPoint->wetness = 0.0f;
                                pPoint->e_alpha = 0.0f;
-                               pPoint->state = 0;
+                               pPoint->state = DPAINT_PAINT_DRY;
                        }
 
                        if (surface->flags & MOD_DPAINT_DISSOLVE) {
@@ -4496,9 +4409,7 @@ static int dynamicPaint_surfaceHasMoved(DynamicPaintSurface *surface, Object *ob
        }
 
        /* vertices */
-       #ifdef _OPENMP
        #pragma omp parallel for schedule(static)
-       #endif
        for (i=0; i<numOfVerts; i++) {
                int j;
                for (j=0; j<3; j++)
@@ -4587,7 +4498,7 @@ static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, Scene *sc
                        if (bData->realCoord) MEM_freeN(bData->realCoord);
                        if (canvas_verts) MEM_freeN(canvas_verts);
 
-                       return printError(surface->canvas, "Not enough free memory.");
+                       return setError(surface->canvas, "Not enough free memory.");
                }
 
                new_bdata = 1;
@@ -4606,25 +4517,21 @@ static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, Scene *sc
        /*
        *       Make a transformed copy of canvas derived mesh vertices to avoid recalculation.
        */
-       #ifdef _OPENMP
        #pragma omp parallel for schedule(static)
-       #endif
        for (index=0; index<canvasNumOfVerts; index++) {
-               VECCOPY(canvas_verts[index].v, mvert[index].co);
+               copy_v3_v3(canvas_verts[index].v, mvert[index].co);
                mul_m4_v3(ob->obmat, canvas_verts[index].v);
        }
 
        /*
        *       Prepare each surface point for a new step
        */
-       #ifdef _OPENMP
        #pragma omp parallel for schedule(static)
-       #endif
        for (index=0; index<sData->total_points; index++)
        {
                float prev_point[3];
                if (do_velocity_data && !new_bdata) {
-                       VECCOPY(prev_point, bData->realCoord[bData->s_pos[index]].v);
+                       copy_v3_v3(prev_point, bData->realCoord[bData->s_pos[index]].v);
                }
                /*
                *       Calculate current 3D-position and normal of each surface point
@@ -4671,7 +4578,7 @@ static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, Scene *sc
                        /* calculate position for each sample */
                        for (ss=0; ss<bData->s_num[index]; ss++) {
                                /* first sample is always point center */
-                               VECCOPY(bData->realCoord[bData->s_pos[index]+ss].v, canvas_verts[index].v);
+                               copy_v3_v3(bData->realCoord[bData->s_pos[index]+ss].v, canvas_verts[index].v);
                                if (ss > 0) {
                                        int t_index = adj_data->n_index[index]+(ss-1);
                                        /* get vertex position at 1/3 of each neigh edge */
@@ -4714,7 +4621,7 @@ static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, Scene *sc
 
                /* calculate speed vector */
                if (do_velocity_data && !new_bdata && !bData->clear) {
-                       VECSUB(bData->velocity[index].v, bData->realCoord[bData->s_pos[index]].v, prev_point);
+                       sub_v3_v3v3(bData->velocity[index].v, bData->realCoord[bData->s_pos[index]].v, prev_point);
                }
        }
 
@@ -4878,7 +4785,7 @@ static int dynamicPaint_doStep(Scene *scene, Object *ob, DynamicPaintSurface *su
                        /* Allocate memory for surface previous points to read unchanged values from    */
                        prevPoint = MEM_mallocN(sData->total_points*sizeof(struct PaintPoint), "PaintSurfaceDataCopy");
                        if (!prevPoint)
-                               return printError(canvas, "Not enough free memory.");
+                               return setError(canvas, "Not enough free memory.");
 
                        /* Prepare effects and get number of required steps */
                        steps = dynamicPaint_prepareEffectStep(surface, scene, ob, &force, timescale);
index 234c191eb6b537840c838b0feeb1906325238b11..4ae29eb0c51ab9752fb8f0164e76d10a52cc3ab4 100644 (file)
@@ -60,7 +60,7 @@ float area_poly_v3(int nr, float verts[][3], const float normal[3]);
 
 float dist_to_line_v2(const float p[2], const float l1[2], const float l2[2]);
 float dist_to_line_segment_v2(const float p[2], const float l1[2], const float l2[2]);
-void closest_to_line_segment_v2(float *closest, float p[2], float l1[2], float l2[2]);
+void closest_to_line_segment_v2(float closest[2], const float p[2], const float l1[2], const float l2[2]);
 
 float dist_to_line_segment_v3(const float p[3], const float l1[3], const float l2[3]);
 float closest_to_line_v3(float r[3], const float p[3], const float l1[3], const float l2[3]);
index d0e86c44edb2dbcca0989f9448c3badb4a4819a8..05b90eed4ab677b0ec4dbe8e9d9379b465e4f8bd 100644 (file)
@@ -210,7 +210,7 @@ float dist_to_line_segment_v2(const float v1[2], const float v2[2], const float
 }
 
 /* point closest to v1 on line v2-v3 in 2D */
-void closest_to_line_segment_v2(float *closest, float p[2], float l1[2], float l2[2])
+void closest_to_line_segment_v2(float closest[2], const float p[2], const float l1[2], const float l2[2])
 {
        float lambda, cp[2];
 
index eadf9cd0cdb3b3f48efb6b1be706f2e02b8e985e..c6986531c9e101a731699205d95d0db69bd3e01f 100644 (file)
@@ -4110,7 +4110,6 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
                                pmd->canvas = newdataadr(fd, pmd->canvas);
                                pmd->canvas->pmd = pmd;
                                pmd->canvas->dm = NULL;
-                               pmd->canvas->ui_info[0] = '\0';
                                pmd->canvas->flags &= ~MOD_DPAINT_BAKING; /* just in case */
 
                                if (pmd->canvas->surfaces.first) {
index 9a7e5a564c4e6e5a85929027f06057bb3b09c804..888b5af01bbf3f759769f9ac85de780472ee69f8 100644 (file)
@@ -56,22 +56,23 @@ static int surface_slot_add_exec(bContext *C, wmOperator *op)
 {
        DynamicPaintModifierData *pmd = 0;
        Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+       DynamicPaintCanvasSettings *canvas;
        DynamicPaintSurface *surface;
 
        /* Make sure we're dealing with a canvas */
        pmd = (DynamicPaintModifierData *)modifiers_findByType(cObject, eModifierType_DynamicPaint);
-       if (!pmd) return OPERATOR_CANCELLED;
-       if (!pmd->canvas) return OPERATOR_CANCELLED;
+       if (!pmd || !pmd->canvas) return OPERATOR_CANCELLED;
 
-       surface = dynamicPaint_createNewSurface(pmd->canvas, CTX_data_scene(C));
+       canvas = pmd->canvas;
+       surface = dynamicPaint_createNewSurface(canvas, CTX_data_scene(C));
 
        if (!surface) return OPERATOR_CANCELLED;
 
        /* set preview for this surface only and set active */
-       pmd->canvas->active_sur = 0;
+       canvas->active_sur = 0;
        for(surface=surface->prev; surface; surface=surface->prev) {
                                surface->flags &= ~MOD_DPAINT_PREVIEW;
-                               pmd->canvas->active_sur++;
+                               canvas->active_sur++;
        }
 
        return OPERATOR_FINISHED;
@@ -97,27 +98,28 @@ static int surface_slot_remove_exec(bContext *C, wmOperator *op)
 {
        DynamicPaintModifierData *pmd = 0;
        Object *cObject = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
+       DynamicPaintCanvasSettings *canvas;
        DynamicPaintSurface *surface;
        int id=0;
 
        /* Make sure we're dealing with a canvas */
        pmd = (DynamicPaintModifierData *)modifiers_findByType(cObject, eModifierType_DynamicPaint);
-       if (!pmd) return OPERATOR_CANCELLED;
-       if (!pmd->canvas) return OPERATOR_CANCELLED;
+       if (!pmd || !pmd->canvas) return OPERATOR_CANCELLED;
 
-       surface = pmd->canvas->surfaces.first;
+       canvas = pmd->canvas;
+       surface = canvas->surfaces.first;
 
        /* find active surface and remove it */
        for(; surface; surface=surface->next) {
-               if(id == pmd->canvas->active_sur) {
-                               pmd->canvas->active_sur -= 1;
+               if(id == canvas->active_sur) {
+                               canvas->active_sur -= 1;
                                dynamicPaint_freeSurface(surface);
                                break;
                        }
                id++;
        }
 
-       dynamicPaint_resetPreview(pmd->canvas);
+       dynamicPaint_resetPreview(canvas);
        DAG_id_tag_update(&cObject->id, OB_RECALC_DATA);
        WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, cObject);
 
@@ -197,42 +199,39 @@ static int output_toggle_exec(bContext *C, wmOperator *op)
 
        Object *ob = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
        Scene *scene = CTX_data_scene(C);
+       DynamicPaintSurface *surface;
        DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)modifiers_findByType(ob, eModifierType_DynamicPaint);
        int index= RNA_int_get(op->ptr, "index");
 
-       if (!pmd) return OPERATOR_CANCELLED;
-
+       if (!pmd || !pmd->canvas) return OPERATOR_CANCELLED;
+       surface = get_activeSurface(pmd->canvas);
 
        /* if type is already enabled, toggle it off */
-       if (pmd->canvas) {
-                       DynamicPaintSurface *surface = get_activeSurface(pmd->canvas);
-
-                       if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
-                               int exists = dynamicPaint_outputLayerExists(surface, ob, index);
-                               char *name;
-                               
-                               if (index == 0)
-                                       name = surface->output_name;
-                               else if (index == 1)
-                                       name = surface->output_name2;
-
-                               /* Vertex Color Layer */
-                               if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
-                                       if (!exists)
-                                               ED_mesh_color_add(C, scene, ob, ob->data, name, 1);
-                                       else 
-                                               ED_mesh_color_remove_named(C, ob, ob->data, name);
-                               }
-                               /* Vertex Weight Layer */
-                               else if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) {
-                                       if (!exists)
-                                               ED_vgroup_add_name(ob, name);
-                                       else {
-                                               bDeformGroup *defgroup = defgroup_find_name(ob, name);
-                                               if (defgroup) ED_vgroup_delete(ob, defgroup);
-                                       }
-                               }
+       if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
+               int exists = dynamicPaint_outputLayerExists(surface, ob, index);
+               char *name;
+               
+               if (index == 0)
+                       name = surface->output_name;
+               else if (index == 1)
+                       name = surface->output_name2;
+
+               /* Vertex Color Layer */
+               if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+                       if (!exists)
+                               ED_mesh_color_add(C, scene, ob, ob->data, name, 1);
+                       else 
+                               ED_mesh_color_remove_named(C, ob, ob->data, name);
+               }
+               /* Vertex Weight Layer */
+               else if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) {
+                       if (!exists)
+                               ED_vgroup_add_name(ob, name);
+                       else {
+                               bDeformGroup *defgroup = defgroup_find_name(ob, name);
+                               if (defgroup) ED_vgroup_delete(ob, defgroup);
                        }
+               }
        }
 
        return OPERATOR_FINISHED;
@@ -275,11 +274,9 @@ static int dynamicPaint_bakeImageSequence(bContext *C, DynamicPaintSurface *surf
        int frames;
 
        frames = surface->end_frame - surface->start_frame + 1;
-       if (frames <= 0) {sprintf(canvas->error, "No frames to bake.");printf("DynamicPaint bake failed: %s", canvas->error);return 0;}
+       if (frames <= 0) {BLI_strncpy(canvas->error, "No frames to bake.", sizeof(canvas->error)); return 0;}
 
-       /*
-       *       Set frame to start point (also inits modifier data)
-       */
+       /* Set frame to start point (also inits modifier data) */
        frame = surface->start_frame;
        scene->r.cfra = (int)frame;
        ED_update_for_newframe(CTX_data_main(C), scene, win->screen, 1);
@@ -287,9 +284,7 @@ static int dynamicPaint_bakeImageSequence(bContext *C, DynamicPaintSurface *surf
        /* Init surface */
        if (!dynamicPaint_createUVSurface(surface)) return 0;
 
-       /*
-       *       Loop through selected frames
-       */
+       /* Loop through selected frames */
        for (frame=surface->start_frame; frame<=surface->end_frame; frame++)
        {
                float progress = (frame - surface->start_frame) / (float)frames * 100;
@@ -300,7 +295,6 @@ static int dynamicPaint_bakeImageSequence(bContext *C, DynamicPaintSurface *surf
 
                /* Update progress bar cursor */
                WM_timecursor(win, (int)progress);
-               printf("DynamicPaint: Baking frame %i\n", frame);
 
                /* calculate a frame */
                scene->r.cfra = (int)frame;
@@ -311,48 +305,25 @@ static int dynamicPaint_bakeImageSequence(bContext *C, DynamicPaintSurface *surf
                *       Save output images
                */
                {
-                       char filename[250];
-                       char pad[4];
-                       char dir_slash[2];
-                       /* OpenEXR or PNG       */
-                       short format = (surface->image_fileformat & MOD_DPAINT_IMGFORMAT_OPENEXR) ? DPOUTPUT_OPENEXR : DPOUTPUT_PNG;
-
-                       /* Add frame number padding     */
-                       if (frame<10) sprintf(pad,"000");
-                       else if (frame<100) sprintf(pad,"00");
-                       else if (frame<1000) sprintf(pad,"0");
-                       else pad[0] = '\0';
-
-                       /* make sure directory path is valid to append filename */
-                       if (surface->image_output_path[strlen(surface->image_output_path)-1] != 47 &&
-                               surface->image_output_path[strlen(surface->image_output_path)-1] != 92)
-                               strcpy(dir_slash,"/");
-                       else
-                               dir_slash[0] = '\0';
-
-
-                       /* color map    */
-                       if (surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
-                               if (surface->flags & MOD_DPAINT_OUT1) {
-                                       BLI_snprintf(filename, sizeof(filename), "%s%s%s%s%i", surface->image_output_path, dir_slash, surface->output_name, pad, (int)frame);
-                                       dynamicPaint_outputImage(surface, filename, format, DPOUTPUT_PAINT);
-                               }
-                               if (surface->flags & MOD_DPAINT_OUT2) {
-                                       BLI_snprintf(filename, sizeof(filename), "%s%s%s%s%i", surface->image_output_path, dir_slash, surface->output_name2, pad, (int)frame);
-                                       dynamicPaint_outputImage(surface, filename, format, DPOUTPUT_WET);
-                               }
+                       char filename[FILE_MAX];
+                       /* make sure output path has ending slash */
+                       BLI_add_slash(surface->image_output_path);
+
+                       /* primary output layer */
+                       if (surface->flags & MOD_DPAINT_OUT1) {
+                               /* set filepath */
+                               BLI_snprintf(filename, sizeof(filename), "%s%s", surface->image_output_path, surface->output_name);
+                               BLI_path_frame(filename, frame, 4);
+                               /* save image */
+                               dynamicPaint_outputSurfaceImage(surface, filename, 0);
                        }
-
-                       /* displacement map     */
-                       else if (surface->type == MOD_DPAINT_SURFACE_T_DISPLACE) {
-                               BLI_snprintf(filename, sizeof(filename), "%s%s%s%s%i", surface->image_output_path, dir_slash, surface->output_name, pad, (int)frame);
-                               dynamicPaint_outputImage(surface, filename, format, DPOUTPUT_DISPLACE);
-                       }
-
-                       /* waves        */
-                       else if (surface->type == MOD_DPAINT_SURFACE_T_WAVE) {
-                               BLI_snprintf(filename, sizeof(filename), "%s%s%s%s%i", surface->image_output_path, dir_slash, surface->output_name, pad, (int)frame);
-                               dynamicPaint_outputImage(surface, filename, format, DPOUTPUT_WAVES);
+                       /* secondary output */
+                       if (surface->flags & MOD_DPAINT_OUT2 && surface->type == MOD_DPAINT_SURFACE_T_PAINT) {
+                               /* set filepath */
+                               BLI_snprintf(filename, sizeof(filename), "%s%s", surface->image_output_path, surface->output_name2);
+                               BLI_path_frame(filename, frame, 4);
+                               /* save image */
+                               dynamicPaint_outputSurfaceImage(surface, filename, 1);
                        }
                }
        }
@@ -370,6 +341,7 @@ int dynamicPaint_initBake(struct bContext *C, struct wmOperator *op)
        Object *ob = CTX_data_pointer_get_type(C, "object", &RNA_Object).data;
        int status = 0;
        double timer = PIL_check_seconds_timer();
+       char result_str[80];
        DynamicPaintSurface *surface;
 
        /*
@@ -397,35 +369,31 @@ int dynamicPaint_initBake(struct bContext *C, struct wmOperator *op)
        /*  Bake Dynamic Paint  */
        status = dynamicPaint_bakeImageSequence(C, surface, ob);
        /* Clear bake */
-       pmd->canvas->flags &= ~MOD_DPAINT_BAKING;
+       canvas->flags &= ~MOD_DPAINT_BAKING;
        WM_cursor_restore(CTX_wm_window(C));
        dynamicPaint_freeSurfaceData(surface);
 
        /* Bake was successful:
        *  Report for ended bake and how long it took */
        if (status) {
-
                /* Format time string   */
-               char timestr[30];
+               char time_str[30];
                double time = PIL_check_seconds_timer() - timer;
-               BLI_timestr(time, timestr);
+               BLI_timestr(time, time_str);
 
                /* Show bake info */
-               BLI_snprintf(canvas->ui_info, sizeof(canvas->ui_info), "Bake Complete! (%s)", timestr);
-               printf("%s\n", canvas->ui_info);
+               BLI_snprintf(result_str, sizeof(result_str), "Bake Complete! (%s)", time_str);
+               BKE_report(op->reports, RPT_INFO, result_str);
        }
        else {
-               if (strlen(pmd->canvas->error)) { /* If an error occured */
-                       BLI_snprintf(canvas->ui_info, sizeof(canvas->ui_info), "Bake Failed: %s", pmd->canvas->error);
-                       BKE_report(op->reports, RPT_ERROR, canvas->ui_info);
+               if (strlen(canvas->error)) { /* If an error occured */
+                       BLI_snprintf(result_str, sizeof(result_str), "Bake Failed: %s", canvas->error);
+                       BKE_report(op->reports, RPT_ERROR, result_str);
                }
                else {  /* User cancelled the bake */
-                       sprintf(pmd->canvas->ui_info, "Baking Cancelled!");
-                       BKE_report(op->reports, RPT_WARNING, canvas->ui_info);
+                       BLI_strncpy(result_str, "Baking Cancelled!", sizeof(result_str));
+                       BKE_report(op->reports, RPT_WARNING, result_str);
                }
-
-               /* Print failed bake to console */
-               printf("Baking Cancelled!\n");
        }
 
        return status;
index b39ef4b462b5ccfde894e661f4085cd5a5041815..2c6c45729485aa34357823c8917e346a9409d3e4 100644 (file)
@@ -2695,7 +2695,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D
        if ((md = modifiers_findByType(ob, eModifierType_DynamicPaint)))
        {
                /* check if target has an active dp modifier    */
-               if(md && md->mode & (eModifierMode_Realtime | eModifierMode_Render))                                    
+               if(md && (md->mode & eModifierMode_Realtime))                                   
                {
                        DynamicPaintModifierData *pmd = (DynamicPaintModifierData *)md;
                        /* if canvas is ready to preview vertex colors */
index aebd8d0f07a1c4d68d9e531a9c78fc89b341e5e3..c8dfdf83a57e7aedac22d01200479c765907172d 100644 (file)
@@ -129,9 +129,7 @@ typedef struct DynamicPaintCanvasSettings {
        short active_sur, flags;
        int pad;
 
-       
-       char ui_info[128];      // UI info text
-       char error[64];         // Bake error description
+       char error[64];         /* Bake error description */
 
 } DynamicPaintCanvasSettings;
 
index c3dcc65c3d49348c2603275c56558e3ab07f9060..f4a955349f603adb6544636f88a174cfa1ca6261 100644 (file)
@@ -316,7 +316,7 @@ static void rna_def_canvas_surface(BlenderRNA *brna)
                        {MOD_DPAINT_INITIAL_NONE, "NONE", 0, "None", ""},
                        {MOD_DPAINT_INITIAL_COLOR, "COLOR", ICON_COLOR, "Color", ""},
                        {MOD_DPAINT_INITIAL_TEXTURE, "TEXTURE", ICON_TEXTURE, "UV Texture", ""},
-                       {MOD_DPAINT_INITIAL_VERTEXCOLOR, "VERTEXCOLOR", ICON_GROUP_VCOL, "Vertex Color", ""},
+                       {MOD_DPAINT_INITIAL_VERTEXCOLOR, "VERTEX_COLOR", ICON_GROUP_VCOL, "Vertex Color", ""},
                        {0, NULL, 0, NULL, NULL}};
 
        /*  Effect type
@@ -336,7 +336,7 @@ static void rna_def_canvas_surface(BlenderRNA *brna)
                        {0, NULL, 0, NULL, NULL}};
 
        /* Displacemap type */
-       static EnumPropertyItem prop_dynamicpaint_disp_type[] = {
+       static EnumPropertyItem prop_dynamicpaint_displace_type[] = {
                        {MOD_DPAINT_DISP_DISPLACE, "DISPLACE", 0, "Displacement", ""},
                        {MOD_DPAINT_DISP_DEPTH, "DEPTH", 0, "Depth", ""},
                        {0, NULL, 0, NULL, NULL}};
@@ -387,7 +387,7 @@ static void rna_def_canvas_surface(BlenderRNA *brna)
 
 
        /*
-       *   Paint, wet and disp
+       *   Paint, wet and displace
        */
 
        prop= RNA_def_property(srna, "use_dissolve", PROP_BOOLEAN, PROP_NONE);
@@ -419,26 +419,29 @@ static void rna_def_canvas_surface(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "UV Layer", "UV layer name");
        RNA_def_property_string_funcs(prop, NULL, NULL, "rna_DynamicPaint_uvlayer_set");
        
-       prop= RNA_def_property(srna, "start_frame", PROP_INT, PROP_NONE);
+       prop= RNA_def_property(srna, "frame_start", PROP_INT, PROP_NONE);
+       RNA_def_property_int_sdna(prop, NULL, "start_frame");
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_range(prop, 1.0, 9999.0);
        RNA_def_property_ui_range(prop, 1.0, 9999, 1, 0);
        RNA_def_property_ui_text(prop, "Start Frame", "Simulation start frame");
        RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaintSurfaces_updateFrames");
        
-       prop= RNA_def_property(srna, "end_frame", PROP_INT, PROP_NONE);
+       prop= RNA_def_property(srna, "frame_end", PROP_INT, PROP_NONE);
+       RNA_def_property_int_sdna(prop, NULL, "end_frame");
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_range(prop, 1.0, 9999.0);
        RNA_def_property_ui_range(prop, 1.0, 9999.0, 1, 0);
        RNA_def_property_ui_text(prop, "End Frame", "Simulation end frame");
        RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaintSurfaces_updateFrames");
        
-       prop= RNA_def_property(srna, "substeps", PROP_INT, PROP_NONE);
+       prop= RNA_def_property(srna, "frame_substeps", PROP_INT, PROP_NONE);
+       RNA_def_property_int_sdna(prop, NULL, "substeps");
        RNA_def_property_range(prop, 0.0, 10.0);
        RNA_def_property_ui_range(prop, 0.0, 10, 1, 0);
        RNA_def_property_ui_text(prop, "Sub-Steps", "Do extra frames between scene frames to ensure smooth motion");
        
-       prop= RNA_def_property(srna, "use_anti_aliasing", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "use_antialiasing", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_ANTIALIAS);
        RNA_def_property_ui_text(prop, "Anti-aliasing", "Use 5x multisampling to smoothen paint edges");
@@ -556,12 +559,12 @@ static void rna_def_canvas_surface(BlenderRNA *brna)
 
        prop= RNA_def_property(srna, "do_output1", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_OUT1);
-       RNA_def_property_ui_text(prop, "Save layer", "");
+       RNA_def_property_ui_text(prop, "Save layer", "Output name");
 
        /* output for secondary sufrace data */
        prop= RNA_def_property(srna, "output_name2", PROP_STRING, PROP_NONE);
        RNA_def_property_string_sdna(prop, NULL, "output_name2");
-       RNA_def_property_ui_text(prop, "Output name", "");
+       RNA_def_property_ui_text(prop, "Output name", "Output name");
 
        prop= RNA_def_property(srna, "do_output2", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_OUT2);
@@ -592,7 +595,8 @@ static void rna_def_canvas_surface(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Max Displace", "Maximum level of depth intersection in object space. Use 0.0 to disable");
        RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
 
-       prop= RNA_def_property(srna, "disp_factor", PROP_FLOAT, PROP_NONE);
+       prop= RNA_def_property(srna, "displace_factor", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "disp_factor");
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_range(prop, -50.0, 50.0);
        RNA_def_property_ui_range(prop, -5.0, 5.0, 1, 2);
@@ -604,12 +608,13 @@ static void rna_def_canvas_surface(BlenderRNA *brna)
        RNA_def_property_enum_items(prop, prop_dynamicpaint_image_fileformat);
        RNA_def_property_ui_text(prop, "File Format", "");
        
-       prop= RNA_def_property(srna, "disp_type", PROP_ENUM, PROP_NONE);
+       prop= RNA_def_property(srna, "displace_type", PROP_ENUM, PROP_NONE);
+       RNA_def_property_enum_sdna(prop, NULL, "disp_type");
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
-       RNA_def_property_enum_items(prop, prop_dynamicpaint_disp_type);
+       RNA_def_property_enum_items(prop, prop_dynamicpaint_displace_type);
        RNA_def_property_ui_text(prop, "Data Type", "");
 
-       prop= RNA_def_property(srna, "incremental_disp", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "use_incremental_displace", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_DISP_INCREMENTAL);
        RNA_def_property_ui_text(prop, "Incremental", "New displace is added cumulatively on top of existing");
@@ -672,10 +677,6 @@ static void rna_def_dynamic_paint_canvas_settings(BlenderRNA *brna)
        RNA_def_property_struct_type(prop, "DynamicPaintSurface");
        RNA_def_property_ui_text(prop, "Paint Surface List", "Paint surface list");
        rna_def_canvas_surfaces(brna, prop);
-
-       prop= RNA_def_property(srna, "ui_info", PROP_STRING, PROP_NONE);
-       RNA_def_property_clear_flag(prop, PROP_EDITABLE);
-       RNA_def_property_ui_text(prop, "Bake Info", "Info on bake status");
 }
 
 static void rna_def_dynamic_paint_brush_settings(BlenderRNA *brna)
@@ -685,10 +686,10 @@ static void rna_def_dynamic_paint_brush_settings(BlenderRNA *brna)
 
        /* paint collision type */
        static EnumPropertyItem prop_dynamicpaint_collisiontype[] = {
-                       {MOD_DPAINT_COL_PSYS, "PSYS", ICON_PARTICLES, "Particle System", ""},
+                       {MOD_DPAINT_COL_PSYS, "PARTICLE_SYSTEM", ICON_PARTICLES, "Particle System", ""},
                        {MOD_DPAINT_COL_POINT, "POINT", ICON_META_EMPTY, "Object Center", ""},
                        {MOD_DPAINT_COL_DIST, "DISTANCE", ICON_META_EMPTY, "Proximity", ""},
-                       {MOD_DPAINT_COL_VOLDIST, "VOLDIST", ICON_META_CUBE, "Mesh Volume + Proximity", ""},
+                       {MOD_DPAINT_COL_VOLDIST, "VOLUME_DISTANCE", ICON_META_CUBE, "Mesh Volume + Proximity", ""},
                        {MOD_DPAINT_COL_VOLUME, "VOLUME", ICON_MESH_CUBE, "Mesh Volume", ""},
                        {0, NULL, 0, NULL, NULL}};
 
@@ -707,7 +708,7 @@ static void rna_def_dynamic_paint_brush_settings(BlenderRNA *brna)
        static EnumPropertyItem prop_dynamicpaint_brush_ray_dir[] = {
                        {MOD_DPAINT_RAY_CANVAS, "CANVAS", 0, "Canvas Normal", ""},
                        {MOD_DPAINT_RAY_BRUSH_AVG, "BRUSH", 0, "Brush Normal", ""},
-                       {MOD_DPAINT_RAY_ZPLUS, "ZPLUS", 0, "Z-Axis", ""},
+                       {MOD_DPAINT_RAY_ZPLUS, "Z_AXIS", 0, "Z-Axis", ""},
                        {0, NULL, 0, NULL, NULL}};
 
        srna = RNA_def_struct(brna, "DynamicPaintBrushSettings", NULL);
@@ -722,22 +723,25 @@ static void rna_def_dynamic_paint_brush_settings(BlenderRNA *brna)
        RNA_def_property_float_sdna(prop, NULL, "r");
        RNA_def_property_array(prop, 3);
        RNA_def_property_ui_text(prop, "Paint Color", "Color of the paint");
-       RNA_def_property_update(prop, NC_MATERIAL|ND_SHADING_DRAW, NULL);
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
 
        prop= RNA_def_property(srna, "paint_alpha", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "alpha");
        RNA_def_property_range(prop, 0.0, 10.0);
        RNA_def_property_ui_range(prop, 0.0, 10.0, 5, 2);
        RNA_def_property_ui_text(prop, "Paint Alpha", "Paint alpha");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
        
        prop= RNA_def_property(srna, "use_material", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_USE_MATERIAL);
        RNA_def_property_ui_text(prop, "Use object material", "Use object material to define color and influence");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
 
        prop= RNA_def_property(srna, "material", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "mat");
        RNA_def_property_ui_text(prop, "Material", "Material to use. If not defined, material linked to the mesh is used");
        RNA_def_property_flag(prop, PROP_EDITABLE);
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
        
        prop= RNA_def_property(srna, "absolute_alpha", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_ABS_ALPHA);
@@ -748,10 +752,12 @@ static void rna_def_dynamic_paint_brush_settings(BlenderRNA *brna)
        RNA_def_property_range(prop, 0.0, 1.0);
        RNA_def_property_ui_range(prop, 0.0, 1.0, 5, 2);
        RNA_def_property_ui_text(prop, "Paint Wetness", "Paint wetness. Visible in wetmap. Some effects only affect wet paint");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
        
        prop= RNA_def_property(srna, "paint_erase", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_ERASE);
        RNA_def_property_ui_text(prop, "Erase Paint", "Erase / remove paint instead of adding it");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
 
        prop= RNA_def_property(srna, "wave_type", PROP_ENUM, PROP_NONE);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
@@ -785,14 +791,17 @@ static void rna_def_dynamic_paint_brush_settings(BlenderRNA *brna)
        prop= RNA_def_property(srna, "velocity_alpha", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_VELOCITY_ALPHA);
        RNA_def_property_ui_text(prop, "Multiply Alpha", "Multiply brush influence by velocity color ramp alpha");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
 
        prop= RNA_def_property(srna, "velocity_depth", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_VELOCITY_DEPTH);
        RNA_def_property_ui_text(prop, "Multiply Depth", "Multiply brush intersection depth (displace, waves) by velocity ramp alpha");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
 
        prop= RNA_def_property(srna, "velocity_color", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_VELOCITY_COLOR);
        RNA_def_property_ui_text(prop, "Replace Color", "Replace brush color by velocity color ramp");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
        
        /*
        *   Paint Area / Collision
@@ -802,41 +811,48 @@ static void rna_def_dynamic_paint_brush_settings(BlenderRNA *brna)
        RNA_def_property_enum_sdna(prop, NULL, "collision");
        RNA_def_property_enum_items(prop, prop_dynamicpaint_collisiontype);
        RNA_def_property_ui_text(prop, "Paint Source", "");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
        
        prop= RNA_def_property(srna, "paint_distance", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "paint_distance");
        RNA_def_property_range(prop, 0.0, 500.0);
        RNA_def_property_ui_range(prop, 0.0, 500.0, 10, 3);
        RNA_def_property_ui_text(prop, "Proximity Distance", "Maximum distance from brush to mesh surface to affect paint");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
        
-       prop= RNA_def_property(srna, "prox_ramp_alpha", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "proximity_ramp_alpha", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_RAMP_ALPHA);
        RNA_def_property_ui_text(prop, "Only Use Alpha", "Only reads color ramp alpha");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
        
-       prop= RNA_def_property(srna, "prox_falloff", PROP_ENUM, PROP_NONE);
+       prop= RNA_def_property(srna, "proximity_falloff", PROP_ENUM, PROP_NONE);
        RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
        RNA_def_property_enum_sdna(prop, NULL, "proximity_falloff");
        RNA_def_property_enum_items(prop, prop_dynamicpaint_prox_falloff);
        RNA_def_property_ui_text(prop, "Falloff", "Proximity falloff type");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
        
-       prop= RNA_def_property(srna, "prox_project", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "proximity_project", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_PROX_PROJECT);
        RNA_def_property_ui_text(prop, "Project", "Brush is projected to canvas from defined direction within brush proximity");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
 
-       prop= RNA_def_property(srna, "ray_dir", PROP_ENUM, PROP_NONE);
+       prop= RNA_def_property(srna, "ray_direction", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_sdna(prop, NULL, "ray_dir");
        RNA_def_property_enum_items(prop, prop_dynamicpaint_brush_ray_dir);
-       RNA_def_property_ui_text(prop, "Ray Dir", "Defines ray direction to use for projection. If brush object is located in that direction it's painted");
+       RNA_def_property_ui_text(prop, "Ray Direction", "Defines ray direction to use for projection. If brush object is located in that direction it's painted");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
 
-       prop= RNA_def_property(srna, "prox_inverse", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "proximity_inverse", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_INVERSE_PROX);
        RNA_def_property_ui_text(prop, "Inner Proximity", "Proximity falloff is applied inside the volume");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
        
 
        /*
        *   Particle
        */
-       prop= RNA_def_property(srna, "psys", PROP_POINTER, PROP_NONE);
+       prop= RNA_def_property(srna, "particle_system", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "psys");
        RNA_def_property_struct_type(prop, "ParticleSystem");
        RNA_def_property_flag(prop, PROP_EDITABLE);
@@ -844,21 +860,24 @@ static void rna_def_dynamic_paint_brush_settings(BlenderRNA *brna)
        RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_resetDependancy");
 
        
-       prop= RNA_def_property(srna, "use_part_radius", PROP_BOOLEAN, PROP_NONE);
+       prop= RNA_def_property(srna, "use_particle_radius", PROP_BOOLEAN, PROP_NONE);
        RNA_def_property_boolean_sdna(prop, NULL, "flags", MOD_DPAINT_PART_RAD);
        RNA_def_property_ui_text(prop, "Use Particle Radius", "Uses radius from particle settings");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
        
        prop= RNA_def_property(srna, "solid_radius", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "particle_radius");
        RNA_def_property_range(prop, 0.01, 10.0);
        RNA_def_property_ui_range(prop, 0.01, 2.0, 5, 3);
        RNA_def_property_ui_text(prop, "Solid Radius", "Radius that will be painted solid");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
 
        prop= RNA_def_property(srna, "smooth_radius", PROP_FLOAT, PROP_NONE);
        RNA_def_property_float_sdna(prop, NULL, "particle_smooth");
        RNA_def_property_range(prop, 0.0, 10.0);
        RNA_def_property_ui_range(prop, 0.0, 1.0, 5, 0);
        RNA_def_property_ui_text(prop, "Smooth Radius", "Smooth falloff added after solid radius");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
        
 
        /*
@@ -868,11 +887,13 @@ static void rna_def_dynamic_paint_brush_settings(BlenderRNA *brna)
        RNA_def_property_pointer_sdna(prop, NULL, "paint_ramp");
        RNA_def_property_struct_type(prop, "ColorRamp");
        RNA_def_property_ui_text(prop, "Paint Color Ramp", "Color ramp used to define proximity falloff");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
 
        prop= RNA_def_property(srna, "velocity_ramp", PROP_POINTER, PROP_NONE);
        RNA_def_property_pointer_sdna(prop, NULL, "vel_ramp");
        RNA_def_property_struct_type(prop, "ColorRamp");
        RNA_def_property_ui_text(prop, "Velocity Color Ramp", "Color ramp used to define brush velocity effect");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, "rna_DynamicPaint_redoModifier");
 }
 
 void RNA_def_dynamic_paint(BlenderRNA *brna)
index 707de14cab5549b75e493a4500611c177762451b..df1eb662a8ce9fd335063c55c6450e9af53e184a 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <stddef.h>
 
+#include "DNA_dynamicpaint_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
index cda15d3bf9b05a9d9c2cea92074a03b6a2e20738..09bbe1db9b16b808ce4382d1baf5322748045f91 100644 (file)
@@ -124,7 +124,6 @@ int multitex_ext(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osa
 int multitex_ext_safe(struct Tex *tex, float *texvec, struct TexResult *texres){return 0;}
 int multitex_nodes(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres, short thread, short which_output, struct ShadeInput *shi, struct MTex *mtex) {return 0;}
 
-/* material_ext.c */
 struct Material *RE_init_sample_material(struct Material *orig_mat, struct Scene *scene) {return (struct Material *)NULL;}
 void RE_free_sample_material(struct Material *mat) {}
 void RE_sample_material_color(struct Material *mat, float color[3], float *alpha, const float volume_co[3], const float surface_co[3],