コード例 #1
0
void QQmlVMEMetaObject::writeProperty(int id, const QVariant &value)
{
    if (id >= firstVarPropertyIndex) {
        if (!ensureVarPropertiesAllocated())
            return;

        QV4::Scope scope(varProperties.engine());

        // Importantly, if the current value is a scarce resource, we need to ensure that it
        // gets automatically released by the engine if no other references to it exist.
        QV4::ScopedObject vp(scope, varProperties.value());
        QV4::Scoped<QV4::VariantObject> oldv(scope, vp->getIndexed(id - firstVarPropertyIndex));
        if (!!oldv)
            oldv->removeVmePropertyReference();

        // And, if the new value is a scarce resource, we need to ensure that it does not get
        // automatically released by the engine until no other references to it exist.
        QV4::ScopedValue newv(scope, QQmlEnginePrivate::get(ctxt->engine)->v8engine()->fromVariant(value));
        QV4::Scoped<QV4::VariantObject> v(scope, newv);
        if (!!v)
            v->addVmePropertyReference();

        // Write the value and emit change signal as appropriate.
        QVariant currentValue = readPropertyAsVariant(id);
        vp->putIndexed(id - firstVarPropertyIndex, newv);
        if ((currentValue.userType() != value.userType() || currentValue != value))
            activate(object, methodOffset() + id, 0);
    } else {
        bool needActivate = false;
        if (value.userType() == QMetaType::QObjectStar) {
            QObject *o = *(QObject **)value.data();
            needActivate = (data[id].dataType() != QMetaType::QObjectStar || data[id].asQObject() != o);
            data[id].setValue(o, this, id);
        } else {
            needActivate = (data[id].dataType() != qMetaTypeId<QVariant>() ||
                            data[id].asQVariant().userType() != value.userType() ||
                            data[id].asQVariant() != value);
            data[id].setValue(value);
        }

        if (needActivate)
            activate(object, methodOffset() + id, 0);
    }
}
コード例 #2
0
void QQmlVMEMetaObject::writeVarProperty(int id, const QV4::ValueRef value)
{
    Q_ASSERT(id >= firstVarPropertyIndex);
    if (!ensureVarPropertiesAllocated())
        return;

    QV4::Scope scope(varProperties.engine());
    // Importantly, if the current value is a scarce resource, we need to ensure that it
    // gets automatically released by the engine if no other references to it exist.
    QV4::ScopedObject vp(scope, varProperties.value());
    QV4::Scoped<QV4::VariantObject> oldv(scope, vp->getIndexed(id - firstVarPropertyIndex));
    if (!!oldv)
        oldv->removeVmePropertyReference();

    QObject *valueObject = 0;
    QQmlVMEVariantQObjectPtr *guard = getQObjectGuardForProperty(id);

    QV4::ScopedObject o(scope, value);
    if (o) {
        // And, if the new value is a scarce resource, we need to ensure that it does not get
        // automatically released by the engine until no other references to it exist.
        if (QV4::VariantObject *v = o->as<QV4::VariantObject>()) {
            v->addVmePropertyReference();
        } else if (QV4::QObjectWrapper *wrapper = o->as<QV4::QObjectWrapper>()) {
            // We need to track this QObject to signal its deletion
            valueObject = wrapper->object();

            // Do we already have a QObject guard for this property?
            if (valueObject && !guard) {
                guard = new QQmlVMEVariantQObjectPtr(true);
                varObjectGuards.append(guard);
            }
        }
    }

    if (guard) {
        guard->setGuardedValue(valueObject, this, id);
    }

    // Write the value and emit change signal as appropriate.
    vp->putIndexed(id - firstVarPropertyIndex, value);
    activate(object, methodOffset() + id, 0);
}
コード例 #3
0
//限制机器人加速度
void Simulator::AccelerationLimit(SimRobot &sr, double maxdv)
{
#if 0
    double a = sr.vel.v.angle() - sr.pos.dir;
    double vmag = sr.vel.v.length();

    MyVector2d oldv(vmag * cos(a), vmag * sin(a));
    MyVector2d dv = sr.vel.v - oldv;
    double dvmag = dv.length();

    if (dvmag > maxdv)
        sr.vel.v = oldv + dv * (maxdv / dvmag);
#else
    MyVector2d curv = sr.vel.v.rotate(-sr.pos.dir);
    MyVector2d dv = sr.vcmd.v - curv;

    if (dv.length() > maxdv)
    {
        sr.vcmd.v = curv + dv.norm() * maxdv;
    }
#endif
}