Files
test2/source/blender/blenkernel/intern/freestyle.cc
Campbell Barton e955c94ed3 License Headers: Set copyright to "Blender Authors", add AUTHORS
Listing the "Blender Foundation" as copyright holder implied the Blender
Foundation holds copyright to files which may include work from many
developers.

While keeping copyright on headers makes sense for isolated libraries,
Blender's own code may be refactored or moved between files in a way
that makes the per file copyright holders less meaningful.

Copyright references to the "Blender Foundation" have been replaced with
"Blender Authors", with the exception of `./extern/` since these this
contains libraries which are more isolated, any changed to license
headers there can be handled on a case-by-case basis.

Some directories in `./intern/` have also been excluded:

- `./intern/cycles/` it's own `AUTHORS` file is planned.
- `./intern/opensubdiv/`.

An "AUTHORS" file has been added, using the chromium projects authors
file as a template.

Design task: #110784

Ref !110783.
2023-08-16 00:20:26 +10:00

251 lines
7.2 KiB
C++

/* SPDX-FileCopyrightText: 2013 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
/** \file
* \ingroup bke
*/
#include "MEM_guardedalloc.h"
#include "DNA_collection_types.h"
#include "DNA_freestyle_types.h"
#include "BLI_blenlib.h"
#include "BLI_math_rotation.h"
#include "BLI_string_utils.h"
#include "BKE_freestyle.h"
#include "BKE_lib_id.h"
#include "BKE_linestyle.h"
/* Function declarations. */
static FreestyleLineSet *alloc_lineset(void);
static void copy_lineset(FreestyleLineSet *new_lineset, FreestyleLineSet *lineset, const int flag);
static FreestyleModuleConfig *alloc_module(void);
static void copy_module(FreestyleModuleConfig *new_module, FreestyleModuleConfig *module);
void BKE_freestyle_config_init(FreestyleConfig *config)
{
config->mode = FREESTYLE_CONTROL_EDITOR_MODE;
BLI_listbase_clear(&config->modules);
config->flags = 0;
config->sphere_radius = 0.1f;
config->dkr_epsilon = 0.0f;
config->crease_angle = DEG2RADF(134.43f);
BLI_listbase_clear(&config->linesets);
}
void BKE_freestyle_config_free(FreestyleConfig *config, const bool do_id_user)
{
LISTBASE_FOREACH (FreestyleLineSet *, lineset, &config->linesets) {
if (lineset->group) {
if (do_id_user) {
id_us_min(&lineset->group->id);
}
lineset->group = nullptr;
}
if (lineset->linestyle) {
if (do_id_user) {
id_us_min(&lineset->linestyle->id);
}
lineset->linestyle = nullptr;
}
}
BLI_freelistN(&config->linesets);
BLI_freelistN(&config->modules);
}
void BKE_freestyle_config_copy(FreestyleConfig *new_config,
const FreestyleConfig *config,
const int flag)
{
FreestyleLineSet *new_lineset;
FreestyleModuleConfig *new_module;
new_config->mode = config->mode;
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;
BLI_listbase_clear(&new_config->linesets);
LISTBASE_FOREACH (FreestyleLineSet *, lineset, &config->linesets) {
new_lineset = alloc_lineset();
copy_lineset(new_lineset, lineset, flag);
BLI_addtail(&new_config->linesets, (void *)new_lineset);
}
BLI_listbase_clear(&new_config->modules);
LISTBASE_FOREACH (FreestyleModuleConfig *, module, &config->modules) {
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, const int flag)
{
new_lineset->linestyle = lineset->linestyle;
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;
STRNCPY(new_lineset->name, lineset->name);
if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
id_us_plus((ID *)new_lineset->linestyle);
id_us_plus((ID *)new_lineset->group);
}
}
static FreestyleModuleConfig *alloc_module()
{
return (FreestyleModuleConfig *)MEM_callocN(sizeof(FreestyleModuleConfig),
"style module configuration");
}
FreestyleModuleConfig *BKE_freestyle_module_add(FreestyleConfig *config)
{
FreestyleModuleConfig *module_conf = alloc_module();
BLI_addtail(&config->modules, (void *)module_conf);
module_conf->script = nullptr;
module_conf->is_displayed = 1;
return module_conf;
}
static void copy_module(FreestyleModuleConfig *new_module, FreestyleModuleConfig *module)
{
new_module->script = module->script;
new_module->is_displayed = module->is_displayed;
}
bool BKE_freestyle_module_delete(FreestyleConfig *config, FreestyleModuleConfig *module_conf)
{
if (BLI_findindex(&config->modules, module_conf) == -1) {
return false;
}
BLI_freelinkN(&config->modules, module_conf);
return true;
}
bool BKE_freestyle_module_move(FreestyleConfig *config,
FreestyleModuleConfig *module_conf,
int direction)
{
return ((BLI_findindex(&config->modules, module_conf) > -1) &&
(BLI_listbase_link_move(&config->modules, module_conf, direction) == true));
}
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(Main *bmain, FreestyleConfig *config, const char *name)
{
int lineset_index = BLI_listbase_count(&config->linesets);
FreestyleLineSet *lineset = alloc_lineset();
BLI_addtail(&config->linesets, (void *)lineset);
BKE_freestyle_lineset_set_active_index(config, lineset_index);
lineset->linestyle = BKE_linestyle_new(bmain, "LineStyle");
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 = nullptr;
if (name) {
STRNCPY(lineset->name, name);
}
else if (lineset_index > 0) {
SNPRINTF(lineset->name, "LineSet %i", lineset_index + 1);
}
else {
STRNCPY(lineset->name, "LineSet");
}
BKE_freestyle_lineset_unique_name(config, lineset);
return lineset;
}
bool BKE_freestyle_lineset_delete(FreestyleConfig *config, FreestyleLineSet *lineset)
{
if (BLI_findindex(&config->linesets, lineset) == -1) {
return false;
}
if (lineset->group) {
id_us_min(&lineset->group->id);
}
if (lineset->linestyle) {
id_us_min(&lineset->linestyle->id);
}
BLI_remlink(&config->linesets, lineset);
MEM_freeN(lineset);
BKE_freestyle_lineset_set_active_index(config, 0);
return true;
}
FreestyleLineSet *BKE_freestyle_lineset_get_active(FreestyleConfig *config)
{
LISTBASE_FOREACH (FreestyleLineSet *, lineset, &config->linesets) {
if (lineset->flags & FREESTYLE_LINESET_CURRENT) {
return lineset;
}
}
return nullptr;
}
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;
}
}
}