[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38043] branches/soc-2011-carrot: * Added a new surface type "Waves" that simulates simple 2D wave motion.

Miika Hamalainen miika.hamalainen at kolumbus.fi
Sat Jul 2 20:06:39 CEST 2011


Revision: 38043
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38043
Author:   miikah
Date:     2011-07-02 18:06:39 +0000 (Sat, 02 Jul 2011)
Log Message:
-----------
* Added a new surface type "Waves" that simulates simple 2D wave motion.
* Optimized adjacency point searching for vertex surfaces.
* Separated adjacency code from effect system.
* Overall code cleaning and tweaking.

Modified Paths:
--------------
    branches/soc-2011-carrot/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
    branches/soc-2011-carrot/source/blender/blenkernel/BKE_dynamicpaint.h
    branches/soc-2011-carrot/source/blender/blenkernel/intern/dynamicpaint.c
    branches/soc-2011-carrot/source/blender/blenkernel/intern/pointcache.c
    branches/soc-2011-carrot/source/blender/makesdna/DNA_dynamicpaint_types.h
    branches/soc-2011-carrot/source/blender/makesrna/intern/rna_dynamicpaint.c

Modified: branches/soc-2011-carrot/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py
===================================================================
--- branches/soc-2011-carrot/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py	2011-07-02 16:41:01 UTC (rev 38042)
+++ branches/soc-2011-carrot/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py	2011-07-02 18:06:39 UTC (rev 38043)
@@ -104,7 +104,12 @@
                         col.prop(brush, "paint_color", text="")
                         col.prop(brush, "paint_alpha", text="Alpha")
                 
-                if (brush.brush_settings_context != "GENERAL"):
+                elif (brush.brush_settings_context == "WAVE"):
+                    layout.prop(brush, "wave_type")
+                    if (brush.wave_type != "REFLECT"):
+                        split = layout.split(percentage=0.6)
+                        split.prop(brush, "wave_factor")
+                else:
                     layout.label(text="-WIP-")
 
 
@@ -131,7 +136,7 @@
             split.prop(surface, "dry_speed", text="Dry Time")
             split.prop(surface, "use_dry_log", text="Slow")
             
-        if (surface.surface_type != "IWAVE"):
+        if (surface.surface_type != "WAVE"):
             if (surface.surface_type == "DISPLACE"):
                 layout.prop(surface, "use_dissolve", text="Dissolve:")
             elif (surface.surface_type == "WEIGHT"):
@@ -144,6 +149,19 @@
             split.prop(surface, "dissolve_speed", text="Time")
             split.prop(surface, "use_dissolve_log", text="Slow")
             
+        if (surface.surface_type == "WAVE"):
+            layout.prop(surface, "wave_open_borders")
+            
+            split = layout.split()
+            
+            col = split.column(align=True)
+            col.prop(surface, "wave_timescale")
+            col.prop(surface, "wave_speed")
+            
+            col = split.column(align=True)
+            col.prop(surface, "wave_damping")
+            col.prop(surface, "wave_spring")
+            
         layout.label(text="Brush Group:")
         layout.prop(surface, "brush_group", text="")
 
@@ -158,7 +176,7 @@
         if ((not md) or (md.dynamicpaint_type != 'CANVAS')):
             return 0
         surface = context.dynamic_paint.canvas_settings.canvas_surfaces.active
-        return (surface and (not (surface.surface_format=="VERTEX" and surface.surface_type=="DISPLACE") ))
+        return (surface and not (surface.surface_format=="VERTEX" and (surface.surface_type=="DISPLACE" or surface.surface_type=="WAVE")))
 
     def draw(self, context):
         layout = self.layout
@@ -202,9 +220,10 @@
                 sub = col.column()
                 sub.active = surface.do_output2
                 sub.prop(surface, "output_name2", text="Filename: ")
-            if (surface.surface_type == "DISPLACE"):
+            else:
                 col.prop(surface, "output_name", text="Filename: ")
-                col.prop(surface, "disp_type", text="Displace Type")
+                if (surface.surface_type == "DISPLACE"):
+                    col.prop(surface, "disp_type", text="Displace Type")
             
             layout.separator()
             layout.operator("dpaint.bake", text="Bake Image Sequence", icon='MOD_DYNAMICPAINT')

