47 return values.is_empty() ? 0.0f :
48 std::accumulate(values.begin(), values.end(), 0.0f) / values.size();
53 if (values.is_empty()) {
64 const float epsilon = 1e-5f)
66 if (values.is_empty()) {
69 const float first_value = values.first();
70 const std::optional<float> first_value_opt = std::make_optional(first_value);
72 values.index_range().drop_front(1),
75 [&](
const IndexRange range,
const std::optional<float> ) -> std::optional<float> {
76 for (const int i : range) {
77 if (math::abs(values[i] - first_value) > epsilon) {
81 return first_value_opt;
83 [&](
const std::optional<float> a,
const std::optional<float>
b) {
84 return (a &&
b) ? first_value_opt : std::nullopt;
104 : context_(context), params_(
params)
130 if (mat_index == -1) {
134 bmain,
object_, name.c_str(), &new_idx);
136 gp_style->
flag &= ~GP_MATERIAL_STROKE_SHOW;
137 gp_style->
flag &= ~GP_MATERIAL_FILL_SHOW;
154 : context_(context), params_(
params)
169 auto is_visible_curve = [&](
const int curve_i) {
172 if (points.size() < 2) {
178 materials[curve_i] + 1);
182 if (gp_style ==
nullptr || is_hidden_material || !is_stroke_material) {
197 const Object &object_eval,
198 const int layer_index,
199 const int frame_number,
205 std::optional<Bounds<float2>> drawing_bounds = std::nullopt;
209 if (!grease_pencil.has_active_layer()) {
210 return drawing_bounds;
213 const Layer &layer = *grease_pencil.layers()[layer_index];
214 const float4x4 layer_to_world = layer.to_world_space(
object);
217 &object_eval,
object, layer_index, frame_number);
227 if (points.size() < 2) {
231 for (
const int point_i : points) {
233 deformation.positions[point_i]);
240 std::optional<Bounds<float2>> point_bounds =
Bounds<float2>(screen_co);
241 point_bounds->pad(pixels);
242 drawing_bounds =
bounds::merge(drawing_bounds, point_bounds);
247 return drawing_bounds;
255 const int frame_number)
261 constexpr float gap = 10.0f;
263 std::optional<Bounds<float2>> full_bounds = std::nullopt;
265 for (
const ObjectInfo &info : objects) {
269 for (
const int layer_index : grease_pencil_eval.layers().index_range()) {
270 const Layer &layer = *grease_pencil_eval.layers()[layer_index];
271 const Drawing *drawing = grease_pencil_eval.get_drawing_at(layer, frame_number);
272 if (drawing ==
nullptr) {
277 region, rv3d, *info.object, *object_eval, layer_index, frame_number, *drawing);
284 full_bounds->pad(gap);
295 Object *cam_ob = scene.camera;
296 if (cam_ob ==
nullptr) {
309 &
params, scene.r.xsch, scene.r.ysch, scene.r.xasp, scene.r.yasp);
322 if (use_camera_view) {
362 const float3 &pos = world_positions[index];
363 const float radius = radii[index];
364 return 2.0f * radius * ED_view3d_pixel_size(&rv3d, pos);
380 auto add_object = [&](
Object *object) {
385 const float3 position =
object->object_to_world().location();
389 const float depth = use_ortho_depth ?
math::dot(camera_z_axis, position) :
391 objects.append({object, depth});
395 case SelectMode::Active:
398 case SelectMode::Selected:
401 add_object(base->object);
405 case SelectMode::Visible:
407 add_object(base->object);
413 std::sort(objects.begin(), objects.end(), [](
const ObjectInfo &info1,
const ObjectInfo &info2) {
414 return info1.depth < info2.depth;
427 const float4x4 layer_to_world = layer.to_world_space(
object);
429 const float4x4 layer_to_view = viewmat * layer_to_world;
434 const OffsetIndices points_by_curve = curves.points_by_curve();
436 const VArraySpan<int> material_indices = *attributes.lookup_or_default<
int>(
451 for (const int i : range) {
452 world_positions[i] = math::transform_point(layer_to_world, positions[i]);
456 for (
const int i_curve : curves.curves_range()) {
457 const IndexRange points = points_by_curve[i_curve];
458 if (points.size() < 2) {
463 const int material_index = material_indices[i_curve];
474 if (is_fill_material && params_.export_fill_materials) {
477 material_fill_color, fill_colors[i_curve], fill_colors[i_curve].a);
478 stroke_fn(positions.slice(points),
488 if (is_stroke_material && params_.export_stroke_materials) {
490 *material, vertex_colors.slice(points));
491 const float stroke_opacity = compute_average_stroke_opacity(opacities.slice(points)) *
493 const std::optional<float> uniform_width = params_.use_uniform_width ?
494 try_get_uniform_point_width(
496 world_positions.as_span().slice(points),
497 radii.slice(points)) :
505 stroke_fn(positions.slice(points),
516 constexpr int corner_subdivisions = 3;
517 constexpr float outline_radius = 0.0f;
518 constexpr float outline_offset = 0.0f;
528 if (params_.outline_resample_length > 0.0f) {
530 params_.outline_resample_length, curves.curves_num());
534 const OffsetIndices outline_points_by_curve = outline.points_by_curve();
535 const Span<float3> outline_positions = outline.positions();
537 for (
const int i_outline_curve : outline.curves_range()) {
538 const IndexRange outline_points = outline_points_by_curve[i_outline_curve];
540 stroke_fn(outline_positions.slice(outline_points),
554 const float3 &position)
const
Camera data-block and utility functions.
void BKE_camera_params_init(CameraParams *params)
void BKE_camera_params_from_object(CameraParams *params, const struct Object *cam_ob)
void BKE_camera_params_compute_viewplane(CameraParams *params, int winx, int winy, float aspx, float aspy)
void BKE_camera_params_compute_matrix(CameraParams *params)
Depsgraph * CTX_data_depsgraph_pointer(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
Main * CTX_data_main(const bContext *C)
ViewLayer * CTX_data_view_layer(const bContext *C)
Low-level operations for curves.
Low-level operations for grease pencil.
Material * BKE_grease_pencil_object_material_new(Main *bmain, Object *ob, const char *name, int *r_index)
int BKE_grease_pencil_object_material_index_get_by_name(Object *ob, const char *name)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
ListBase * BKE_view_layer_object_bases_get(ViewLayer *view_layer)
General operations, lookup, etc. for materials.
struct Material * BKE_object_material_get(struct Object *ob, short act)
bool BKE_scene_camera_switch_update(Scene *scene)
#define LISTBASE_FOREACH(type, var, list)
MINLINE void copy_v4_v4(float r[4], const float a[4])
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
GreasePencilStrokeCapType
@ GP_STROKE_CAP_TYPE_ROUND
@ GP_MATERIAL_STROKE_SHOW
Object is a sort of wrapper for general info.
#define BASE_SELECTED(v3d, base)
float ED_view3d_pixel_size(const RegionView3D *rv3d, const float co[3])
float ED_view3d_calc_zfac(const RegionView3D *rv3d, const float co[3])
void ED_view3d_calc_camera_border(const Scene *scene, const Depsgraph *depsgraph, const ARegion *region, const View3D *v3d, const RegionView3D *rv3d, bool no_shift, rctf *r_viewborder)
eV3DProjStatus ED_view3d_project_float_global(const ARegion *region, const float co[3], float r_co[2], eV3DProjTest flag)
static constexpr IndexRange from_single(const int64_t index)
Span< NewT > constexpr cast() const
constexpr int64_t size() const
constexpr const T * end() const
constexpr const T * begin() const
static VArray ForSingle(T value, const int64_t size)
static VArray ForFunc(const int64_t size, GetFunc get_func)
OffsetIndices< int > points_by_curve() const
IndexRange curves_range() const
AttributeAccessor attributes() const
VArray< ColorGeometry4f > vertex_colors() const
const bke::CurvesGeometry & strokes() const
VArray< float > radii() const
VArray< ColorGeometry4f > fill_colors() const
VArray< float > opacities() const
static IndexMask from_predicate(const IndexMask &universe, GrainSize grain_size, IndexMaskMemory &memory, Fn &&predicate)
void foreach_index(Fn &&fn) const
GreasePencilExporter(const IOContext &context, const ExportParams ¶ms)
static std::optional< float > try_get_uniform_point_width(const RegionView3D &rv3d, const Span< float3 > world_positions, const Span< float > radii)
blender::Bounds< float2 > render_rect_
std::optional< float4x4 > camera_persmat_
const ExportParams params_
static ColorGeometry4f compute_average_stroke_color(const Material &material, const Span< ColorGeometry4f > vertex_colors)
void prepare_render_params(Scene &scene, int frame_number)
void foreach_stroke_in_layer(const Object &object, const bke::greasepencil::Layer &layer, const bke::greasepencil::Drawing &drawing, WriteStrokeFn stroke_fn)
Vector< ObjectInfo > retrieve_objects() const
static float compute_average_stroke_opacity(const Span< float > opacities)
float2 project_to_screen(const float4x4 &transform, const float3 &position) const
GreasePencilImporter(const IOContext &context, const ImportParams ¶ms)
int32_t create_material(StringRefNull name, bool stroke, bool fill)
Object * create_object(StringRefNull name)
local_group_size(16, 16) .push_constant(Type b
const Depsgraph * depsgraph
static bool is_cyclic(const Nurb *nu)
GeometryDeformation get_evaluated_grease_pencil_drawing_deformation(const Object *ob_eval, const Object &ob_orig, int layer_index, int frame)
Bounds< T > merge(const Bounds< T > &a, const Bounds< T > &b)
bke::CurvesGeometry create_curves_outline(const bke::greasepencil::Drawing &drawing, const IndexMask &strokes, const float4x4 &transform, const int corner_subdivisions, const float outline_radius, const float outline_offset, const int material_index)
Object * add_type(bContext *C, int type, const char *name, const float loc[3], const float rot[3], bool enter_editmode, unsigned short local_view_bits) ATTR_NONNULL(1) ATTR_RETURNS_NONNULL
CurvesGeometry resample_to_length(const CurvesGeometry &src_curves, const IndexMask &selection, const VArray< float > &sample_lengths, const ResampleCurvesOutputAttributeIDs &output_ids={})
static std::optional< float > try_get_constant_value(const VArray< float > values, const float epsilon=1e-5f)
static std::optional< Bounds< float2 > > compute_drawing_bounds(const ARegion ®ion, const RegionView3D &rv3d, const Object &object, const Object &object_eval, const int layer_index, const int frame_number, const bke::greasepencil::Drawing &drawing)
static std::optional< Bounds< float2 > > compute_objects_bounds(const ARegion ®ion, const RegionView3D &rv3d, const Depsgraph &depsgraph, const Span< GreasePencilExporter::ObjectInfo > objects, const int frame_number)
constexpr const char * attr_material_index
static float4x4 persmat_from_camera_object(Scene &scene)
static IndexMask get_visible_strokes(const Object &object, const bke::greasepencil::Drawing &drawing, IndexMaskMemory &memory)
static float get_average(const Span< float > values)
T dot(const QuaternionBase< T > &a, const QuaternionBase< T > &b)
CartesianBasis invert(const CartesianBasis &basis)
VectorT project_point(const MatT &mat, const VectorT &point)
T interpolate(const T &a, const T &b, const FactorT &t)
VecBase< T, 3 > transform_point(const CartesianBasis &basis, const VecBase< T, 3 > &v)
void parallel_for(const IndexRange range, const int64_t grain_size, const Function &function, const TaskSizeHints &size_hints=detail::TaskSizeHints_Static(1))
Value parallel_reduce(IndexRange range, int64_t grain_size, const Value &identity, const Function &function, const Reduction &reduction)
MatBase< float, 4, 4 > float4x4
VecBase< float, 2 > float2
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
struct MaterialGPencilStyle * gp_style
unsigned short local_view_uid
static MatBase identity()
const RegionView3D * rv3d