From 6658b1fa2b4d69f1281c594e6a40093ba4f5670a Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Tue, 3 May 2016 13:44:10 +0600 Subject: [PATCH] Allow combining extrude, lathe, translate and rotate group as assemblies. This significantly improves performance e.g. in case of a sketch containing a multitude of wooden panels, as the meshes can be merely transformed instead of being joined. --- CHANGELOG.md | 4 ++++ src/groupmesh.cpp | 8 +++++--- src/sketch.h | 2 +- src/textscreens.cpp | 6 ++---- test/CMakeLists.txt | 4 +++- test/group/translate_asy/normal.png | Bin 0 -> 8317 bytes test/group/translate_asy/normal.slvs | Bin 0 -> 60318 bytes test/group/translate_asy/test.cpp | 22 ++++++++++++++++++++++ test/harness.cpp | 12 ++++++++++++ test/harness.h | 6 +++++- 10 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 test/group/translate_asy/normal.png create mode 100644 test/group/translate_asy/normal.slvs create mode 100644 test/group/translate_asy/test.cpp diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cbda8d..fce70d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ Changelog 3.0 --- +New sketch features: + * Extrude, lathe, translate and rotate groups can now use the "assembly" + boolean operation, to increase performance. + New export/import features: * Three.js: allow configuring projection for exported model, and initially use the current viewport projection. diff --git a/src/groupmesh.cpp b/src/groupmesh.cpp index a890195..3c68d41 100644 --- a/src/groupmesh.cpp +++ b/src/groupmesh.cpp @@ -103,7 +103,7 @@ void SMesh::RemapFaces(Group *g, int remap) { } template -void Group::GenerateForStepAndRepeat(T *steps, T *outs) { +void Group::GenerateForStepAndRepeat(T *steps, T *outs, Group::CombineAs forWhat) { T workA, workB; workA = {}; workB = {}; @@ -141,6 +141,8 @@ void Group::GenerateForStepAndRepeat(T *steps, T *outs) { // And tack this transformed copy on to the return. if(soFar->IsEmpty()) { scratch->MakeFromCopyOf(&transd); + } else if (forWhat == CombineAs::ASSEMBLE) { + scratch->MakeFromAssemblyOf(soFar, &transd); } else { scratch->MakeFromUnionOf(soFar, &transd); } @@ -202,8 +204,8 @@ void Group::GenerateShellAndMesh() { srcg = SK.GetGroup(opA); if(!srcg->suppress) { - GenerateForStepAndRepeat(&(srcg->thisShell), &thisShell); - GenerateForStepAndRepeat (&(srcg->thisMesh), &thisMesh); + GenerateForStepAndRepeat(&(srcg->thisShell), &thisShell, srcg->meshCombine); + GenerateForStepAndRepeat (&(srcg->thisMesh), &thisMesh, srcg->meshCombine); } } else if(type == Type::EXTRUDE && haveSrc) { Group *src = SK.GetGroup(opA); diff --git a/src/sketch.h b/src/sketch.h index 7af9c8f..f4f8e42 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -268,7 +268,7 @@ public: bool IsMeshGroup(); void GenerateShellAndMesh(); - template void GenerateForStepAndRepeat(T *steps, T *outs); + template void GenerateForStepAndRepeat(T *steps, T *outs, Group::CombineAs forWhat); template void GenerateForBoolean(T *a, T *b, T *o, Group::CombineAs how); void GenerateDisplayItems(); diff --git a/src/textscreens.cpp b/src/textscreens.cpp index 1d2613d..7f05c75 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -352,12 +352,11 @@ void TextWindow::ShowGroupInfo() { bool un = (g->meshCombine == Group::CombineAs::UNION); bool diff = (g->meshCombine == Group::CombineAs::DIFFERENCE); bool asy = (g->meshCombine == Group::CombineAs::ASSEMBLE); - bool asa = (g->type == Group::Type::LINKED); Printf(false, " %Ftsolid model as"); Printf(false, "%Ba %f%D%Lc%Fd%s union%E " "%f%D%Lc%Fd%s difference%E " - "%f%D%Lc%Fd%s%s%E ", + "%f%D%Lc%Fd%s assemble%E ", &TextWindow::ScreenChangeGroupOption, Group::CombineAs::UNION, un ? RADIO_TRUE : RADIO_FALSE, @@ -366,8 +365,7 @@ void TextWindow::ShowGroupInfo() { diff ? RADIO_TRUE : RADIO_FALSE, &TextWindow::ScreenChangeGroupOption, Group::CombineAs::ASSEMBLE, - asa ? (asy ? RADIO_TRUE : RADIO_FALSE) : " ", - asa ? " assemble" : ""); + (asy ? RADIO_TRUE : RADIO_FALSE)); if(g->type == Group::Type::EXTRUDE || g->type == Group::Type::LATHE) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 40b7436..97f374d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -52,7 +52,9 @@ set(testsuite_SOURCES request/cubic_periodic/test.cpp request/datum_point/test.cpp request/line_segment/test.cpp - request/ttf_text/test.cpp) + request/ttf_text/test.cpp + group/translate_asy/test.cpp +) add_executable(solvespace_testsuite ${testsuite_SOURCES}) diff --git a/test/group/translate_asy/normal.png b/test/group/translate_asy/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..c889c07e9fdde7e067f470600ca68c3be1421d82 GIT binary patch literal 8317 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 literal 0 HcmV?d00001 diff --git a/test/group/translate_asy/normal.slvs b/test/group/translate_asy/normal.slvs new file mode 100644 index 0000000000000000000000000000000000000000..2f013bcb967c236d8799bc48f6e3c6e60be420dd GIT binary patch literal 60318 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 literal 0 HcmV?d00001 diff --git a/test/group/translate_asy/test.cpp b/test/group/translate_asy/test.cpp new file mode 100644 index 0000000..9263013 --- /dev/null +++ b/test/group/translate_asy/test.cpp @@ -0,0 +1,22 @@ +#include "harness.h" + +TEST_CASE(normal_roundtrip) { + CHECK_LOAD("normal.slvs"); + CHECK_RENDER_ISO("normal.png"); + CHECK_SAVE("normal.slvs"); +} + +TEST_CASE(normal_inters) { + CHECK_LOAD("normal.slvs"); + + Group *g = SK.GetGroup(SS.GW.activeGroup); + SMesh *m = &g->displayMesh; + + SEdgeList el = {}; + bool inters, leaks; + SKdNode::From(m)->MakeCertainEdgesInto(&el, + EdgeKind::SELF_INTER, /*coplanarIsInter=*/false, &inters, &leaks); + + // The assembly is supposed to interfere. + CHECK_TRUE(inters); +} diff --git a/test/harness.cpp b/test/harness.cpp index a5fe01e..2ebfd00 100644 --- a/test/harness.cpp +++ b/test/harness.cpp @@ -260,6 +260,18 @@ bool Test::Helper::CheckRender(const char *file, int line, const char *reference } } +bool Test::Helper::CheckRenderXY(const char *file, int line, const char *fixture) { + SS.GW.projRight = Vector::From(1, 0, 0); + SS.GW.projUp = Vector::From(0, 1, 0); + return CheckRender(file, line, fixture); +} + +bool Test::Helper::CheckRenderIso(const char *file, int line, const char *fixture) { + SS.GW.projRight = Vector::From(0.707, 0.000, -0.707); + SS.GW.projUp = Vector::From(-0.408, 0.816, -0.408); + return CheckRender(file, line, fixture); +} + // Avoid global constructors; using a global static vector instead of a local one // breaks MinGW for some obscure reason. static std::vector *testCasesPtr; diff --git a/test/harness.h b/test/harness.h index f3e7928..74798e0 100644 --- a/test/harness.h +++ b/test/harness.h @@ -25,6 +25,8 @@ public: bool CheckLoad(const char *file, int line, const char *fixture); bool CheckSave(const char *file, int line, const char *reference); bool CheckRender(const char *file, int line, const char *fixture); + bool CheckRenderXY(const char *file, int line, const char *fixture); + bool CheckRenderIso(const char *file, int line, const char *fixture); }; class Case { @@ -54,4 +56,6 @@ using namespace SolveSpace; #define CHECK_SAVE(fixture) \ do { if(!helper->CheckSave(__FILE__, __LINE__, fixture)) return; } while(0) #define CHECK_RENDER(reference) \ - do { if(!helper->CheckRender(__FILE__, __LINE__, reference)) return; } while(0) + do { if(!helper->CheckRenderXY(__FILE__, __LINE__, reference)) return; } while(0) +#define CHECK_RENDER_ISO(reference) \ + do { if(!helper->CheckRenderIso(__FILE__, __LINE__, reference)) return; } while(0)