Example #1
0
void Transform::invalidate(bool rotationUpdated) {
    if (model_matrix_.isValid()) {
        model_matrix_.invalidate();
        std::vector<SceneObject*> childrenCopy = owner_object()->children();
        for (auto it = childrenCopy.begin(); it != childrenCopy.end(); ++it) {
            Transform* const t = (*it)->transform();
            if (nullptr != t) {
                t->invalidate(false);
            }
        }
    }
    if (rotationUpdated) {
        // scale rotation_ if needed to avoid overflow
        static const float threshold = sqrt(FLT_MAX) / 2.0f;
        static const float scale_factor = 0.5f / sqrt(FLT_MAX);
        if (rotation_.w > threshold || rotation_.x > threshold
                || rotation_.y > threshold || rotation_.z > threshold) {
            rotation_.w *= scale_factor;
            rotation_.x *= scale_factor;
            rotation_.y *= scale_factor;
            rotation_.z *= scale_factor;
        }
    }

    if(owner_object()) {
        owner_object()->dirtyHierarchicalBoundingVolume();
    }
}
    void BulletGeneric6dofConstraint::updateConstructionInfo() {
        if (mGeneric6DofConstraint != 0) {
            delete (mGeneric6DofConstraint);
        }

        btRigidBody *rbA = ((BulletRigidBody*)owner_object()->
                getComponent(COMPONENT_TYPE_PHYSICS_RIGID_BODY))->getRigidBody();

        btVector3 p(mPosition.x, mPosition.y, mPosition.z);
        btMatrix3x3 m(mRotationA.vec[0], mRotationA.vec[1], mRotationA.vec[2], mRotationA.vec[3],
                      mRotationA.vec[4], mRotationA.vec[5], mRotationA.vec[6], mRotationA.vec[7],
                      mRotationA.vec[8]);
        btTransform fA(m, p);

        p = rbA->getWorldTransform().getOrigin() + p;
        p -= mRigidBodyB->getRigidBody()->getWorldTransform().getOrigin();
        m.setValue(mRotationB.vec[0], mRotationB.vec[1], mRotationB.vec[2], mRotationB.vec[3],
                   mRotationB.vec[4], mRotationB.vec[5], mRotationB.vec[6], mRotationB.vec[7],
                   mRotationB.vec[8]);
        btTransform fB(m, p);

        mGeneric6DofConstraint =
                new btGeneric6DofConstraint(*rbA, *mRigidBodyB->getRigidBody(), fA, fB, false);

        mGeneric6DofConstraint->setLinearLowerLimit(Common2Bullet(mLinearLowerLimits));
        mGeneric6DofConstraint->setLinearUpperLimit(Common2Bullet(mLinearUpperLimits));
        mGeneric6DofConstraint->setAngularLowerLimit(Common2Bullet(mAngularLowerLimits));
        mGeneric6DofConstraint->setAngularUpperLimit(Common2Bullet(mAngularUpperLimits));
        mGeneric6DofConstraint->setBreakingImpulseThreshold(mBreakingImpulse);
    }
