void gkBlenderSceneConverter::convertObjectGeneral(gkGameObject* gobj, Blender::Object* bobj) { gkQuaternion quat; gkVector3 loc, scale; gkMatrix4 obmat = gkMathUtils::getFromFloat(bobj->obmat); gkMathUtils::extractTransform(obmat, loc, quat, scale); // prevent zero scale gkVector3 scaleTest = gkVector3(bobj->size[0], bobj->size[1], bobj->size[2]); if (scaleTest.isZeroLength()) scale = gkVector3(1.f, 1.f, 1.f); gkGameObjectProperties& props = gobj->getProperties(); if (bobj->parent && validObject(bobj->parent)) { props.m_parent = GKB_IDNAME(bobj->parent); if ( bobj->parent->type==OB_ARMATURE){ gkString parentBoneName(bobj->parsubstr); if (!parentBoneName.empty()){ props.m_boneParent = parentBoneName; } } } props.m_transform = gkTransformState(loc, quat, scale); if (bobj->restrictflag & OB_RESTRICT_RENDER) props.m_mode |= GK_INVISIBLE; gobj->setActiveLayer((m_bscene->lay & bobj->lay) != 0); gobj->setLayer((UTuint32)bobj->lay); }
void gkLogic::createVehicle() { m_vehicle = new gkBuggy(m_scene); m_vehicle->load(); m_vehicle->createVehicle(); // Move to start line m_vehicle->setTransform(gkTransformState(gkVector3(-66.5, 295, -8.5), gkEuler(0, 0, 180).toQuaternion())); float steerTime = 0.15f; //simple node setup for logic m_vehicleNode = m_tree->createNode<gkVehicleNode>(); m_vehicleNode->setVehicle(m_vehicle); m_vehicleNode->getFRONT()->link(m_upKeyNode->getIS_DOWN()); m_vehicleNode->getREAR()->link(m_downKeyNode->getIS_DOWN()); m_vehicleNode->getLEFT()->link(m_leftKeyNode->getIS_DOWN()); m_vehicleNode->getRIGHT()->link(m_rightKeyNode->getIS_DOWN()); m_vehicleNode->getSTEER_TIME()->setValue(steerTime); m_vehicleNode->getHAND_BRAKE()->link(m_spaceKeyNode->getIS_DOWN()); m_vehicleNode->getGEAR_UP()->link(m_dKeyNode->getIS_DOWN()); m_vehicleNode->getGEAR_DOWN()->link(m_cKeyNode->getIS_DOWN()); }
void gkBone::applyRootTransform(const gkTransformState& root) { gkMatrix4 bonemat = m_bind.toMatrix(); gkMatrix4 objmat = root.toMatrix(); bonemat = objmat * bonemat; m_bind = gkTransformState(bonemat); }
void gkGameObjectInstance::cloneObjects(gkScene* scene, const gkTransformState& from, int time, const gkVector3& linearVelocity, bool tsLinLocal, const gkVector3& angularVelocity, bool tsAngLocal) { if (!isInstanced()) return; GK_ASSERT(scene); const gkMatrix4 plocal = from.toMatrix(); Objects::Iterator iter = m_objects.iterator(); while (iter.hasMoreElements()) { gkGameObject* oobj = iter.getNext().second; gkGameObject* nobj = scene->cloneObject(oobj, time); // be sure this info was not cloned! GK_ASSERT(!nobj->isGroupInstance()); // Update transform relative to owner gkGameObjectProperties& props = nobj->getProperties(); gkMatrix4 clocal; props.m_transform.toMatrix(clocal); // merge back to transform state props.m_transform = gkTransformState(plocal * clocal); nobj->createInstance(); if (props.isRigidOrDynamic() || props.isGhost()) { if (!linearVelocity.isZeroLength()) nobj->setLinearVelocity(linearVelocity, tsLinLocal ? TRANSFORM_LOCAL : TRANSFORM_PARENT); } if (props.isRigid()) { if (!angularVelocity.isZeroLength()) nobj->setAngularVelocity(angularVelocity, tsAngLocal ? TRANSFORM_LOCAL : TRANSFORM_PARENT); } } }
void gkSkeletonConverter::buildBoneTree(Blender::Bone* cur, Blender::Bone* prev, gkBone* parent) { // This is the normal resposition GK_ASSERT(cur); GK_ASSERT(m_skeleton); gkMatrix4 parBind = gkMatrix4::IDENTITY; if (prev != 0 && parent != 0) parBind = gkMathUtils::getFromFloatNorm(prev->arm_mat).inverse(); // create the ogre bone gkBone* bone = m_skeleton->createBone(cur->name); if (parent) bone->setParent(parent); gkMatrix4 bind = parBind * gkMathUtils::getFromFloatNorm(cur->arm_mat); gkQuaternion rot; gkVector3 loc, scl; gkMathUtils::extractTransformFast(bind, loc, rot, scl); if (rot.isNaN()) { rot = gkQuaternion(); scl = gkVector3(1, 1, 1); } bone->setRestPosition(gkTransformState(loc, rot, scl)); Blender::Bone* chi = static_cast<Blender::Bone*>(cur->childbase.first); while (chi) { // recurse buildBoneTree(chi, cur, bone); chi = chi->next; } }