add assembly to gcompose, not working yet
This commit is contained in:
@@ -25,7 +25,9 @@ Assembly::Assembly()
|
||||
m_BBoxMin(Vector3f::Zero()),
|
||||
m_BBoxMax(Vector3f::Zero()),
|
||||
m_ShowBoundingBox(false),
|
||||
m_GroupSelection(true) {}
|
||||
m_GroupSelection(true) {
|
||||
ULIB_ACTIVATE_PROPERTIES(*this);
|
||||
}
|
||||
|
||||
Assembly::Assembly(const Assembly ©)
|
||||
: ObjectsContext(copy),
|
||||
@@ -35,13 +37,25 @@ Assembly::Assembly(const Assembly ©)
|
||||
m_ShowBoundingBox(copy.m_ShowBoundingBox),
|
||||
m_GroupSelection(copy.m_GroupSelection) {}
|
||||
|
||||
Assembly::~Assembly() {}
|
||||
Assembly::~Assembly() {
|
||||
for (auto const& [obj, conn] : m_ChildConnections) {
|
||||
conn.disconnect();
|
||||
}
|
||||
m_ChildConnections.clear();
|
||||
}
|
||||
|
||||
void Assembly::AddObject(Object *obj) {
|
||||
if (auto *at = dynamic_cast<AffineTransform *>(obj)) {
|
||||
at->SetParent(this);
|
||||
}
|
||||
ObjectsContext::AddObject(obj);
|
||||
|
||||
// Connect to child updates to recompute AABB
|
||||
m_ChildConnections[obj] = Object::connect(obj, &Object::Updated, [this](){
|
||||
this->ComputeBoundingBox();
|
||||
this->Updated(); // Signal that assembly itself changed (AABB-wise)
|
||||
});
|
||||
this->ComputeBoundingBox();
|
||||
}
|
||||
|
||||
void Assembly::RemoveObject(Object *obj) {
|
||||
@@ -49,7 +63,15 @@ void Assembly::RemoveObject(Object *obj) {
|
||||
if (at->GetParent() == this)
|
||||
at->SetParent(nullptr);
|
||||
}
|
||||
|
||||
auto itConn = m_ChildConnections.find(obj);
|
||||
if (itConn != m_ChildConnections.end()) {
|
||||
itConn->second.disconnect();
|
||||
m_ChildConnections.erase(itConn);
|
||||
}
|
||||
|
||||
ObjectsContext::RemoveObject(obj);
|
||||
this->ComputeBoundingBox();
|
||||
}
|
||||
|
||||
void Assembly::ComputeBoundingBox() {
|
||||
@@ -64,12 +86,11 @@ void Assembly::ComputeBoundingBox() {
|
||||
m_BBoxMin = Vector3f(inf, inf, inf);
|
||||
m_BBoxMax = Vector3f(-inf, -inf, -inf);
|
||||
|
||||
Matrix4f invAsm = this->GetWorldMatrix().inverse();
|
||||
|
||||
for (Object *obj : objects) {
|
||||
if (auto *box = dynamic_cast<ContainerBox *>(obj)) {
|
||||
// ContainerBox: wm is matrix from unit cube [0,1] to assembly base
|
||||
Matrix4f m = invAsm * box->GetWorldMatrix();
|
||||
// ContainerBox: wm is matrix from unit cube [0,1] to local space
|
||||
// Since it is parented to 'this', GetMatrix() is sufficient.
|
||||
Matrix4f m = box->GetMatrix();
|
||||
for (int i = 0; i < 8; ++i) {
|
||||
float x = (i & 1) ? 1.0f : 0.0f;
|
||||
float y = (i & 2) ? 1.0f : 0.0f;
|
||||
@@ -82,7 +103,7 @@ void Assembly::ComputeBoundingBox() {
|
||||
}
|
||||
} else if (auto *cyl = dynamic_cast<Cylinder *>(obj)) {
|
||||
// Cylinder: centered [-1, 1] radial, [-0.5, 0.5] height
|
||||
Matrix4f m = invAsm * cyl->GetWorldMatrix();
|
||||
Matrix4f m = cyl->GetMatrix();
|
||||
for (int i = 0; i < 8; ++i) {
|
||||
float x = (i & 1) ? 1.0f : -1.0f;
|
||||
float y = (i & 2) ? 0.5f : -0.5f;
|
||||
@@ -98,7 +119,7 @@ void Assembly::ComputeBoundingBox() {
|
||||
subAsm->ComputeBoundingBox();
|
||||
Vector3f subMin, subMax;
|
||||
subAsm->GetBoundingBox(subMin, subMax);
|
||||
Matrix4f m = invAsm * subAsm->GetWorldMatrix();
|
||||
Matrix4f m = subAsm->GetMatrix();
|
||||
for (int i = 0; i < 8; ++i) {
|
||||
float x = (i & 1) ? subMax(0) : subMin(0);
|
||||
float y = (i & 2) ? subMax(1) : subMin(1);
|
||||
|
||||
Reference in New Issue
Block a user