mirror of
https://github.com/overte-org/overte.git
synced 2025-08-10 11:42:55 +02:00
expose a way to set translation and rotation of all model joints at once
This commit is contained in:
parent
2147b0d78e
commit
7f2e0cd103
6 changed files with 46 additions and 10 deletions
|
@ -709,11 +709,12 @@ glm::vec3 RenderableModelEntityItem::getAbsoluteJointTranslationInObjectFrame(in
|
||||||
return glm::vec3(0.0f);
|
return glm::vec3(0.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RenderableModelEntityItem::setAbsoluteJointRotationInObjectFrame(int index, glm::quat& rotation) {
|
bool RenderableModelEntityItem::setAbsoluteJointRotationInObjectFrame(int index, const glm::quat& rotation) {
|
||||||
bool result = false;
|
bool result = false;
|
||||||
_jointDataLock.withWriteLock([&] {
|
_jointDataLock.withWriteLock([&] {
|
||||||
resizeJointArrays();
|
resizeJointArrays();
|
||||||
if (index >= 0 && index < _absoluteJointRotationsInObjectFrame.size()) {
|
if (index >= 0 && index < _absoluteJointRotationsInObjectFrame.size() &&
|
||||||
|
_absoluteJointRotationsInObjectFrame[index] != rotation) {
|
||||||
_absoluteJointRotationsInObjectFrame[index] = rotation;
|
_absoluteJointRotationsInObjectFrame[index] = rotation;
|
||||||
_absoluteJointRotationsInObjectFrameSet[index] = true;
|
_absoluteJointRotationsInObjectFrameSet[index] = true;
|
||||||
_absoluteJointRotationsInObjectFrameDirty[index] = true;
|
_absoluteJointRotationsInObjectFrameDirty[index] = true;
|
||||||
|
@ -723,11 +724,12 @@ bool RenderableModelEntityItem::setAbsoluteJointRotationInObjectFrame(int index,
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RenderableModelEntityItem::setAbsoluteJointTranslationInObjectFrame(int index, glm::vec3& translation) {
|
bool RenderableModelEntityItem::setAbsoluteJointTranslationInObjectFrame(int index, const glm::vec3& translation) {
|
||||||
bool result = false;
|
bool result = false;
|
||||||
_jointDataLock.withWriteLock([&] {
|
_jointDataLock.withWriteLock([&] {
|
||||||
resizeJointArrays();
|
resizeJointArrays();
|
||||||
if (index >= 0 && index < _absoluteJointTranslationsInObjectFrame.size()) {
|
if (index >= 0 && index < _absoluteJointTranslationsInObjectFrame.size() &&
|
||||||
|
_absoluteJointTranslationsInObjectFrame[index] != translation) {
|
||||||
_absoluteJointTranslationsInObjectFrame[index] = translation;
|
_absoluteJointTranslationsInObjectFrame[index] = translation;
|
||||||
_absoluteJointTranslationsInObjectFrameSet[index] = true;
|
_absoluteJointTranslationsInObjectFrameSet[index] = true;
|
||||||
_absoluteJointTranslationsInObjectFrameDirty[index] = true;
|
_absoluteJointTranslationsInObjectFrameDirty[index] = true;
|
||||||
|
|
|
@ -71,8 +71,8 @@ public:
|
||||||
// these are in the frame of this object (model space)
|
// these are in the frame of this object (model space)
|
||||||
virtual glm::quat getAbsoluteJointRotationInObjectFrame(int index) const override;
|
virtual glm::quat getAbsoluteJointRotationInObjectFrame(int index) const override;
|
||||||
virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const override;
|
virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const override;
|
||||||
virtual bool setAbsoluteJointRotationInObjectFrame(int index, glm::quat& rotation) override;
|
virtual bool setAbsoluteJointRotationInObjectFrame(int index, const glm::quat& rotation) override;
|
||||||
virtual bool setAbsoluteJointTranslationInObjectFrame(int index, glm::vec3& translation) override;
|
virtual bool setAbsoluteJointTranslationInObjectFrame(int index, const glm::vec3& translation) override;
|
||||||
|
|
||||||
virtual void loader() override;
|
virtual void loader() override;
|
||||||
virtual void locationChanged() override;
|
virtual void locationChanged() override;
|
||||||
|
|
|
@ -381,8 +381,8 @@ public:
|
||||||
// these are in the frame of this object
|
// these are in the frame of this object
|
||||||
virtual glm::quat getAbsoluteJointRotationInObjectFrame(int index) const override { return glm::quat(); }
|
virtual glm::quat getAbsoluteJointRotationInObjectFrame(int index) const override { return glm::quat(); }
|
||||||
virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const override { return glm::vec3(0.0f); }
|
virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const override { return glm::vec3(0.0f); }
|
||||||
virtual bool setAbsoluteJointRotationInObjectFrame(int index, glm::quat& rotation) override { return false; }
|
virtual bool setAbsoluteJointRotationInObjectFrame(int index, const glm::quat& rotation) override { return false; }
|
||||||
virtual bool setAbsoluteJointTranslationInObjectFrame(int index, glm::vec3& translation) override { return false; }
|
virtual bool setAbsoluteJointTranslationInObjectFrame(int index, const glm::vec3& translation) override { return false; }
|
||||||
|
|
||||||
virtual void loader() {} // called indirectly when urls for geometry are updated
|
virtual void loader() {} // called indirectly when urls for geometry are updated
|
||||||
|
|
||||||
|
|
|
@ -872,3 +872,34 @@ bool EntityScriptingInterface::setAbsoluteJointRotationInObjectFrame(const QUuid
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool EntityScriptingInterface::setAbsoluteJointsDataInObjectFrame(const QUuid& entityID,
|
||||||
|
const QVector<glm::quat>& rotations,
|
||||||
|
const QVector<glm::vec3>& translations) {
|
||||||
|
if (auto entity = checkForTreeEntityAndTypeMatch(entityID, EntityTypes::Model)) {
|
||||||
|
auto now = usecTimestampNow();
|
||||||
|
auto modelEntity = std::dynamic_pointer_cast<ModelEntityItem>(entity);
|
||||||
|
|
||||||
|
int count = glm::max(rotations.size(), translations.size());
|
||||||
|
bool result = false;
|
||||||
|
for (int index = 0; index < count; index++) {
|
||||||
|
result |= modelEntity->setAbsoluteJointRotationInObjectFrame(index, rotations[index]);
|
||||||
|
result |= modelEntity->setAbsoluteJointTranslationInObjectFrame(index, translations[index]);
|
||||||
|
}
|
||||||
|
if (result) {
|
||||||
|
EntityItemProperties properties;
|
||||||
|
_entityTree->withWriteLock([&] {
|
||||||
|
properties = entity->getProperties();
|
||||||
|
entity->setLastBroadcast(now);
|
||||||
|
});
|
||||||
|
|
||||||
|
properties.setJointRotationsDirty();
|
||||||
|
properties.setJointTranslationsDirty();
|
||||||
|
properties.setLastEdited(now);
|
||||||
|
queueEntityMessage(PacketType::EntityEdit, entityID, properties);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
@ -153,6 +153,9 @@ public slots:
|
||||||
Q_INVOKABLE glm::quat getAbsoluteJointRotationInObjectFrame(const QUuid& entityID, int jointIndex);
|
Q_INVOKABLE glm::quat getAbsoluteJointRotationInObjectFrame(const QUuid& entityID, int jointIndex);
|
||||||
Q_INVOKABLE bool setAbsoluteJointTranslationInObjectFrame(const QUuid& entityID, int jointIndex, glm::vec3 translation);
|
Q_INVOKABLE bool setAbsoluteJointTranslationInObjectFrame(const QUuid& entityID, int jointIndex, glm::vec3 translation);
|
||||||
Q_INVOKABLE bool setAbsoluteJointRotationInObjectFrame(const QUuid& entityID, int jointIndex, glm::quat rotation);
|
Q_INVOKABLE bool setAbsoluteJointRotationInObjectFrame(const QUuid& entityID, int jointIndex, glm::quat rotation);
|
||||||
|
Q_INVOKABLE bool setAbsoluteJointsDataInObjectFrame(const QUuid& entityID,
|
||||||
|
const QVector<glm::quat>& rotations,
|
||||||
|
const QVector<glm::vec3>& translations);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void collisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision);
|
void collisionWithEntity(const EntityItemID& idA, const EntityItemID& idB, const Collision& collision);
|
||||||
|
|
|
@ -91,8 +91,8 @@ public:
|
||||||
virtual const Transform getAbsoluteJointTransformInObjectFrame(int jointIndex) const;
|
virtual const Transform getAbsoluteJointTransformInObjectFrame(int jointIndex) const;
|
||||||
virtual glm::quat getAbsoluteJointRotationInObjectFrame(int index) const { assert(false); return glm::quat(); }
|
virtual glm::quat getAbsoluteJointRotationInObjectFrame(int index) const { assert(false); return glm::quat(); }
|
||||||
virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const { assert(false); return glm::vec3(); }
|
virtual glm::vec3 getAbsoluteJointTranslationInObjectFrame(int index) const { assert(false); return glm::vec3(); }
|
||||||
virtual bool setAbsoluteJointRotationInObjectFrame(int index, glm::quat& rotation) { assert(false); return false; }
|
virtual bool setAbsoluteJointRotationInObjectFrame(int index, const glm::quat& rotation) { assert(false); return false; }
|
||||||
virtual bool setAbsoluteJointTranslationInObjectFrame(int index, glm::vec3& translation) { assert(false); return false; }
|
virtual bool setAbsoluteJointTranslationInObjectFrame(int index, const glm::vec3& translation) { assert(false); return false; }
|
||||||
|
|
||||||
SpatiallyNestablePointer getThisPointer() const;
|
SpatiallyNestablePointer getThisPointer() const;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue