Beispiel #1
0
float CCar::EngineDriveSpeed()
{
	//float wheel_speed,drive_speed=phInfinity;
	float calc_rpm=0.f;
	if(b_transmission_switching)
	{
		calc_rpm=m_max_rpm;
		if(m_current_rpm>m_power_rpm) 
		{
			b_transmission_switching=false;
		}
	}else
	{
		calc_rpm=EngineRpmFromWheels();

		if(!b_clutch&&calc_rpm<m_min_rpm)
		{
			calc_rpm=m_min_rpm;
		}
		limit_above(calc_rpm,m_max_rpm)		;
	}
	if(calc_rpm>m_current_rpm)
		return		(1.f-m_rpm_increment_factor)*m_current_rpm+m_rpm_increment_factor*calc_rpm;
	else
		return		(1.f-m_rpm_decrement_factor)*m_current_rpm+m_rpm_decrement_factor*calc_rpm;

	//if(drive_speed<phInfinity) return dFabs(drive_speed*m_current_gear_ratio);
	//else					  return 0.f;
}
void TTestDepthCallback (bool& do_colide,bool bo1,dContact& c,SGameMtl* material_1,SGameMtl* material_2)
{
	if(saved_callback)saved_callback(do_colide,bo1,c,material_1,material_2);

	if(do_colide&&!material_1->Flags.test(SGameMtl::flPassable) &&!material_2->Flags.test(SGameMtl::flPassable))
	{
		float& depth=c.geom.depth;
		float test_depth=depth-Pars::decrement_depth;
		save_max(max_depth,test_depth);
		c.surface.mu*=Pars::calback_friction_factor;
		if(test_depth>Pars::depth_to_use_force)
		{
			float force = Pars::callback_force_factor*ph_world->Gravity();
			dBodyID b1=dGeomGetBody(c.geom.g1);
			dBodyID b2=dGeomGetBody(c.geom.g2);
			if(b1)dBodyAddForce(b1,c.geom.normal[0]*force,c.geom.normal[1]*force,c.geom.normal[2]*force);
			if(b2)dBodyAddForce(b2,-c.geom.normal[0]*force,-c.geom.normal[1]*force,-c.geom.normal[2]*force);
			dxGeomUserData* ud1=retrieveGeomUserData(c.geom.g1);
			dxGeomUserData* ud2=retrieveGeomUserData(c.geom.g2);

			if(ud1)
			{
				CPhysicsShell* phsl=ud1->ph_ref_object->PPhysicsShell();
				if(phsl) phsl->Enable();
			}

			if(ud2)
			{
				CPhysicsShell* phsl=ud2->ph_ref_object->PPhysicsShell();
				if(phsl) phsl->Enable();
			}


			do_colide=false;
		}
		else if(test_depth>Pars::depth_to_change_softness_pars)
		{
			c.surface.soft_cfm=Pars::callback_cfm_factor;
			c.surface.soft_erp=Pars::callback_erp_factor;
		}
		limit_above(depth,Pars::max_real_depth);
	}

}
Beispiel #3
0
void stack(node_t *n, bool focused)
{
    if (IS_FLOATING(n->client) && !auto_raise) {
        return;
    }

    if (stack_head == NULL) {
        stack_insert_after(NULL, n);
    } else {
        stacking_list_t *s = (focused ? limit_above(n) : limit_below(n));
        if (s == NULL) {
            return;
        }
        int i = stack_cmp(n->client, s->node->client);
        if (i < 0 || (i == 0 && !focused)) {
            stack_insert_before(s, n);
            window_below(n->client->window, s->node->client->window);
        } else {
            stack_insert_after(s, n);
            window_above(n->client->window, s->node->client->window);
        }
    }
}