Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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());
}
Exemplo n.º 3
0
void gkBone::applyRootTransform(const gkTransformState& root)
{
	gkMatrix4 bonemat = m_bind.toMatrix();
	gkMatrix4 objmat = root.toMatrix();

	bonemat = objmat * bonemat;

	m_bind = gkTransformState(bonemat);
}
Exemplo n.º 4
0
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);
		}
	}

}
Exemplo n.º 5
0
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;
	}
}