Modified: branches/soc-2011-carrot/source/blender/blenkernel/BKE_dynamicpaint.h
===================================================================
--- branches/soc-2011-carrot/source/blender/blenkernel/BKE_dynamicpaint.h	2011-07-02 16:41:01 UTC (rev 38042)
+++ branches/soc-2011-carrot/source/blender/blenkernel/BKE_dynamicpaint.h	2011-07-02 18:06:39 UTC (rev 38043)
@@ -24,8 +24,8 @@
 	void *format_data;
 	/* surface type data */
 	void *type_data;
-	/* paint effects data */
-	struct PaintEffectData *eff_data;
+	/* point neighbor data */
+	struct PaintAdjData *adj_data;
 
 	unsigned int total_points;
 	short samples;
@@ -49,27 +49,28 @@
 	float alpha;
 } PaintPoint;
 
-/* iWave type surface point	*/
-typedef struct PaintIWavePoint {		
+/* heigh field waves	*/
+typedef struct PaintWavePoint {		
 
-	float source;
-	float obstruction;
-	float height, previousHeight;
-
+	float height;
+	float velocity;
+	short state; /* 0 = neutral
+				 *  1 = obstacle
+				 *  2 = reflect only */
 	float foam;
 
-	float verticalDerivative;
+} PaintWavePoint;
 
-} PaintIWavePoint;
-
 struct DerivedMesh *dynamicPaint_Modifier_do(struct DynamicPaintModifierData *pmd, struct Scene *scene, struct Object *ob, struct DerivedMesh *dm);
-void dynamicPaint_cacheUpdateFrames(struct DynamicPaintSurface *surface);
-int dynamicPaint_resetSurface(struct DynamicPaintSurface *surface);
-int dynamicPaint_surfaceHasPreview(DynamicPaintSurface *surface);
-void dynamicPaintSurface_updateType(struct DynamicPaintSurface *surface);
-void dynamicPaintSurface_setUniqueName(DynamicPaintSurface *surface, char *basename);
 void dynamicPaint_Modifier_free (struct DynamicPaintModifierData *pmd);
 void dynamicPaint_Modifier_createType(struct DynamicPaintModifierData *pmd);
 void dynamicPaint_Modifier_copy(struct DynamicPaintModifierData *pmd, struct DynamicPaintModifierData *tsmd);
 
+void dynamicPaint_cacheUpdateFrames(struct DynamicPaintSurface *surface);
+void dynamicPaint_clearSurface(DynamicPaintSurface *surface);
+int  dynamicPaint_resetSurface(struct DynamicPaintSurface *surface);
+int  dynamicPaint_surfaceHasPreview(DynamicPaintSurface *surface);
+void dynamicPaintSurface_updateType(struct DynamicPaintSurface *surface);
+void dynamicPaintSurface_setUniqueName(DynamicPaintSurface *surface, char *basename);
+
 #endif /* BKE_DYNAMIC_PAINT_H_ */

Modified: branches/soc-2011-carrot/source/blender/blenkernel/intern/dynamicpaint.c
===================================================================
--- branches/soc-2011-carrot/source/blender/blenkernel/intern/dynamicpaint.c	2011-07-02 16:41:01 UTC (rev 38042)
+++ branches/soc-2011-carrot/source/blender/blenkernel/intern/dynamicpaint.c	2011-07-02 18:06:39 UTC (rev 38043)
@@ -166,20 +166,23 @@
 	float previous_vel[3];
 } EffVelPoint;
 
-typedef struct EffBakeNPoint {
+typedef struct BakeNeighPoint {
 	float dir[3];	/* vector pointing towards this neighbour */
 	float dist;		/* distance to */
-} EffBakeNPoint;
+} BakeNeighPoint;
 
-typedef struct PaintEffectData {
+
+/* adjacency data flags */
+#define ADJ_ON_MESH_EDGE (1<<0)
+
+typedef struct PaintAdjData {
 	unsigned int *n_index;		/* total_points sized index array */
 	unsigned int *numOf_n;		/* num of neighs for each point */
 	unsigned int *n_target;		/* array of neighbouring point indexes
 							   for single sample use n_index+neigh_num */
+	unsigned int *flags;		/* for each point */
 	unsigned int total_targets; /* size of n_target */
-	unsigned int most_neighs;
-	//EffVelPoint *v_point;
-} PaintEffectData;
+} PaintAdjData;
 
 /***************************** General Utils ******************************/
 
@@ -286,8 +289,8 @@
 	else if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) {
 		strcat(surface->output_name,"weight");
 	}
