diff options
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/makesdna/DNA_modifier_types.h | 3 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_modifier.c | 18 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_ocean.c | 64 |
3 files changed, 83 insertions, 2 deletions
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 05daf6caa47..60ad0eae576 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -1302,6 +1302,7 @@ typedef struct OceanModifierData { char cachepath[1024]; /** MAX_CUSTOMDATA_LAYER_NAME. */ char foamlayername[64]; + char spraylayername[64]; char cached; char geometry_mode; @@ -1336,6 +1337,8 @@ enum { enum { MOD_OCEAN_GENERATE_FOAM = (1 << 0), MOD_OCEAN_GENERATE_NORMALS = (1 << 1), + MOD_OCEAN_GENERATE_SPRAY = (1 << 2), + MOD_OCEAN_INVERT_SPRAY = (1 << 3), }; typedef struct WarpModifierData { diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c index e8d5d75097a..fd7b6b3f0d6 100644 --- a/source/blender/makesrna/intern/rna_modifier.c +++ b/source/blender/makesrna/intern/rna_modifier.c @@ -5587,6 +5587,24 @@ static void rna_def_modifier_ocean(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Generate Foam", "Generate foam mask as a vertex color channel"); RNA_def_property_update(prop, 0, "rna_OceanModifier_init_update"); + prop = RNA_def_property(srna, "use_spray", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_OCEAN_GENERATE_SPRAY); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_text( + prop, "Generate Spray Map", "Generate map of spray direction as a vertex color channel"); + RNA_def_property_update(prop, 0, "rna_OceanModifier_init_update"); + + prop = RNA_def_property(srna, "invert_spray", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", MOD_OCEAN_INVERT_SPRAY); + RNA_def_property_ui_text(prop, "Invert Spray", "Invert the spray direction map"); + RNA_def_property_update(prop, 0, "rna_OceanModifier_init_update"); + + prop = RNA_def_property(srna, "spray_layer_name", PROP_STRING, PROP_NONE); + RNA_def_property_string_sdna(prop, NULL, "spraylayername"); + RNA_def_property_ui_text( + prop, "Spray Map", "Name of the vertex color layer used for the spray direction map"); + RNA_def_property_update(prop, 0, "rna_OceanModifier_init_update"); + prop = RNA_def_property(srna, "resolution", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "resolution"); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); diff --git a/source/blender/modifiers/intern/MOD_ocean.c b/source/blender/modifiers/intern/MOD_ocean.c index b88d80ffc5e..873bdb7f120 100644 --- a/source/blender/modifiers/intern/MOD_ocean.c +++ b/source/blender/modifiers/intern/MOD_ocean.c @@ -122,7 +122,8 @@ static void initData(ModifierData *md) omd->bakeend = 250; omd->oceancache = NULL; omd->foam_fade = 0.98; - omd->foamlayername[0] = '\0'; /* layer name empty by default */ + omd->foamlayername[0] = '\0'; /* layer name empty by default */ + omd->spraylayername[0] = '\0'; /* layer name empty by default */ omd->ocean = BKE_ocean_add(); BKE_ocean_init_from_modifier(omd->ocean, omd); @@ -420,6 +421,12 @@ static Mesh *doOcean(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mes MLoopCol *mloopcols = CustomData_add_layer_named( &result->ldata, CD_MLOOPCOL, CD_CALLOC, NULL, num_loops, omd->foamlayername); + MLoopCol *mloopcols_spray = NULL; + if (omd->flag & MOD_OCEAN_GENERATE_SPRAY) { + mloopcols_spray = CustomData_add_layer_named( + &result->ldata, CD_MLOOPCOL, CD_CALLOC, NULL, num_loops, omd->spraylayername); + } + if (mloopcols) { /* unlikely to fail */ MPoly *mpolys = result->mpoly; MPoly *mp; @@ -428,6 +435,11 @@ static Mesh *doOcean(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mes MLoop *ml = &mloops[mp->loopstart]; MLoopCol *mlcol = &mloopcols[mp->loopstart]; + MLoopCol *mlcolspray = NULL; + if (omd->flag & MOD_OCEAN_GENERATE_SPRAY) { + mlcolspray = &mloopcols_spray[mp->loopstart]; + } + for (j = mp->totloop; j--; ml++, mlcol++) { const float *vco = mverts[ml->v].co; const float u = OCEAN_CO(size_co_inv, vco[0]); @@ -447,6 +459,23 @@ static Mesh *doOcean(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mes mlcol->r = mlcol->g = mlcol->b = (char)(foam * 255); /* This needs to be set (render engine uses) */ mlcol->a = 255; + + if (omd->flag & MOD_OCEAN_GENERATE_SPRAY) { + if (omd->flag & MOD_OCEAN_INVERT_SPRAY) { + mlcolspray->r = ocr.Eminus[0] * 255; + } + else { + mlcolspray->r = ocr.Eplus[0] * 255; + } + mlcolspray->g = 0; + if (omd->flag & MOD_OCEAN_INVERT_SPRAY) { + mlcolspray->b = ocr.Eminus[2] * 255; + } + else { + mlcolspray->b = ocr.Eplus[2] * 255; + } + mlcolspray->a = 255; + } } } } @@ -607,6 +636,35 @@ static void foam_panel_draw(const bContext *C, Panel *panel) uiItemR(col, &ptr, "foam_layer_name", 0, IFACE_("Data Layer"), ICON_NONE); } +static void spray_panel_draw_header(const bContext *C, Panel *panel) +{ + uiLayout *layout = panel->layout; + + PointerRNA ptr; + modifier_panel_get_property_pointers(C, panel, NULL, &ptr); + + uiItemR(layout, &ptr, "use_spray", 0, IFACE_("Spray"), ICON_NONE); +} + +static void spray_panel_draw(const bContext *C, Panel *panel) +{ + uiLayout *col; + uiLayout *layout = panel->layout; + + PointerRNA ptr; + modifier_panel_get_property_pointers(C, panel, NULL, &ptr); + + bool use_foam = RNA_boolean_get(&ptr, "use_foam"); + bool use_spray = RNA_boolean_get(&ptr, "use_spray") && use_foam; + + uiLayoutSetPropSep(layout, true); + + col = uiLayoutColumn(layout, false); + uiLayoutSetActive(col, use_foam && use_spray); + uiItemR(col, &ptr, "spray_layer_name", 0, IFACE_("Data Layer"), ICON_NONE); + uiItemR(col, &ptr, "invert_spray", 0, IFACE_("Invert"), ICON_NONE); +} + static void spectrum_panel_draw(const bContext *C, Panel *panel) { uiLayout *col; @@ -674,9 +732,11 @@ static void panelRegister(ARegionType *region_type) PanelType *panel_type = modifier_panel_register(region_type, eModifierType_Ocean, panel_draw); #ifdef WITH_OCEANSIM modifier_subpanel_register(region_type, "waves", "Waves", NULL, waves_panel_draw, panel_type); - modifier_subpanel_register( + PanelType *foam_panel = modifier_subpanel_register( region_type, "foam", "", foam_panel_draw_header, foam_panel_draw, panel_type); modifier_subpanel_register( + region_type, "spray", "", spray_panel_draw_header, spray_panel_draw, foam_panel); + modifier_subpanel_register( region_type, "spectrum", "Spectrum", NULL, spectrum_panel_draw, panel_type); modifier_subpanel_register(region_type, "bake", "Bake", NULL, bake_panel_draw, panel_type); #else |