--@include ./powertrain_component.txt --@include ./enums/gearbox.txt --@include /koptilnya/libs/constants.txt require('/koptilnya/libs/constants.txt') require('./powertrain_component.txt') local gearboxTypes = require('./enums/gearbox.txt') Clutch = class('Clutch', PowertrainComponent) function Clutch:initialize(config) PowertrainComponent.initialize(self, 'Clutch') self.wireInputs = { Clutch = 'number' } self.wireOutputs = { Clutch_Torque = 'number' } self.inertia = config.Inertia or 0.1 self.slipTorque = config.SlipTorque or 1000 end function Clutch:updateWireOutputs() wire.ports.Clutch_Torque = self.torque end function Clutch:getPress() return 1 - wire.ports.Clutch end function Clutch:queryInertia() if self.output == nil then return self.inertia end return self.inertia + self.output:queryInertia() * self:getPress() end function Clutch:queryAngularVelocity(angularVelocity) self.angularVelocity = angularVelocity if self.output == nil then return angularVelocity end local outputW = self.output:queryAngularVelocity(angularVelocity) * self:getPress() local inputW = angularVelocity * (1 - self:getPress()) return outputW + inputW end function Clutch:forwardStep(torque, inertia) if self.output == nil then return torque end local press = self:getPress() self.torque = math.clamp(torque, -self.slipTorque, self.slipTorque) self.torque = self.torque * (1 - (1 - math.pow(press, 0.3))) local returnTorque = self.output:forwardStep(self.torque, inertia * press + self.inertia) * press return math.clamp(returnTorque, -self.slipTorque, self.slipTorque) end