-	else if (surface->type == MOD_DPAINT_SURFACE_T_IWAVE) {
-		strcat(surface->output_name,"iwave");
+	else if (surface->type == MOD_DPAINT_SURFACE_T_WAVE) {
+		strcat(surface->output_name,"wave");
 		strcat(surface->output_name2,"foam");
 	}
 
@@ -354,11 +357,12 @@
 
 static void dynamicPaint_freeEffectData(PaintSurfaceData *data)
 {
-	if (data->eff_data) {
-		if (data->eff_data->n_index) MEM_freeN(data->eff_data->n_index);
-		if (data->eff_data->numOf_n) MEM_freeN(data->eff_data->numOf_n);
-		if (data->eff_data->n_target) MEM_freeN(data->eff_data->n_target);
-		MEM_freeN(data->eff_data);
+	if (data->adj_data) {
+		if (data->adj_data->n_index) MEM_freeN(data->adj_data->n_index);
+		if (data->adj_data->numOf_n) MEM_freeN(data->adj_data->numOf_n);
+		if (data->adj_data->n_target) MEM_freeN(data->adj_data->n_target);
+		if (data->adj_data->flags) MEM_freeN(data->adj_data->flags);
+		MEM_freeN(data->adj_data);
 	}
 }
 
@@ -474,6 +478,11 @@
 	surface->spread_speed = 1.0f;
 	surface->shrink_speed = 1.0f;
 
+	surface->wave_damping = 0.05f;
+	surface->wave_speed = 0.8f;
+	surface->wave_timescale = 1.0f;
+	surface->wave_spring = 0.20;
+
 	sprintf(surface->image_output_path, "%sdynamicpaint/", "/tmp/");
 	dynamicPaintSurface_setUniqueName(surface, "Surface");
 
@@ -534,9 +543,11 @@
 			pmd->brush->displace_distance = 0.5f;
 			pmd->brush->prox_displace_strength = 0.5f;
 
-			pmd->brush->particle_radius = 0.2;
-			pmd->brush->particle_smooth = 0.05;
+			pmd->brush->particle_radius = 0.2f;
+			pmd->brush->particle_smooth = 0.05f;
 
+			pmd->brush->wave_factor = 1.0f;
+
 			pmd->brush->dm = NULL;
 
 			/*
@@ -636,22 +647,27 @@
 	else if (surface->type == MOD_DPAINT_SURFACE_T_WEIGHT) {
 		sData->type_data = MEM_callocN(sizeof(float)*sData->total_points, "DynamicPaintSurface WeightData");
 	}
-	else if (surface->type == MOD_DPAINT_SURFACE_T_IWAVE) {
-		sData->type_data = MEM_callocN(sizeof(PaintIWavePoint)*sData->total_points, "DynamicPaintSurface iWaveData");
+	else if (surface->type == MOD_DPAINT_SURFACE_T_WAVE) {
+		sData->type_data = MEM_callocN(sizeof(PaintWavePoint)*sData->total_points, "DynamicPaintSurface WaveData");
 	}
 	else return;
 
 	if (sData->type_data == NULL) printError(surface->canvas, "Not enough free memory!");
 }
 
+static int surface_usesNeighData(DynamicPaintSurface *surface) {
+	return (surface->type == MOD_DPAINT_SURFACE_T_PAINT ||
+		    surface->type == MOD_DPAINT_SURFACE_T_WAVE);
+}
 
-/* initialize "paint effect" data */
-static void dynamicPaint_initEffectData(DynamicPaintSurface *surface) {
+/* initialize surface adjacency data */
+static void dynamicPaint_initAdjacencyData(DynamicPaintSurface *surface) {
 	PaintSurfaceData *sData = surface->data;
-	PaintEffectData *ed;
+	PaintAdjData *ed;
+	int *temp_data;
 	int neigh_points = 0;
 
-	if (!surface->effect) return;
+	if (!surface->effect && !surface_usesNeighData(surface)) return;
 
 	if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
 		/* For vertex format, neighbours are connected by edges */
@@ -663,58 +679,110 @@
 	if (!neigh_points) return;
 
 	/* allocate memory */
-	ed = sData->eff_data = MEM_callocN(sizeof(PaintEffectData), "Surface Effect Data");
+	ed = sData->adj_data = MEM_callocN(sizeof(PaintAdjData), "Surface Adj Data");
 	if (!ed) return;
-	ed->n_index = MEM_callocN(sizeof(int)*sData->total_points, "Surface Effect Index");

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list