Fix T86942: GPencil does not export SVG or PDF in orthographic camera
The calculation of the 2D point was wrong when using orthographic mode. Also small cleanup in float3 variable. Differential Revision: https://developer.blender.org/D10828
This commit is contained in:
parent
2371454b2d
commit
921d0851b5
Notes:
blender-bot
2023-02-13 19:08:23 +01:00
Referenced by issue #86942, Grease Pencil export as SVG or PDF does not export line art when the camera is in orthographic mode
|
@ -85,9 +85,11 @@ GpencilIO::GpencilIO(const GpencilIOParams *iparams)
|
|||
invert_m4_m4(viewmat, cam_ob->obmat);
|
||||
|
||||
mul_m4_m4m4(persmat_, params.winmat, viewmat);
|
||||
is_ortho_ = params.is_ortho;
|
||||
}
|
||||
else {
|
||||
unit_m4(persmat_);
|
||||
is_ortho_ = false;
|
||||
}
|
||||
|
||||
winx_ = params_.region->winx;
|
||||
|
@ -112,6 +114,7 @@ GpencilIO::GpencilIO(const GpencilIOParams *iparams)
|
|||
}
|
||||
else {
|
||||
is_camera_ = false;
|
||||
is_ortho_ = false;
|
||||
/* Calc selected object boundbox. Need set initial value to some variables. */
|
||||
camera_ratio_ = 1.0f;
|
||||
offset_.x = 0.0f;
|
||||
|
@ -228,13 +231,15 @@ bool GpencilIO::gpencil_3D_point_to_screen_space(const float3 co, float2 &r_co)
|
|||
}
|
||||
|
||||
/** Convert to render space. */
|
||||
float2 GpencilIO::gpencil_3D_point_to_render_space(const float3 co)
|
||||
float2 GpencilIO::gpencil_3D_point_to_render_space(const float3 co, const bool is_ortho)
|
||||
{
|
||||
float3 parent_co = diff_mat_ * co;
|
||||
mul_m4_v3(persmat_, parent_co);
|
||||
|
||||
parent_co.x = parent_co.x / max_ff(FLT_MIN, parent_co[2]);
|
||||
parent_co.y = parent_co.y / max_ff(FLT_MIN, parent_co[2]);
|
||||
if (!is_ortho) {
|
||||
parent_co.x = parent_co.x / max_ff(FLT_MIN, parent_co.z);
|
||||
parent_co.y = parent_co.y / max_ff(FLT_MIN, parent_co.z);
|
||||
}
|
||||
|
||||
float2 r_co;
|
||||
r_co.x = (parent_co.x + 1.0f) / 2.0f * (float)render_x_;
|
||||
|
@ -257,7 +262,7 @@ float2 GpencilIO::gpencil_3D_point_to_2D(const float3 co)
|
|||
{
|
||||
const bool is_camera = (bool)(rv3d_->persp == RV3D_CAMOB);
|
||||
if (is_camera) {
|
||||
return gpencil_3D_point_to_render_space(co);
|
||||
return gpencil_3D_point_to_render_space(co, is_orthographic());
|
||||
}
|
||||
float2 result;
|
||||
gpencil_3D_point_to_screen_space(co, result);
|
||||
|
@ -324,6 +329,11 @@ bool GpencilIO::is_camera_mode()
|
|||
return is_camera_;
|
||||
}
|
||||
|
||||
bool GpencilIO::is_orthographic()
|
||||
{
|
||||
return is_ortho_;
|
||||
}
|
||||
|
||||
/* Calculate selected strokes boundbox. */
|
||||
void GpencilIO::selected_objects_boundbox_calc()
|
||||
{
|
||||
|
|
|
@ -87,13 +87,14 @@ class GpencilIO {
|
|||
|
||||
/* Geometry functions. */
|
||||
bool gpencil_3D_point_to_screen_space(const float3 co, float2 &r_co);
|
||||
float2 gpencil_3D_point_to_render_space(const float3 co);
|
||||
float2 gpencil_3D_point_to_render_space(const float3 co, const bool is_ortho);
|
||||
float2 gpencil_3D_point_to_2D(const float3 co);
|
||||
|
||||
float stroke_point_radius_get(struct bGPDlayer *gpl, struct bGPDstroke *gps);
|
||||
void create_object_list();
|
||||
|
||||
bool is_camera_mode();
|
||||
bool is_orthographic();
|
||||
|
||||
float stroke_average_opacity_get();
|
||||
|
||||
|
@ -107,6 +108,7 @@ class GpencilIO {
|
|||
private:
|
||||
float avg_opacity_;
|
||||
bool is_camera_;
|
||||
bool is_ortho_;
|
||||
rctf select_boundbox_;
|
||||
|
||||
/* Camera matrix. */
|
||||
|
|
Loading…
Reference in New Issue