Exemplo n.º 1
0
void CPHShell::Activate(bool disable, bool not_set_bone_callbacks /*= false*/)
{ 
	if(isActive())return;

	activate(disable);
	{		
		IKinematics* K = m_pKinematics;
		if(not_set_bone_callbacks)
				m_pKinematics = 0;
		ELEMENT_I i=elements.begin(),e=elements.end();
			 for(;i!=e;++i)(*i)->Activate(mXFORM,disable);
		m_pKinematics = K;
	}

	{
		JOINT_I i=joints.begin(),e=joints.end();
		for(;i!=e;++i) (*i)->Activate();
	}	
	
	if(PKinematics() && !not_set_bone_callbacks )
	{
		SetCallbacks( );
	}
	spatial_register();
	m_flags.set(flActivating,TRUE);
	m_flags.set(flActive,TRUE);

}
Exemplo n.º 2
0
void CPHShell::Activate(const Fmatrix &transform,const Fvector& lin_vel,const Fvector& ang_vel,bool disable){

	if(isActive())return;
	activate(disable);

	ELEMENT_I i;
	mXFORM.set(transform);
	for(i=elements.begin();elements.end() != i;++i){
		(*i)->Activate(transform,lin_vel, ang_vel);
	}
	
	{
		JOINT_I i=joints.begin(),e=joints.end();
		for(;i!=e;++i) (*i)->Activate();
	}	

	if(PKinematics())
	{
		SetCallbacks( );
	}
	spatial_register();
	//bActive=true;
	//bActivating=true;
	m_flags.set(flActivating,TRUE);
	m_flags.set(flActive,TRUE);
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
	//mXFORM.set(transform);
	//Activate(disable);
	//set_LinearVel(lin_vel);
	//set_AngularVel(ang_vel);

}
Exemplo n.º 3
0
BOOL	CCar::net_Spawn				(CSE_Abstract* DC)
{
#ifdef DEBUG
	InitDebug();
#endif
	CSE_Abstract					*e = (CSE_Abstract*)(DC);
	CSE_ALifeCar					*co=smart_cast<CSE_ALifeCar*>(e);
	BOOL							R = inherited::net_Spawn(DC);

	PKinematics(Visual())->CalculateBones_Invalidate();
	PKinematics(Visual())->CalculateBones(TRUE);

	CPHSkeleton::Spawn(e);
	setEnabled						(TRUE);
	setVisible						(TRUE);
	PKinematics(Visual())->CalculateBones_Invalidate();
	PKinematics(Visual())->CalculateBones(TRUE);
	m_fSaveMaxRPM					= m_max_rpm;
	SetfHealth						(co->health);

	if(!g_Alive())					b_exploded=true;
	else							b_exploded=false;
									
	CDamagableItem::RestoreEffect();
	
	
	CInifile* pUserData		= PKinematics(Visual())->LL_UserData(); 
	if(pUserData->section_exist("destroyed"))
		CPHDestroyable::Load(pUserData,"destroyed");
	if(pUserData->section_exist("mounted_weapon_definition"))
		m_car_weapon = xr_new<CCarWeapon>(this);

	if(pUserData->section_exist("visual_memory_definition"))
	{
		m_memory			= xr_new<car_memory>(this);
		m_memory->reload	(pUserData->r_string("visual_memory_definition", "section"));
	}

	return							(CScriptEntity::net_Spawn(DC) && R);
	
}
Exemplo n.º 4
0
void CHangingLamp::UpdateCL	()
{
	inherited::UpdateCL		();

	if(m_pPhysicsShell)
		m_pPhysicsShell->InterpolateGlobalTransform(&XFORM());

	if (Alive() && light_render->get_active()){
		if(Visual())	PKinematics(Visual())->CalculateBones();

		// update T&R from light (main) bone
		Fmatrix xf;
		if (light_bone!=BI_NONE){
			Fmatrix& M = smart_cast<CKinematics*>(Visual())->LL_GetTransform(light_bone);
			xf.mul		(XFORM(),M);
			VERIFY(!fis_zero(DET(xf)));
		}else{
			xf.set		(XFORM());
		}
		light_render->set_rotation	(xf.k,xf.i);
		light_render->set_position	(xf.c);
		if (glow_render)glow_render->set_position	(xf.c);

		// update T&R from ambient bone
		if (light_ambient){	
			if (ambient_bone!=light_bone){
				if (ambient_bone!=BI_NONE){
					Fmatrix& M = smart_cast<CKinematics*>(Visual())->LL_GetTransform(ambient_bone);
					xf.mul		(XFORM(),M);
					VERIFY(!fis_zero(DET(xf)));
				}else{
					xf.set		(XFORM());
				}
			}
			light_ambient->set_rotation	(xf.k,xf.i);
			light_ambient->set_position	(xf.c);
		}
		
		if (lanim){
			int frame;
			u32 clr					= lanim->CalculateBGR(Device.fTimeGlobal,frame); // возвращает в формате BGR
			Fcolor					fclr;
			fclr.set				((float)color_get_B(clr),(float)color_get_G(clr),(float)color_get_R(clr),1.f);
			fclr.mul_rgb			(fBrightness/255.f);
			light_render->set_color	(fclr);
			if (glow_render)		glow_render->set_color	(fclr);
			if (light_ambient) {
				fclr.mul_rgb		(ambient_power);
				light_ambient->set_color(fclr);
			}
		}
	}
}
Exemplo n.º 5
0
void CCar::SWheelBreak::Load(LPCSTR section)
{
	CKinematics		*K			=PKinematics(pwheel->car->Visual())												;
	CInifile		*ini		=K->LL_UserData()																;
	VERIFY						(ini)																			;
	break_torque		=		ini->r_float("car_definition","break_torque")									;
	hand_break_torque	=		READ_IF_EXISTS(ini,r_float,"car_definition","hand_break_torque",break_torque)	;
	if(ini->section_exist(section))
	{	
		break_torque					=READ_IF_EXISTS(ini,r_float,section,"break_torque",break_torque);
		hand_break_torque				=READ_IF_EXISTS(ini,r_float,section,"hand_break_torque",hand_break_torque);
	}
}
Exemplo n.º 6
0
void CPhysicsShellHolder::UpdateXFORM(const Fmatrix &upd)
{
	inherited::UpdateXFORM(upd);

	static int method = 1 + 4 + 8; // alpet: набор флагов для отладки, можно менять значение во время выполнения из Watches

	if (PPhysicsShell())
	{
		// m_pPhysicsShell->SetTransform(upd);		
		if (method & 1)
		{			
			PPhysicsShell()->mXFORM.set(upd);		
			PPhysicsShell()->SetGlTransformDynamic(upd);									
		}
			
		if (method & 2)
		{   // стянуто из Car.cpp и как-то не так работает
			bool enable = PPhysicsShell()->isEnabled();

			Fmatrix inv, replace;
			Fmatrix restored_form;
			PPhysicsShell()->GetGlobalTransformDynamic(&restored_form);
			inv.set(restored_form);
			inv.invert();
			replace.mul(upd, inv);
			PPhysicsShell()->SetTransform (replace);			
			if (enable) PPhysicsShell()->Enable(); 
			else PPhysicsShell()->Disable();
			// PPhysicsShell()->GetGlobalTransformDynamic(&XFORM());
		}
		// пересчет костей 		
		CKinematics *K = PKinematics(Visual());
		if (K)
		{
			K->CalculateBones_Invalidate();
			K->CalculateBones();
		}

		if (method & 4)
			PPhysicsShell()->Update();

		if (method & 8)		
			PPhysicsShell()->GetGlobalTransformDynamic(&XFORM());
		
			

	}
		
}
Exemplo n.º 7
0
void CPHShell::Activate(const Fmatrix &m0,float dt01,const Fmatrix &m2,bool disable){

	if(isActive())return;
	activate(disable);
//	ELEMENT_I i;
	mXFORM.set(m0);
	//for(i=elements.begin();elements.end() != i;++i){

	//	(*i)->Activate(m0,dt01, m2, disable);
	//}
	
	{		
		ELEMENT_I i=elements.begin(),e=elements.end();
		for(;i!=e;++i)(*i)->Activate(mXFORM,disable);
	}

	{
		JOINT_I i=joints.begin(),e=joints.end();
		for(;i!=e;++i) (*i)->Activate();
	}	
	
	Fmatrix m;
	{
		Fmatrix old_m = mXFORM;//+GetGlobalTransformDynamic update mXFORM;
		GetGlobalTransformDynamic	(&m);
		mXFORM = old_m;
	}
	m.invert();m.mulA_43		(mXFORM);
	TransformPosition(m);
	if(PKinematics())
	{
		SetCallbacks( );
	}

	//bActive=true;
	//bActivating=true;
	m_flags.set(flActive,TRUE);
	m_flags.set(flActivating,TRUE);
	spatial_register();
///////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
	//mXFORM.set(m0);
	//Activate(disable);
	Fvector lin_vel;
	lin_vel.sub(m2.c,m0.c);
	set_LinearVel(lin_vel);
}
Exemplo n.º 8
0
void CCar::SWheel::Load(LPCSTR section)
{
	CKinematics		*K			=PKinematics(car->Visual())		;
	CInifile		*ini		=K->LL_UserData()				;
	VERIFY						(ini)							;
	if(ini->section_exist(section))
	{
		collision_params.damping_factor	=READ_IF_EXISTS(ini,r_float,section,"damping_factor",collision_params.damping_factor);
		collision_params.spring_factor	=READ_IF_EXISTS(ini,r_float,section,"spring_factor",collision_params.spring_factor);
		collision_params.mu_factor		=READ_IF_EXISTS(ini,r_float,section,"friction_factor",collision_params.mu_factor);
	} 
	else if(ini->section_exist("wheels_params"))
	{
		collision_params.damping_factor	=ini->r_float("wheels_params","damping_factor")		;	
		collision_params.spring_factor	=ini->r_float("wheels_params","spring_factor")		;
		collision_params.mu_factor		=ini->r_float("wheels_params","friction_factor")	;
	}

}
Exemplo n.º 9
0
void CBreakableObject::ProcessDamage()
{
	NET_Packet			P;
	SHit				HS;
	HS.GenHeader		(GE_HIT, ID());
	HS.whoID			= (ID());			
	HS.weaponID			= (ID());			
	HS.dir				= (m_contact_damage_dir);
	HS.power			= (m_max_frame_damage);					
	HS.boneID			= (PKinematics(Visual())->LL_GetBoneRoot());				
	HS.p_in_bone_space	= (m_contact_damage_pos);
	HS.impulse			= (0.f);
	HS.hit_type			= (ALife::eHitTypeStrike);
	HS.Write_Packet		(P);
	
	u_EventSend			(P);

	m_max_frame_damage		= 0.f;
	b_resived_damage		=false;
}
Exemplo n.º 10
0
void	CPHMovementControl::				UpdateObjectBox(CPHCharacter *ach)
{
	if(!m_character||!m_character->b_exist) return;
	if(!ach||!ach->b_exist) return;
	Fvector cbox;
	PKinematics(pObject->Visual())->CalculateBones();
	pObject->BoundingBox().getradius(cbox);
	const Fvector &pa	=cast_fv(dBodyGetPosition(ach->get_body()));
	const Fvector &p	=cast_fv(dBodyGetPosition(m_character->get_body()));
	Fvector2 poses_dir;poses_dir.set(p.x-pa.x,p.z-pa.z);float plane_dist=poses_dir.magnitude(); 
	if(plane_dist>2.f) return;
	if(plane_dist>EPS_S)poses_dir.mul(1.f/plane_dist);
	Fvector2 plane_cam;plane_cam.set(Device.vCameraDirection.x,Device.vCameraDirection.z);plane_cam.normalize_safe();
	Fvector2 plane_i;plane_i.set(pObject->XFORM().i.x,pObject->XFORM().i.z);
	Fvector2 plane_k;plane_k.set(pObject->XFORM().k.x,pObject->XFORM().k.z);
	float R=_abs(poses_dir.dotproduct(plane_i)*cbox.x)+_abs(poses_dir.dotproduct(plane_k)*cbox.z);
	R*=poses_dir.dotproduct(plane_cam); //(poses_dir.x*plane_cam.x+poses_dir.y*plane_cam.z);
	Calculate(Fvector().set(0,0,0),Fvector().set(1,0,0),0,0,0,0);
	m_character->SetObjectRadius(R);
	ach->ChooseRestrictionType(CPHCharacter::rtStalker,1.f,m_character);
	m_character->UpdateRestrictionType(ach);
}
Exemplo n.º 11
0
IC BOOL material_callback(collide::rq_result& result, LPVOID params)
{
	STranspParam* fp= (STranspParam*)params;
	float vis		= 1.f;
	if (result.O){
		vis			= 0.f;
		CKinematics*K=PKinematics(result.O->renderable.visual);
		if (K&&(result.element>0))
			vis		= g_pGamePersistent->MtlTransparent(K->LL_GetData(u16(result.element)).game_mtl_idx);
	}else{
		CDB::TRI* T	= g_pGameLevel->ObjectSpace.GetStaticTris()+result.element;
		vis			= g_pGamePersistent->MtlTransparent(T->material);
		if (fis_zero(vis)){
			Fvector* V	= g_pGameLevel->ObjectSpace.GetStaticVerts();
			fp->parent->m_ray_cache.set				(fp->P,fp->D,fp->f,TRUE);
			fp->parent->m_ray_cache.verts[0].set	(V[T->verts[0]]);
			fp->parent->m_ray_cache.verts[1].set	(V[T->verts[1]]);
			fp->parent->m_ray_cache.verts[2].set	(V[T->verts[2]]);
		}
	}
	fp->vis			*=vis;
	return (fp->vis>fp->vis_threshold); 
}
Exemplo n.º 12
0
void CPHShell::Activate(bool disable)
{ 
	if(isActive())return;

	activate(disable);
	{		
		ELEMENT_I i=elements.begin(),e=elements.end();
			 for(;i!=e;++i)(*i)->Activate(mXFORM,disable);
	}

	{
		JOINT_I i=joints.begin(),e=joints.end();
		for(;i!=e;++i) (*i)->Activate();
	}	
	
	if(PKinematics())
	{
		SetCallbacks(GetBonesCallback());
	}
	spatial_register();
	m_flags.set(flActivating,TRUE);
	m_flags.set(flActive,TRUE);

}