40#include <fmt/format.h>
53 std::accumulate(values.
begin(), values.
end(), 0.0f) / values.
size();
110 if (mat_index == -1) {
127 mat_index =
object_->totcol - 1;
138std::optional<Bounds<float2>> GreasePencilExporter::compute_screen_space_drawing_bounds(
141 const int layer_index,
147 std::optional<Bounds<float2>> drawing_bounds = std::nullopt;
160 object, drawing, memory);
165 for (
const int point_i : points) {
172 std::optional<Bounds<float2>> point_bounds =
Bounds<float2>(screen_co);
173 point_bounds->pad(pixels);
174 drawing_bounds =
bounds::merge(drawing_bounds, point_bounds);
179 return drawing_bounds;
182std::optional<Bounds<float2>> GreasePencilExporter::compute_objects_bounds(
185 const Span<GreasePencilExporter::ObjectInfo> objects,
186 const int frame_number)
188 using bke::greasepencil::Drawing;
189 using bke::greasepencil::Layer;
190 using ObjectInfo = GreasePencilExporter::ObjectInfo;
192 constexpr float gap = 10.0f;
194 std::optional<Bounds<float2>> full_bounds = std::nullopt;
200 for (
const int layer_index : grease_pencil_eval.layers().index_range()) {
201 const Layer &layer = *grease_pencil_eval.layers()[layer_index];
202 const Drawing *drawing = grease_pencil_eval.get_drawing_at(layer, frame_number);
203 if (drawing ==
nullptr) {
207 std::optional<Bounds<float2>> layer_bounds = this->compute_screen_space_drawing_bounds(
208 rv3d, *object_eval, layer_index, *drawing);
215 full_bounds->pad(gap);
227 if (cam_ob ==
nullptr) {
252 if (use_camera_view) {
275 std::optional<Bounds<float2>> full_bounds = this->compute_objects_bounds(
306 for (const int index : range) {
307 const float3 &pos = world_positions[index];
308 const float radius = radii[index];
310 widths[index] = 2.0f * radius / ED_view3d_pixel_size(&rv3d, pos);
327 auto add_object = [&](
Object *object) {
332 const float3 position =
object->object_to_world().location();
336 const float depth = use_ortho_depth ?
math::dot(camera_z_axis, position) :
338 objects.
append({object, depth});
342 case SelectMode::Active:
345 case SelectMode::Selected:
348 add_object(base->object);
352 case SelectMode::Visible:
355 add_object(base->object);
363 return info1.depth < info2.depth;
378 const float4x4 layer_to_view = viewmat * layer_to_world;
405 const IndexRange points = points_by_curve[i_curve];
406 const int8_t type =
types[i_curve];
407 if (points.
size() < 2) {
412 const int material_index = material_indices[i_curve];
418 return material_default;
431 if (is_fill_material &&
params_.export_fill_materials) {
434 material_fill_color, fill_colors[i_curve], fill_colors[i_curve].a);
435 stroke_fn(positions.slice(points),
448 if (is_stroke_material &&
params_.export_stroke_materials) {
450 *material, vertex_colors.
slice(points));
453 const std::optional<float> uniform_width =
params_.use_uniform_width ?
456 world_positions.
as_span().slice(points),
457 radii.
slice(points)) :
465 stroke_fn(positions.slice(points),
479 constexpr int corner_subdivisions = 3;
480 constexpr float outline_radius = 0.0f;
481 constexpr float outline_offset = 0.0f;
491 if (
params_.outline_resample_length > 0.0f) {
503 for (
const int i_outline_curve : outline.
curves_range()) {
504 const IndexRange outline_points = outline_points_by_curve[i_outline_curve];
506 stroke_fn(outline_positions.
slice(outline_points),
507 outline_positions_left.
slice_safe(outline_points),
508 outline_positions_right.
slice_safe(outline_points),
523 const float3 &position)
const
549 const int frame_number)
const
552 if (layer->is_visible()) {
554 if ((frame !=
nullptr) && frame->is_selected()) {
566 return fmt::format(
"{},{}", screen_co.x,
camera_rect_.size().y - screen_co.y);
568 return fmt::format(
"{},{}", screen_co.x,
screen_rect_.size().y - screen_co.y);
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.
Material * BKE_material_default_gpencil()
Material * BKE_object_material_get(Object *ob, short act)
void BKE_render_resolution(const RenderData *r, const bool use_crop, int *r_width, int *r_height)
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])
T * DEG_get_evaluated(const Depsgraph *depsgraph, T *id)
GreasePencilStrokeCapType
@ GP_STROKE_CAP_TYPE_ROUND
struct GreasePencil GreasePencil
@ GP_MATERIAL_STROKE_SHOW
Object is a sort of wrapper for general info.
#define BASE_SELECTED(v3d, base)
struct RegionView3D RegionView3D
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)
BPy_StructRNA * depsgraph
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
const GreasePencilFrame * frame_at(const int frame_number) const
Span< T > as_span() const
IndexRange index_range() const
constexpr int64_t size() const
static constexpr IndexRange from_single(const int64_t index)
Span< NewT > constexpr cast() const
constexpr Span slice_safe(const int64_t start, const int64_t size) const
constexpr Span slice(int64_t start, int64_t size) const
constexpr int64_t size() const
constexpr const T * end() const
constexpr const T * begin() const
constexpr bool is_empty() const
static VArray from_single(T value, const int64_t size)
void append(const T &value)
GAttributeReader lookup_or_default(StringRef attribute_id, AttrDomain domain, AttrType data_type, const void *default_value=nullptr) const
OffsetIndices< int > points_by_curve() const
IndexRange curves_range() const
std::optional< Span< float3 > > handle_positions_left() const
Span< float3 > positions() const
std::optional< Span< float3 > > handle_positions_right() const
AttributeAccessor attributes() const
VArray< int8_t > curve_types() const
VArray< bool > cyclic() const
VArray< ColorGeometry4f > vertex_colors() const
const bke::CurvesGeometry & strokes() const
VArray< float > radii() const
VArray< ColorGeometry4f > fill_colors() const
VArray< float > opacities() const
float4x4 to_world_space(const Object &object) const
void foreach_index(Fn &&fn) const
GreasePencilExporter(const IOContext &context, const ExportParams ¶ms)
std::string coord_to_svg_string(const float2 &screen_co) const
static std::optional< float > try_get_uniform_point_width(const RegionView3D &rv3d, const Span< float3 > world_positions, const Span< float > radii)
blender::Bounds< float2 > screen_rect_
std::optional< float4x4 > camera_persmat_
FunctionRef< void(const Span< float3 > positions, const Span< float3 > positions_left, const Span< float3 > positions_right, bool cyclic, int8_t type, const ColorGeometry4f &color, float opacity, std::optional< float > width, bool round_cap, bool is_outline)> WriteStrokeFn
const ExportParams params_
blender::Bounds< float2 > camera_rect_
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
bool is_selected_frame(const GreasePencil &grease_pencil, int frame_number) 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)
const ImportParams params_
static bool is_cyclic(const Nurb *nu)
Bounds< T > merge(const Bounds< T > &a, const Bounds< T > &b)
IndexMask retrieve_visible_strokes(Object &object, const bke::greasepencil::Drawing &drawing, IndexMaskMemory &memory)
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={}, bool keep_last_segment=false)
static float4x4 persmat_from_camera_object(Scene &scene)
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)
void transform_points(const float4x4 &transform, MutableSpan< float3 > points, bool use_threading=true)
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))
MatBase< float, 4, 4 > float4x4
VecBase< float, 4 > float4
VecBase< float, 2 > float2
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
struct MaterialGPencilStyle * gp_style
static MatBase identity()
IOContext(bContext &C, const ARegion *region, const View3D *v3d, const RegionView3D *rv3d, ReportList *reports)
const RegionView3D * rv3d