diff options
Diffstat (limited to 'source/blender/blenloader/intern/writefile.c')
-rw-r--r-- | source/blender/blenloader/intern/writefile.c | 139 |
1 files changed, 138 insertions, 1 deletions
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c index f9f66ed8504..b875c47d854 100644 --- a/source/blender/blenloader/intern/writefile.c +++ b/source/blender/blenloader/intern/writefile.c @@ -101,6 +101,7 @@ Any case: direct data is ALWAYS after the lib block #include "DNA_key_types.h" #include "DNA_lattice_types.h" #include "DNA_lamp_types.h" +#include "DNA_linestyle_types.h" #include "DNA_meta_types.h" #include "DNA_mesh_types.h" #include "DNA_meshdata_types.h" @@ -1761,6 +1762,8 @@ static void write_scenes(WriteData *wd, ListBase *scebase) TimeMarker *marker; TransformOrientation *ts; SceneRenderLayer *srl; + FreestyleModuleConfig *fmc; + FreestyleLineSet *fls; ToolSettings *tos; sce= scebase->first; @@ -1882,8 +1885,19 @@ static void write_scenes(WriteData *wd, ListBase *scebase) for(ts = sce->transform_spaces.first; ts; ts = ts->next) writestruct(wd, DATA, "TransformOrientation", 1, ts); - for(srl= sce->r.layers.first; srl; srl= srl->next) + for(srl= sce->r.layers.first; srl; srl= srl->next) { writestruct(wd, DATA, "SceneRenderLayer", 1, srl); + + for(fmc= srl->freestyleConfig.modules.first; fmc; fmc = fmc->next) { + writestruct(wd, DATA, "FreestyleModuleConfig", 1, fmc); + } + + for(fls= srl->freestyleConfig.linesets.first; fls; fls = fls->next) { + writestruct(wd, DATA, "FreestyleLineSet", 1, fls); + writestruct(wd, DATA, "FreestyleLineStyle", 1, fls->linestyle); + } + + } if(sce->nodetree) { writestruct(wd, DATA, "bNodeTree", 1, sce->nodetree); @@ -2333,6 +2347,128 @@ static void write_scripts(WriteData *wd, ListBase *idbase) } } +static void write_linestyle_color_modifiers(WriteData *wd, ListBase *modifiers) +{ + LineStyleModifier *m; + char *struct_name; + + for (m = modifiers->first; m; m = m->next) { + switch (m->type) { + case LS_MODIFIER_ALONG_STROKE: + struct_name = "LineStyleColorModifier_AlongStroke"; + break; + case LS_MODIFIER_DISTANCE_FROM_CAMERA: + struct_name = "LineStyleColorModifier_DistanceFromCamera"; + break; + case LS_MODIFIER_DISTANCE_FROM_OBJECT: + struct_name = "LineStyleColorModifier_DistanceFromObject"; + break; + default: + struct_name = "LineStyleColorModifier"; // this should not happen + } + writestruct(wd, DATA, struct_name, 1, m); + } + for (m = modifiers->first; m; m = m->next) { + switch (m->type) { + case LS_MODIFIER_ALONG_STROKE: + writestruct(wd, DATA, "ColorBand", 1, ((LineStyleColorModifier_AlongStroke *)m)->color_ramp); + break; + case LS_MODIFIER_DISTANCE_FROM_CAMERA: + writestruct(wd, DATA, "ColorBand", 1, ((LineStyleColorModifier_DistanceFromCamera *)m)->color_ramp); + break; + case LS_MODIFIER_DISTANCE_FROM_OBJECT: + writestruct(wd, DATA, "ColorBand", 1, ((LineStyleColorModifier_DistanceFromObject *)m)->color_ramp); + break; + } + } +} + +static void write_linestyle_alpha_modifiers(WriteData *wd, ListBase *modifiers) +{ + LineStyleModifier *m; + char *struct_name; + + for (m = modifiers->first; m; m = m->next) { + switch (m->type) { + case LS_MODIFIER_ALONG_STROKE: + struct_name = "LineStyleAlphaModifier_AlongStroke"; + break; + case LS_MODIFIER_DISTANCE_FROM_CAMERA: + struct_name = "LineStyleAlphaModifier_DistanceFromCamera"; + break; + case LS_MODIFIER_DISTANCE_FROM_OBJECT: + struct_name = "LineStyleAlphaModifier_DistanceFromObject"; + break; + default: + struct_name = "LineStyleAlphaModifier"; // this should not happen + } + writestruct(wd, DATA, struct_name, 1, m); + } + for (m = modifiers->first; m; m = m->next) { + switch (m->type) { + case LS_MODIFIER_ALONG_STROKE: + write_curvemapping(wd, ((LineStyleAlphaModifier_AlongStroke *)m)->curve); + break; + case LS_MODIFIER_DISTANCE_FROM_CAMERA: + write_curvemapping(wd, ((LineStyleAlphaModifier_DistanceFromCamera *)m)->curve); + break; + case LS_MODIFIER_DISTANCE_FROM_OBJECT: + write_curvemapping(wd, ((LineStyleAlphaModifier_DistanceFromObject *)m)->curve); + break; + } + } +} + +static void write_linestyle_thickness_modifiers(WriteData *wd, ListBase *modifiers) +{ + LineStyleModifier *m; + char *struct_name; + + for (m = modifiers->first; m; m = m->next) { + switch (m->type) { + case LS_MODIFIER_ALONG_STROKE: + struct_name = "LineStyleThicknessModifier_AlongStroke"; + break; + case LS_MODIFIER_DISTANCE_FROM_CAMERA: + struct_name = "LineStyleThicknessModifier_DistanceFromCamera"; + break; + case LS_MODIFIER_DISTANCE_FROM_OBJECT: + struct_name = "LineStyleThicknessModifier_DistanceFromObject"; + break; + default: + struct_name = "LineStyleThicknessModifier"; // this should not happen + } + writestruct(wd, DATA, struct_name, 1, m); + } + for (m = modifiers->first; m; m = m->next) { + switch (m->type) { + case LS_MODIFIER_ALONG_STROKE: + write_curvemapping(wd, ((LineStyleThicknessModifier_AlongStroke *)m)->curve); + break; + case LS_MODIFIER_DISTANCE_FROM_CAMERA: + write_curvemapping(wd, ((LineStyleThicknessModifier_DistanceFromCamera *)m)->curve); + break; + case LS_MODIFIER_DISTANCE_FROM_OBJECT: + write_curvemapping(wd, ((LineStyleThicknessModifier_DistanceFromObject *)m)->curve); + break; + } + } +} + +static void write_linestyles(WriteData *wd, ListBase *idbase) +{ + FreestyleLineStyle *linestyle; + + for(linestyle=idbase->first; linestyle; linestyle= linestyle->id.next) { + if(linestyle->id.us>0 || wd->current) { + writestruct(wd, ID_LS, "FreestyleLineStyle", 1, linestyle); + write_linestyle_color_modifiers(wd, &linestyle->color_modifiers); + write_linestyle_alpha_modifiers(wd, &linestyle->alpha_modifiers); + write_linestyle_thickness_modifiers(wd, &linestyle->thickness_modifiers); + } + } +} + /* context is usually defined by WM, two cases where no WM is available: * - for forward compatibility, curscreen has to be saved * - for undofile, curscene needs to be saved */ @@ -2422,6 +2558,7 @@ static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFil write_brushes (wd, &mainvar->brush); write_scripts (wd, &mainvar->script); write_gpencils (wd, &mainvar->gpencil); + write_linestyles(wd, &mainvar->linestyle); write_libraries(wd, mainvar->next); if (write_user_block) { |