diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2013-03-23 07:00:37 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2013-03-23 07:00:37 +0400 |
commit | 62cede96d34d802d97797a635ff8370a5f7556a1 (patch) | |
tree | ec56d7f332164b34c31607ed882218ce892c9319 /source/blender/blenkernel/intern/freestyle.c | |
parent | 865e80f0f47b8cda1b126c2130114b833c7c5035 (diff) |
A major code update for making the DNA file specification of Freestyle settings
and RNA for it independent of the build flag for enabling Freestyle. Suggested
by Sergey Sharybin through a code review of the branch.
* Many #ifdef WITH_FREESTYLE blocks were removed to always have Freestyle-specific
DNA file specification and RNA for it built in Blender. This will allow Freestyle
setting survive even when a non-Freestyle build is used for loading and saving
files. It is noted that operations are still conditionally built through #ifdef
WITH_FREESTYLE blocks.
* To this end, new blenkernel files BKE_freestyle.h and intern/freestyle.c have
been added. All API functions in FRS_freestyle_config.h as well as some of those
in FRS_freestyle.h were moved to the new files. Now the relocated API functions
have BKE_ prefix instead of FRS_.
Diffstat (limited to 'source/blender/blenkernel/intern/freestyle.c')
-rw-r--r-- | source/blender/blenkernel/intern/freestyle.c | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/freestyle.c b/source/blender/blenkernel/intern/freestyle.c new file mode 100644 index 00000000000..bcbc3dd99c6 --- /dev/null +++ b/source/blender/blenkernel/intern/freestyle.c @@ -0,0 +1,234 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2013 Blender Foundation + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL LICENSE BLOCK ***** + */ + +/** \file blender/blenkernel/intern/freestyle.c + * \ingroup bke + */ + +#include "MEM_guardedalloc.h" + +#include "DNA_freestyle_types.h" +#include "DNA_group_types.h" + +#include "BKE_freestyle.h" +#include "BKE_linestyle.h" + +#include "BLI_blenlib.h" +#include "BLI_math.h" + +// function declarations +static FreestyleLineSet *alloc_lineset(); +static void copy_lineset(FreestyleLineSet *new_lineset, FreestyleLineSet *lineset); +static FreestyleModuleConfig *alloc_module(); +static void copy_module(FreestyleModuleConfig *new_module, FreestyleModuleConfig *module); + +void BKE_freestyle_config_init(FreestyleConfig *config) +{ + config->mode = FREESTYLE_CONTROL_EDITOR_MODE; + + config->modules.first = config->modules.last = NULL; + config->flags = 0; + config->sphere_radius = 1.0f; + config->dkr_epsilon = 0.0f; + config->crease_angle = DEG2RADF(134.43f); + + config->linesets.first = config->linesets.last = NULL; +} + +void BKE_freestyle_config_free(FreestyleConfig *config) +{ + FreestyleLineSet *lineset; + + for (lineset = (FreestyleLineSet *)config->linesets.first; lineset; lineset = lineset->next) { + if (lineset->group) { + lineset->group->id.us--; + lineset->group = NULL; + } + lineset->linestyle->id.us--; + lineset->linestyle = NULL; + } + BLI_freelistN(&config->linesets); + BLI_freelistN(&config->modules); +} + +void BKE_freestyle_config_copy(FreestyleConfig *new_config, FreestyleConfig *config) +{ + FreestyleLineSet *lineset, *new_lineset; + FreestyleModuleConfig *module, *new_module; + + new_config->mode = config->mode; + new_config->raycasting_algorithm = config->raycasting_algorithm; /* deprecated */ + new_config->flags = config->flags; + new_config->sphere_radius = config->sphere_radius; + new_config->dkr_epsilon = config->dkr_epsilon; + new_config->crease_angle = config->crease_angle; + + new_config->linesets.first = new_config->linesets.last = NULL; + for (lineset = (FreestyleLineSet *)config->linesets.first; lineset; lineset = lineset->next) { + new_lineset = alloc_lineset(); + copy_lineset(new_lineset, lineset); + BLI_addtail(&new_config->linesets, (void *)new_lineset); + } + + new_config->modules.first = new_config->modules.last = NULL; + for (module = (FreestyleModuleConfig *)config->modules.first; module; module = module->next) { + new_module = alloc_module(); + copy_module(new_module, module); + BLI_addtail(&new_config->modules, (void *)new_module); + } +} + +static void copy_lineset(FreestyleLineSet *new_lineset, FreestyleLineSet *lineset) +{ + new_lineset->linestyle = lineset->linestyle; + new_lineset->linestyle->id.us++; + new_lineset->flags = lineset->flags; + new_lineset->selection = lineset->selection; + new_lineset->qi = lineset->qi; + new_lineset->qi_start = lineset->qi_start; + new_lineset->qi_end = lineset->qi_end; + new_lineset->edge_types = lineset->edge_types; + new_lineset->exclude_edge_types = lineset->exclude_edge_types; + new_lineset->group = lineset->group; + if (new_lineset->group) { + new_lineset->group->id.us++; + } + strcpy(new_lineset->name, lineset->name); +} + +static FreestyleModuleConfig *alloc_module() +{ + return (FreestyleModuleConfig *)MEM_callocN(sizeof(FreestyleModuleConfig), "style module configuration"); +} + +void BKE_freestyle_module_add(FreestyleConfig *config) +{ + FreestyleModuleConfig *module_conf = alloc_module(); + const size_t maxlen = sizeof(module_conf->module_path); + BLI_addtail(&config->modules, (void *)module_conf); + + BLI_strncpy(module_conf->module_path, BLI_get_folder(BLENDER_SYSTEM_SCRIPTS, "freestyle"), maxlen); + BLI_join_dirfile(module_conf->module_path, maxlen, module_conf->module_path, "style_modules"); + BLI_join_dirfile(module_conf->module_path, maxlen, module_conf->module_path, "contour.py"); + module_conf->is_displayed = 1; +} + +static void copy_module(FreestyleModuleConfig *new_module, FreestyleModuleConfig *module) +{ + strcpy(new_module->module_path, module->module_path); + new_module->is_displayed = module->is_displayed; +} + +void BKE_freestyle_module_delete(FreestyleConfig *config, FreestyleModuleConfig *module_conf) +{ + BLI_freelinkN(&config->modules, module_conf); +} + +void BKE_freestyle_module_move_up(FreestyleConfig *config, FreestyleModuleConfig *module_conf) +{ + BLI_remlink(&config->modules, module_conf); + BLI_insertlinkbefore(&config->modules, module_conf->prev, module_conf); +} + +void BKE_freestyle_module_move_down(FreestyleConfig *config, FreestyleModuleConfig *module_conf) +{ + BLI_remlink(&config->modules, module_conf); + BLI_insertlinkafter(&config->modules, module_conf->next, module_conf); +} + +void BKE_freestyle_lineset_unique_name(FreestyleConfig *config, FreestyleLineSet *lineset) +{ + BLI_uniquename(&config->linesets, lineset, "FreestyleLineSet", '.', offsetof(FreestyleLineSet, name), + sizeof(lineset->name)); +} + +static FreestyleLineSet *alloc_lineset() +{ + return (FreestyleLineSet *)MEM_callocN(sizeof(FreestyleLineSet), "Freestyle line set"); +} + +FreestyleLineSet *BKE_freestyle_lineset_add(FreestyleConfig *config) +{ + int lineset_index = BLI_countlist(&config->linesets); + + FreestyleLineSet *lineset = alloc_lineset(); + BLI_addtail(&config->linesets, (void *)lineset); + BKE_freestyle_lineset_set_active_index(config, lineset_index); + + lineset->linestyle = BKE_new_linestyle("LineStyle", NULL); + lineset->flags |= FREESTYLE_LINESET_ENABLED; + lineset->selection = FREESTYLE_SEL_VISIBILITY | FREESTYLE_SEL_EDGE_TYPES | FREESTYLE_SEL_IMAGE_BORDER; + lineset->qi = FREESTYLE_QI_VISIBLE; + lineset->qi_start = 0; + lineset->qi_end = 100; + lineset->edge_types = FREESTYLE_FE_SILHOUETTE | FREESTYLE_FE_BORDER | FREESTYLE_FE_CREASE; + lineset->exclude_edge_types = 0; + lineset->group = NULL; + if (lineset_index > 0) + sprintf(lineset->name, "LineSet %i", lineset_index + 1); + else + strcpy(lineset->name, "LineSet"); + BKE_freestyle_lineset_unique_name(config, lineset); + + return lineset; +} + +FreestyleLineSet *BKE_freestyle_lineset_get_active(FreestyleConfig *config) +{ + FreestyleLineSet *lineset; + + for (lineset = (FreestyleLineSet *)config->linesets.first; lineset; lineset = lineset->next) { + if (lineset->flags & FREESTYLE_LINESET_CURRENT) + return lineset; + } + return NULL; +} + +short BKE_freestyle_lineset_get_active_index(FreestyleConfig *config) +{ + FreestyleLineSet *lineset; + short i; + + for (lineset = (FreestyleLineSet *)config->linesets.first, i = 0; lineset; lineset = lineset->next, i++) { + if (lineset->flags & FREESTYLE_LINESET_CURRENT) + return i; + } + return 0; +} + +void BKE_freestyle_lineset_set_active_index(FreestyleConfig *config, short index) +{ + FreestyleLineSet *lineset; + short i; + + for (lineset = (FreestyleLineSet *)config->linesets.first, i = 0; lineset; lineset = lineset->next, i++) { + if (i == index) + lineset->flags |= FREESTYLE_LINESET_CURRENT; + else + lineset->flags &= ~FREESTYLE_LINESET_CURRENT; + } +} |