void Transforms::translate(const Vector3& d, tTransformSpace relativeTo) { Vector3 adjusted; switch(relativeTo) { case TS_LOCAL: // Position is relative to parent so transform downwards m_position += m_orientation * d; break; case TS_PARENT: m_position += d; break; case TS_WORLD: { // Position is relative to parent so transform upwards Transforms* pParent = getTransforms(); if (pParent) m_position += (pParent->getWorldOrientation().Inverse() * d) / pParent->getWorldScale(); else m_position += d; break; } } needUpdate(); }
Handle<Value> Transforms_GetWorldScale(Local<String> property, const AccessorInfo &info) { HandleScope handle_scope; Transforms* ptr = GetPtr(info.This()); assert(ptr); return handle_scope.Close(toJavaScript(ptr->getWorldScale())); }
void Transforms::update() { if (!m_bDirty) return; Transforms* pParent = getTransforms(); if (pParent) { // Update orientation const Quaternion& parentOrientation = pParent->getWorldOrientation(); if (m_bInheritOrientation) { // Combine orientation with that of parent m_fullOrientation = parentOrientation * m_orientation; m_fullOrientation.normalise(); } else { // No inheritence m_fullOrientation = m_orientation; } // Update scale const Vector3& parentScale = pParent->getWorldScale(); if (m_bInheritScale) { // Scale own position by parent scale, NB just combine // as equivalent axes, no shearing m_fullScale = parentScale * m_scale; } else { // No inheritence m_fullScale = m_scale; } // Change position vector based on parent's orientation & scale m_fullPosition = parentOrientation * (parentScale * m_position); // Add altered position vector to parents m_fullPosition += pParent->getWorldPosition(); } else { // No parent m_fullPosition = m_position; m_fullOrientation = m_orientation; m_fullScale = m_scale; } m_bDirty = false; }