Welcome to mirror list, hosted at ThFree Co, Russian Federation.

BKE_curveprofile.h « blenkernel « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: aa79f29760d236a334bfeaf441dd828b1f2e8272 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
/*
 * 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.
 *
 * Copyright (C) 2019 Blender Foundation.
 * All rights reserved.
 */

#pragma once

/** \file
 * \ingroup bke
 */

#include "DNA_curveprofile_types.h"

#ifdef __cplusplus
extern "C" {
#endif

struct BlendDataReader;
struct BlendWriter;
struct CurveProfile;
struct CurveProfilePoint;

/**
 * Sets the default settings and clip range for the profile widget.
 * Does not generate either table.
 */
void BKE_curveprofile_set_defaults(struct CurveProfile *profile);

/**
 * Returns a pointer to a newly allocated curve profile, using the given preset.
 */
struct CurveProfile *BKE_curveprofile_add(eCurveProfilePresets preset);

void BKE_curveprofile_free_data(struct CurveProfile *profile);

void BKE_curveprofile_free(struct CurveProfile *profile);

void BKE_curveprofile_copy_data(struct CurveProfile *target, const struct CurveProfile *profile);

struct CurveProfile *BKE_curveprofile_copy(const struct CurveProfile *profile);

/**
 * Move a point's handle, accounting for the alignment of handles with the #HD_ALIGN type.
 *
 * \param handle_1: Whether to move the 1st or 2nd control point.
 * \param delta: The *relative* change in the handle's position.
 * \note Requires #BKE_curveprofile_update call after.
 * \return Whether the handle moved from its start position.
 */
bool BKE_curveprofile_move_handle(struct CurveProfilePoint *point,
                                  bool handle_1,
                                  bool snap,
                                  const float delta[2]);

/**
 * Moves a control point, accounting for clipping and snapping, and moving free handles.
 *
 * \param snap: Whether to snap the point to the grid
 * \param delta: The *relative* change of the point's location.
 * \return Whether the point moved from its start position.
 * \note Requires #BKE_curveprofile_update call after.
 */
bool BKE_curveprofile_move_point(struct CurveProfile *profile,
                                 struct CurveProfilePoint *point,
                                 bool snap,
                                 const float delta[2]);

/**
 * Removes a specific point from the path of control points.
 * \note Requires #BKE_curveprofile_update call after.
 */
bool BKE_curveprofile_remove_point(struct CurveProfile *profile, struct CurveProfilePoint *point);

/**
 * Removes every point in the widget with the supplied flag set, except for the first and last.
 *
 * \param flag: #CurveProfilePoint.flag.
 *
 * \note Requires #BKE_curveprofile_update call after.
 */
void BKE_curveprofile_remove_by_flag(struct CurveProfile *profile, short flag);

/**
 * Adds a new point at the specified location. The choice for which points to place the new vertex
 * between is made by checking which control point line segment is closest to the new point and
 * placing the new vertex in between that segment's points.
 *
 * \note Requires #BKE_curveprofile_update call after.
 */
struct CurveProfilePoint *BKE_curveprofile_insert(struct CurveProfile *profile, float x, float y);

/**
 * Sets the handle type of the selected control points.
 * \param type_1, type_2: Handle type for the first handle. HD_VECT, HD_AUTO, HD_FREE, or HD_ALIGN.
 * \note Requires #BKE_curveprofile_update call after.
 */
void BKE_curveprofile_selected_handle_set(struct CurveProfile *profile, int type_1, int type_2);

/**
 * Flips the profile across the diagonal so that its orientation is reversed.
 *
 * \note Requires #BKE_curveprofile_update call after.
 */
void BKE_curveprofile_reverse(struct CurveProfile *profile);

/**
 * Reset the view to the clipping rectangle.
 */
void BKE_curveprofile_reset_view(struct CurveProfile *profile);

/**
 * Resets the profile to the current preset.
 *
 * \note Requires #BKE_curveprofile_update call after.
 */
void BKE_curveprofile_reset(struct CurveProfile *profile);

int BKE_curveprofile_table_size(const struct CurveProfile *profile);

/**
 * Refreshes the higher resolution table sampled from the input points. A call to this or
 * #BKE_curveprofile_update is needed before evaluation functions that use the table.
 * Also sets the number of segments used for the display preview of the locations
 * of the sampled points.
 */
void BKE_curveprofile_init(struct CurveProfile *profile, short segments_len);

/* Called for a complete update of the widget after modifications */
enum {
  PROF_UPDATE_NONE = 0,
  PROF_UPDATE_REMOVE_DOUBLES = (1 << 0),
  PROF_UPDATE_CLIP = (1 << 1),
};
/**
 * Should be called after the widget is changed. Does profile and remove double checks and more
 * importantly, recreates the display / evaluation and segments tables.
 * \param update_flags: Bit-field with fields defined in header file.
 * Controls removing doubles and clipping.
 */
void BKE_curveprofile_update(struct CurveProfile *profile, int update_flags);

/**
 * Does a single evaluation along the profile's path.
 * Travels down (length_portion * path) length and returns the position at that point.
 * Where length portion is the fraction of the total path length where we want the location.
 *
 * \param length_portion: The portion (0 to 1) of the path's full length to sample at.
 * \note Requires #BKE_curveprofile_init or #BKE_curveprofile_update call before to fill table.
 */
void BKE_curveprofile_evaluate_length_portion(const struct CurveProfile *profile,
                                              float length_portion,
                                              float *x_out,
                                              float *y_out);

void BKE_curveprofile_blend_write(struct BlendWriter *writer, const struct CurveProfile *profile);
/**
 * Expects that the curve profile itself has been read already.
 */
void BKE_curveprofile_blend_read(struct BlendDataReader *reader, struct CurveProfile *profile);

#ifdef __cplusplus
}
#endif