52 std::accumulate(values.
begin(), values.
end(), 0.0f) / values.
size();
109 if (mat_index == -1) {
126 mat_index =
object_->totcol - 1;
137std::optional<Bounds<float2>> GreasePencilExporter::compute_screen_space_drawing_bounds(
140 const int layer_index,
146 std::optional<Bounds<float2>> drawing_bounds = std::nullopt;
159 object, drawing, memory);
164 for (
const int point_i : points) {
171 std::optional<Bounds<float2>> point_bounds =
Bounds<float2>(screen_co);
172 point_bounds->pad(pixels);
173 drawing_bounds =
bounds::merge(drawing_bounds, point_bounds);
178 return drawing_bounds;
181std::optional<Bounds<float2>> GreasePencilExporter::compute_objects_bounds(
184 const Span<GreasePencilExporter::ObjectInfo> objects,
185 const int frame_number)
187 using bke::greasepencil::Drawing;
188 using bke::greasepencil::Layer;
189 using ObjectInfo = GreasePencilExporter::ObjectInfo;
191 constexpr float gap = 10.0f;
193 std::optional<Bounds<float2>> full_bounds = std::nullopt;
199 for (
const int layer_index : grease_pencil_eval.layers().index_range()) {
200 const Layer &layer = *grease_pencil_eval.layers()[layer_index];
201 const Drawing *drawing = grease_pencil_eval.get_drawing_at(layer, frame_number);
202 if (drawing ==
nullptr) {
206 std::optional<Bounds<float2>> layer_bounds = this->compute_screen_space_drawing_bounds(
207 rv3d, *object_eval, layer_index, *drawing);
214 full_bounds->pad(gap);
226 if (cam_ob ==
nullptr) {
251 if (use_camera_view) {
267 camera_rect_ = {{0.0f, 0.0f}, {float(width), float(height)}};
274 std::optional<Bounds<float2>> full_bounds = this->compute_objects_bounds(
305 for (const int index : range) {
306 const float3 &pos = world_positions[index];
307 const float radius = radii[index];
309 widths[index] = 2.0f * radius / ED_view3d_pixel_size(&rv3d, pos);
326 auto add_object = [&](
Object *object) {
331 const float3 position =
object->object_to_world().location();
335 const float depth = use_ortho_depth ?
math::dot(camera_z_axis, position) :
337 objects.
append({object, depth});
341 case SelectMode::Active:
344 case SelectMode::Selected:
347 add_object(base->object);
351 case SelectMode::Visible:
353 add_object(base->object);
360 return info1.depth < info2.depth;
375 const float4x4 layer_to_view = viewmat * layer_to_world;
397 for (const int i : range) {
398 world_positions[i] = math::transform_point(layer_to_world, positions[i]);
402 for (
const int i_curve : curves.curves_range()) {
403 const IndexRange points = points_by_curve[i_curve];
404 if (points.
size() < 2) {
409 const int material_index = material_indices[i_curve];
415 return material_default;
428 if (is_fill_material && params_.export_fill_materials) {
431 material_fill_color, fill_colors[i_curve], fill_colors[i_curve].a);
432 stroke_fn(positions.
slice(points),
442 if (is_stroke_material && params_.export_stroke_materials) {
444 *material, vertex_colors.slice(points));
445 const float stroke_opacity = compute_average_stroke_opacity(opacities.slice(points)) *
447 const std::optional<float> uniform_width = params_.use_uniform_width ?
448 try_get_uniform_point_width(
450 world_positions.as_span().slice(points),
451 radii.slice(points)) :
459 stroke_fn(positions.
slice(points),
470 constexpr int corner_subdivisions = 3;
471 constexpr float outline_radius = 0.0f;
472 constexpr float outline_offset = 0.0f;
482 if (params_.outline_resample_length > 0.0f) {
484 params_.outline_resample_length, outline.curves_num());
486 outline, outline.curves_range(), resample_lengths);
489 const OffsetIndices outline_points_by_curve = outline.points_by_curve();
490 const Span<float3> outline_positions = outline.positions();
492 for (
const int i_outline_curve : outline.curves_range()) {
493 const IndexRange outline_points = outline_points_by_curve[i_outline_curve];
495 stroke_fn(outline_positions.
slice(outline_points),
509 const float3 &position)
const
535 const int frame_number)
const
538 if (layer->is_visible()) {
540 if ((frame !=
nullptr) && frame->is_selected()) {
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
constexpr Span slice(int64_t start, int64_t size) 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(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
constexpr const char * c_str() const
static VArray ForSingle(T value, const int64_t size)
void append(const T &value)
GAttributeReader lookup_or_default(StringRef attribute_id, AttrDomain domain, eCustomDataType data_type, const void *default_value=nullptr) const
OffsetIndices< int > points_by_curve() const
Span< float3 > positions() const
AttributeAccessor attributes() 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)
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_
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
FunctionRef< void(const Span< float3 > positions, bool cyclic, const ColorGeometry4f &color, float opacity, std::optional< float > width, bool round_cap, bool is_outline)> WriteStrokeFn
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)
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