Beispiel #1
0
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();
}
Beispiel #2
0
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()));
}
Beispiel #3
0
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;
}