mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-05-19 11:23:42 +00:00
Fix part offset
This commit is contained in:
@@ -34,7 +34,7 @@ static void remap_and_set_painting(ModelVolume* vol, const SavedPainting* saved)
|
|||||||
FacetsAnnotation& target_facets) {
|
FacetsAnnotation& target_facets) {
|
||||||
if (src_data.bitstream.empty())
|
if (src_data.bitstream.empty())
|
||||||
return;
|
return;
|
||||||
auto result = TriangleSelector::remap_painting(saved->its, src_data, vol->mesh().its);
|
auto result = TriangleSelector::remap_painting(saved->its, src_data, vol->mesh().its, translation_transform(vol->mesh().get_init_shift()));
|
||||||
if (!result.bitstream.empty())
|
if (!result.bitstream.empty())
|
||||||
target_facets.set_data(result);
|
target_facets.set_data(result);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -2361,7 +2361,8 @@ const double TriangleCursor::facet_angle_limit = cos(Geometry::deg2rad(5));
|
|||||||
TriangleSelector::TriangleSplittingData TriangleSelector::remap_painting(
|
TriangleSelector::TriangleSplittingData TriangleSelector::remap_painting(
|
||||||
const indexed_triangle_set& source_its,
|
const indexed_triangle_set& source_its,
|
||||||
const TriangleSplittingData& source_painting,
|
const TriangleSplittingData& source_painting,
|
||||||
const indexed_triangle_set& target_its)
|
const indexed_triangle_set& target_its,
|
||||||
|
const Transform3d& target_transform)
|
||||||
{
|
{
|
||||||
TriangleSelector::TriangleSplittingData result;
|
TriangleSelector::TriangleSplittingData result;
|
||||||
if (source_painting.bitstream.empty())
|
if (source_painting.bitstream.empty())
|
||||||
@@ -2385,7 +2386,9 @@ TriangleSelector::TriangleSplittingData TriangleSelector::remap_painting(
|
|||||||
return result;
|
return result;
|
||||||
|
|
||||||
// 3. Build AABB tree of target mesh so we could find nearest face quickly
|
// 3. Build AABB tree of target mesh so we could find nearest face quickly
|
||||||
AABBTreeIndirect::Tree3f target_tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(target_its.vertices, target_its.indices);
|
TriangleMesh target_mesh(target_its);
|
||||||
|
target_mesh.transform(target_transform);
|
||||||
|
AABBTreeIndirect::Tree3f target_tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(target_mesh.its.vertices, target_mesh.its.indices);
|
||||||
|
|
||||||
// Helper: check overlap between a paint triangle and a target triangle.
|
// Helper: check overlap between a paint triangle and a target triangle.
|
||||||
// Uses 3D barycentric point-in-triangle tests and dominant-axis 2D projection
|
// Uses 3D barycentric point-in-triangle tests and dominant-axis 2D projection
|
||||||
@@ -2431,7 +2434,6 @@ TriangleSelector::TriangleSplittingData TriangleSelector::remap_painting(
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 4. For each painted face, we find the nearest target face, and apply the TriangleCursor to paint it
|
// 4. For each painted face, we find the nearest target face, and apply the TriangleCursor to paint it
|
||||||
TriangleMesh target_mesh(target_its);
|
|
||||||
TriangleSelector target_selector(target_mesh);
|
TriangleSelector target_selector(target_mesh);
|
||||||
for (auto tri_ref : painted_triangles) {
|
for (auto tri_ref : painted_triangles) {
|
||||||
const Triangle& tri = tri_ref.get();
|
const Triangle& tri = tri_ref.get();
|
||||||
@@ -2448,16 +2450,16 @@ TriangleSelector::TriangleSplittingData TriangleSelector::remap_painting(
|
|||||||
|
|
||||||
AABBTreeIndirect::traverse(target_tree, AABBTreeIndirect::intersecting(pt_bbox), [&](const AABBTreeIndirect::Tree3f::Node& node) -> bool {
|
AABBTreeIndirect::traverse(target_tree, AABBTreeIndirect::intersecting(pt_bbox), [&](const AABBTreeIndirect::Tree3f::Node& node) -> bool {
|
||||||
size_t face_idx = node.idx;
|
size_t face_idx = node.idx;
|
||||||
if (face_idx >= target_its.indices.size())
|
if (face_idx >= target_mesh.its.indices.size())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
const Vec3f& norm_a = source_selector.m_face_normals[tri.source_triangle];
|
const Vec3f& norm_a = source_selector.m_face_normals[tri.source_triangle];
|
||||||
const Vec3f& norm_b = target_selector.m_face_normals[face_idx];
|
const Vec3f& norm_b = target_selector.m_face_normals[face_idx];
|
||||||
|
|
||||||
const Vec3i32& face = target_its.indices[face_idx];
|
const Vec3i32& face = target_mesh.its.indices[face_idx];
|
||||||
const Vec3f& ta = target_its.vertices[face(0)];
|
const Vec3f& ta = target_mesh.its.vertices[face(0)];
|
||||||
const Vec3f& tb = target_its.vertices[face(1)];
|
const Vec3f& tb = target_mesh.its.vertices[face(1)];
|
||||||
const Vec3f& tc = target_its.vertices[face(2)];
|
const Vec3f& tc = target_mesh.its.vertices[face(2)];
|
||||||
|
|
||||||
if (TriangleCursor::check_normal(norm_b, -norm_a) && check_overlap(pv0, pv1, pv2, ta, tb, tc)) {
|
if (TriangleCursor::check_normal(norm_b, -norm_a) && check_overlap(pv0, pv1, pv2, ta, tb, tc)) {
|
||||||
// Paint this face
|
// Paint this face
|
||||||
|
|||||||
@@ -373,11 +373,12 @@ public:
|
|||||||
void seed_fill_apply_on_triangles(EnforcerBlockerType new_state);
|
void seed_fill_apply_on_triangles(EnforcerBlockerType new_state);
|
||||||
|
|
||||||
// Remap painting data from source mesh to target mesh using spatial mapping.
|
// Remap painting data from source mesh to target mesh using spatial mapping.
|
||||||
// Both meshes must be in the same coordinate space.
|
// `target_transform` should transform the target mesh into source's coordinate space.
|
||||||
static TriangleSplittingData remap_painting(
|
static TriangleSplittingData remap_painting(
|
||||||
const indexed_triangle_set& source_its,
|
const indexed_triangle_set& source_its,
|
||||||
const TriangleSplittingData& source_painting,
|
const TriangleSplittingData& source_painting,
|
||||||
const indexed_triangle_set& target_its);
|
const indexed_triangle_set& target_its,
|
||||||
|
const Transform3d& target_transform);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Triangle and info about how it's split.
|
// Triangle and info about how it's split.
|
||||||
|
|||||||
Reference in New Issue
Block a user