Example #3
0
ColliderData ColliderGroup::isHit(const glm::vec3& rayStart, const glm::vec3& rayDir)
{
    ColliderData finalHit(reinterpret_cast<Collider *>(this));
    SceneObject *ownerObject = owner_object();

    hit_ = glm::vec3(std::numeric_limits<float>::infinity());
    if (nullptr != ownerObject)
    {
        Transform *transform = ownerObject->transform();
        finalHit.ObjectHit = ownerObject;
        if (nullptr != transform)
        {
            glm::mat4 model_inverse = glm::affineInverse(transform->getModelMatrix());
            glm::vec3 O(rayStart);
            glm::vec3 D(rayDir);

            transformRay(model_inverse, O, D);
            for (auto it = colliders_.begin(); it != colliders_.end(); ++it)
            {
                ColliderData currentHit = (*it)->isHit(O, D);
                if (currentHit.IsHit && (currentHit.Distance < finalHit.Distance))
                {
                    hit_ = currentHit.HitPosition;
                    finalHit.CopyHit(currentHit);
                }
            }
        }
    }
    return finalHit;
}
Example #4
0
glm::vec3 CameraRig::getLookAt() const {
    glm::mat4 model_matrix = owner_object()->transform()->getModelMatrix();
    float x0 = model_matrix[3][0];
    float y0 = model_matrix[3][1];
    float z0 = model_matrix[3][2];
    float reciprocalW0 = 1 / model_matrix[3][3];
    x0 *= reciprocalW0;
    y0 *= reciprocalW0;
    z0 *= reciprocalW0;

    float x1 = model_matrix[2][0] * -1.0f + model_matrix[3][0];
    float y1 = model_matrix[2][1] * -1.0f + model_matrix[3][1];
    float z1 = model_matrix[2][2] * -1.0f + model_matrix[3][2];
    float reciprocalW1 = 1.0f
            / (model_matrix[2][3] * -1.0f + model_matrix[3][3]);
    x1 *= reciprocalW1;
    y1 *= reciprocalW1;
    z1 *= reciprocalW1;

    float lookAtX = x1 - x0;
    float lookAtY = y1 - y0;
    float lookAtZ = z1 - z0;
    float reciprocalLength = 1.0f
            / sqrtf(lookAtX * lookAtX + lookAtY * lookAtY + lookAtZ * lookAtZ);
    lookAtX *= reciprocalLength;
    lookAtY *= reciprocalLength;
    lookAtZ *= reciprocalLength;

    return glm::vec3(lookAtX, lookAtY, lookAtZ);
}
Example #5
0
void Transform::invalidate() {
    if (model_matrix_.isValid()) {
        model_matrix_.invalidate();
        std::vector<SceneObject*> children(owner_object()->children());
        for (auto it = children.begin(); it != children.end(); ++it) {
            (*it)->transform()->invalidate();
        }
    }
}
Example #6
0
glm::mat4 Transform::getModelMatrix() {
    if (!model_matrix_.isValid()) {
        glm::mat4 translation_matrix = glm::translate(glm::mat4(), position_);
        glm::mat4 rotation_matrix = glm::mat4_cast(rotation_);
        glm::mat4 scale_matrix = glm::scale(glm::mat4(), scale_);
        glm::mat4 trs_matrix = translation_matrix * rotation_matrix
                * scale_matrix;

        if (owner_object()->parent() != 0) {
            glm::mat4 model_matrix =
                    owner_object()->parent()->transform()->getModelMatrix()
                            * trs_matrix;
            model_matrix_.validate(model_matrix);
        } else {
            model_matrix_.validate(trs_matrix);
        }
    }

    return model_matrix_.element();
}
Example #7
0
void SceneObject::attachCameraRig(SceneObject* self, CameraRig* camera_rig) {
    if (camera_rig_) {
        detachCameraRig();
    }
    SceneObject* owner_object(camera_rig->owner_object());
    if (owner_object) {
        owner_object->detachCameraRig();
    }
    camera_rig_ = camera_rig;
    camera_rig_->set_owner_object(self);
}
Example #8
0
void SceneObject::attachCamera(SceneObject* self, Camera* camera) {
    if (camera_) {
        detachCamera();
    }
    SceneObject* owner_object(camera->owner_object());
    if (owner_object) {
        owner_object->detachCamera();
    }
    camera_ = camera;
    camera_->set_owner_object(self);
}
Example #9
0
void SceneObject::attachTransform(SceneObject* self, Transform* transform) {
    if (transform_) {
        detachTransform();
    }
    SceneObject* owner_object(transform->owner_object());
    if (owner_object) {
        owner_object->detachRenderData();
    }
    transform_ = transform;
    transform_->set_owner_object(self);
    dirtyBoundingVolume();
}
Example #10
0
void SceneObject::attachRenderData(SceneObject* self, RenderData* render_data) {
    if (render_data_) {
        detachRenderData();
    }
    SceneObject* owner_object(render_data->owner_object());
    if (owner_object) {
        owner_object->detachRenderData();
    }
    render_data_ = render_data;
    render_data->set_owner_object(self);
    dirtyBoundingVolume();
}
Example #11
0
void SceneObject::attachCameraRig(const std::shared_ptr<SceneObject>& self,
        const std::shared_ptr<CameraRig>& camera_rig) {
    if (camera_rig_) {
        detachCameraRig();
    }
    std::shared_ptr<SceneObject> owner_object(camera_rig->owner_object());
    if (owner_object) {
        owner_object->detachCameraRig();
    }
    camera_rig_ = camera_rig;
    camera_rig_->set_owner_object(self);
}
Example #12
0
void SceneObject::attachCamera(const std::shared_ptr<SceneObject>& self,
        const std::shared_ptr<Camera>& camera) {
    if (camera_) {
        detachCamera();
    }
    std::shared_ptr<SceneObject> owner_object(camera->owner_object());
    if (owner_object) {
        owner_object->detachCamera();
    }
    camera_ = camera;
    camera_->set_owner_object(self);
}
Example #13
0
void SceneObject::attachRenderData(const std::shared_ptr<SceneObject>& self,
        const std::shared_ptr<RenderData>& render_data) {
    if (render_data_) {
        detachRenderData();
    }
    std::shared_ptr<SceneObject> owner_object(render_data->owner_object());
    if (owner_object) {
        owner_object->detachRenderData();
    }
    render_data_ = render_data;
    render_data->set_owner_object(self);
}
Example #14
0
void SceneObject::attachTransform(const std::shared_ptr<SceneObject>& self,
        const std::shared_ptr<Transform>& transform) {
    if (transform_) {
        detachTransform();
    }
    std::shared_ptr<SceneObject> owner_object(transform->owner_object());
    if (owner_object) {
        owner_object->detachRenderData();
    }
    transform_ = transform;
    transform_->set_owner_object(self);
}
Example #15
0
EyePointData EyePointeeHolder::isPointed(const glm::mat4& view_matrix, float ox,
        float oy, float oz, float dx, float dy, float dz) {
    glm::mat4 mv_matrix = view_matrix
            * owner_object()->transform()->getModelMatrix();
    EyePointData holder_data;
    for (auto it = pointees_.begin(); it != pointees_.end(); ++it) {
        EyePointData data = (*it)->isPointed(mv_matrix, ox, oy, oz, dx, dy, dz);
        if (data.distance() < holder_data.distance()) {
            holder_data = data;
        }
    }
    return holder_data;
}
Example #16
0
void SceneObject::attachEyePointeeHolder(
        SceneObject* self,
        EyePointeeHolder* eye_pointee_holder) {
    if (eye_pointee_holder_) {
        detachEyePointeeHolder();
    }
    SceneObject* owner_object(eye_pointee_holder->owner_object());
    if (owner_object) {
        owner_object->detachEyePointeeHolder();
    }
    eye_pointee_holder_ = eye_pointee_holder;
    eye_pointee_holder_->set_owner_object(self);
}
Example #17
0
void CameraRig::predict(float time) {
    long long clock_time = getCurrentTime();
    float time_diff = (clock_time - rotation_sensor_data_.time_stamp())
            / 1000000000.0f;

    glm::vec3 axis = rotation_sensor_data_.gyro();
    float angle = glm::length(axis);

    if (angle != 0.0f) {
        axis /= angle;
    }
    angle *= (time + time_diff) * 180.0f / M_PI;

    glm::quat rotation = rotation_sensor_data_.quaternion()
            * glm::angleAxis(angle, axis);

    glm::quat transfrom_rotation = complementary_rotation_ * rotation;

    if (camera_rig_type_ == FREE) {
        owner_object()->transform()->set_rotation(transfrom_rotation);
    } else if (camera_rig_type_ == YAW_ONLY) {
        glm::vec3 look_at = glm::rotate(transfrom_rotation,
                glm::vec3(0.0f, 0.0f, -1.0f));
        float yaw = atan2f(-look_at.x, -look_at.z) * 180.0f / M_PI;
        owner_object()->transform()->set_rotation(
                glm::angleAxis(yaw, glm::vec3(0.0f, 1.0f, 0.0f)));
    } else if (camera_rig_type_ == ROLL_FREEZE) {
        glm::vec3 look_at = glm::rotate(transfrom_rotation,
                glm::vec3(0.0f, 0.0f, -1.0f));
        float pitch = atan2f(look_at.y,
                sqrtf(look_at.x * look_at.x + look_at.z * look_at.z)) * 180.0f
                / M_PI;
        float yaw = atan2f(-look_at.x, -look_at.z) * 180.0f / M_PI;
        owner_object()->transform()->set_rotation(
                glm::angleAxis(pitch, glm::vec3(1.0f, 0.0f, 0.0f)));
        owner_object()->transform()->rotateByAxis(yaw, 0.0f, 1.0f, 0.0f);
    } else if (camera_rig_type_ == FREEZE) {
        owner_object()->transform()->set_rotation(glm::quat());
    } else if (camera_rig_type_ == ORBIT_PIVOT) {
        glm::vec3 pivot(getVec3("pivot"));
        owner_object()->transform()->set_position(pivot.x, pivot.y,
                pivot.z + getFloat("distance"));
        owner_object()->transform()->set_rotation(glm::quat());
        owner_object()->transform()->rotateWithPivot(transfrom_rotation.w,
                transfrom_rotation.x, transfrom_rotation.y,
                transfrom_rotation.z, pivot.x, pivot.y, pivot.z);
    }
}
Example #18
0
void  BulletRigidBody::updateColisionShapeLocalScaling() {
    btVector3 ownerScale;
    SceneObject* owner = owner_object();
    if (owner) {
        Transform* trans = owner->transform();
        ownerScale.setValue(trans->scale_x(),
                            trans->scale_y(),
                            trans->scale_z());
    } else {
        ownerScale.setValue(1.0f, 1.0f, 1.0f);
    }

    mRigidBody->getCollisionShape()->setLocalScaling(mScale * ownerScale);
}
Example #19
0
void SceneObject::attachEyePointeeHolder(
        const std::shared_ptr<SceneObject>& self,
        const std::shared_ptr<EyePointeeHolder>& eye_pointee_holder) {
    if (eye_pointee_holder_) {
        detachEyePointeeHolder();
    }
    std::shared_ptr<SceneObject> owner_object(
            eye_pointee_holder->owner_object());
    if (owner_object) {
        owner_object->detachEyePointeeHolder();
    }
    eye_pointee_holder_ = eye_pointee_holder;
    eye_pointee_holder_->set_owner_object(self);
}
Example #20
0
void BulletRigidBody::setWorldTransform(const btTransform &centerOfMassWorldTrans) {
    Transform* trans = owner_object()->transform();
    btTransform aux; getWorldTransform(aux);

    if(std::abs(aux.getOrigin().getX() - prevPos.getOrigin().getX()) >= 0.1f ||
       std::abs(aux.getOrigin().getY() - prevPos.getOrigin().getY()) >= 0.1f ||
       std::abs(aux.getOrigin().getZ() - prevPos.getOrigin().getZ()) >= 0.1f)
    {
        mRigidBody->setWorldTransform(aux);
        prevPos = aux;
        //TODO: incomplete solution
    }
    else
    {
        btTransform physicBody = (centerOfMassWorldTrans  * m_centerOfMassOffset);
        convertBtTransform2Transform(physicBody, trans);
        prevPos = physicBody;
    }
    //convertBtTransform2Transform(centerOfMassWorldTrans * m_centerOfMassOffset, trans);
}
Example #21
0
    void GLRenderData::render(Shader* shader, Renderer* renderer)
    {
        GLShader*   glshader = static_cast<GLShader*>(shader);
        int         programId = glshader->getProgramId();
        int         indexCount = mesh_->getIndexCount();
        int         vertexCount = mesh_->getVertexCount();
        int         mode = draw_mode();

#ifdef DEBUG_SHADER
        LOGV("SHADER: RenderData::render binding vertex arrays to program %d %p %d vertices, %d indices",
                                     programId, this, vertexCount, indexCount);
#endif
        if (shader->hasBones())
        {
            Skin* skin = (Skin*) owner_object()->getComponent(Skin::getComponentType());

            if (skin)
            {
                skin->bindBuffer(renderer, shader);
            }
        }
        mesh_->getVertexBuffer()->bindToShader(shader, mesh_->getIndexBuffer());
        checkGLError("renderMesh::mesh_->getVertexBuffer()->bindToShader(");
        switch (mesh_->getIndexSize())
        {
            case 2:
            glDrawElements(mode, indexCount, GL_UNSIGNED_SHORT, 0);
            break;

            case 4:
            glDrawElements(mode, indexCount, GL_UNSIGNED_INT, 0);
            break;

            default:
            glDrawArrays(mode, 0, vertexCount);
            break;
        }
        checkGLError(" RenderData::render after draw");
        glBindVertexArray(0);
    }
Example #22
0
Transform* CameraRig::getHeadTransform() const {
	return owner_object()->getChildByIndex(0)->transform();
}
Example #23
0
void BulletRigidBody::getWorldTransform(btTransform &centerOfMassWorldTrans) const {
    Transform* trans = owner_object()->transform();

    centerOfMassWorldTrans = convertTransform2btTransform(trans)
                             * m_centerOfMassOffset.inverse();
}