void SimTransmissionUpdate(tCar *car) { tTransmission *trans = &(car->transmission); tClutch *clutch = &(trans->clutch); tDifferential *differential, *differential0, *differential1; tdble transfer = MIN(clutch->transferValue * 3.0, 1.0); switch(trans->type) { case TRANS_RWD: differential = &(trans->differential[TRANS_REAR_DIFF]); differential->in.Tq = car->engine.Tq * trans->curOverallRatio * transfer; SimDifferentialUpdate(car, differential, 1); SimUpdateFreeWheels(car, 0); break; case TRANS_FWD: differential = &(trans->differential[TRANS_FRONT_DIFF]); differential->in.Tq = car->engine.Tq * trans->curOverallRatio * transfer; SimDifferentialUpdate(car, differential, 1); SimUpdateFreeWheels(car, 1); break; case TRANS_4WD: differential = &(trans->differential[TRANS_CENTRAL_DIFF]); differential0 = &(trans->differential[TRANS_FRONT_DIFF]); differential1 = &(trans->differential[TRANS_REAR_DIFF]); differential->in.Tq = car->engine.Tq * trans->curOverallRatio * transfer; differential->inAxis[0]->spinVel = (differential0->inAxis[0]->spinVel + differential0->inAxis[1]->spinVel) / 2.0; differential->inAxis[1]->spinVel = (differential1->inAxis[0]->spinVel + differential1->inAxis[1]->spinVel) / 2.0; differential->inAxis[0]->Tq = (differential0->inAxis[0]->Tq + differential0->inAxis[1]->Tq) / differential->ratio; differential->inAxis[1]->Tq = (differential1->inAxis[0]->Tq + differential1->inAxis[1]->Tq) / differential->ratio; differential->inAxis[0]->brkTq = (differential0->inAxis[0]->brkTq + differential0->inAxis[1]->brkTq) / differential->ratio; differential->inAxis[1]->brkTq = (differential1->inAxis[0]->brkTq + differential1->inAxis[1]->brkTq) / differential->ratio; SimDifferentialUpdate(car, differential, 1); differential = differential0; SimDifferentialUpdate(car, differential, 0); differential = differential1; SimDifferentialUpdate(car, differential, 0); break; } }
void SimTransmissionUpdate(tCar *car) { tTransmission *trans = &(car->transmission); tClutch *clutch = &(trans->clutch); tGearbox *gearbox = &(trans->gearbox); tDifferential *differential, *differential0, *differential1; tdble transfer = MIN(clutch->transferValue * 3.0f, 1.0f); switch(trans->type) { case TRANS_RWD: differential = &(trans->differential[TRANS_REAR_DIFF]); differential->in.Tq = (car->engine.Tq_response + car->engine.Tq) * trans->curOverallRatio * transfer * trans->gearEff[gearbox->gear+1]; SimDifferentialUpdate(car, differential, 1); SimUpdateFreeWheels(car, 0); /* printf("s0 %f - s1 %f (%f) inTq %f -- Tq0 %f - Tq1 %f (%f)\n", */ /* differential->outAxis[0]->spinVel, differential->outAxis[1]->spinVel, differential->outAxis[0]->spinVel - differential->outAxis[1]->spinVel, */ /* differential->in.Tq, */ /* differential->outAxis[0]->Tq, differential->outAxis[1]->Tq, differential->outAxis[0]->Tq - differential->outAxis[1]->Tq); */ break; case TRANS_FWD: differential = &(trans->differential[TRANS_FRONT_DIFF]); differential->in.Tq = (car->engine.Tq_response + car->engine.Tq) * trans->curOverallRatio * transfer * trans->gearEff[gearbox->gear+1]; SimDifferentialUpdate(car, differential, 1); SimUpdateFreeWheels(car, 1); /* printf("s0 %f - s1 %f (%f) inTq %f -- Tq0 %f - Tq1 %f (%f)\n", */ /* differential->outAxis[0]->spinVel, differential->outAxis[1]->spinVel, differential->outAxis[0]->spinVel - differential->outAxis[1]->spinVel, */ /* differential->in.Tq, */ /* differential->outAxis[0]->Tq, differential->outAxis[1]->Tq, differential->outAxis[0]->Tq - differential->outAxis[1]->Tq); */ break; case TRANS_4WD: differential = &(trans->differential[TRANS_CENTRAL_DIFF]); differential0 = &(trans->differential[TRANS_FRONT_DIFF]); differential1 = &(trans->differential[TRANS_REAR_DIFF]); differential->in.Tq = (car->engine.Tq_response + car->engine.Tq) * trans->curOverallRatio * transfer * trans->gearEff[gearbox->gear+1]; differential->inAxis[0]->spinVel = (differential0->inAxis[0]->spinVel + differential0->inAxis[1]->spinVel) / 2.0f; differential->inAxis[1]->spinVel = (differential1->inAxis[0]->spinVel + differential1->inAxis[1]->spinVel) / 2.0f; differential->inAxis[0]->Tq = (differential0->inAxis[0]->Tq + differential0->inAxis[1]->Tq) / differential->ratio; differential->inAxis[1]->Tq = (differential1->inAxis[0]->Tq + differential1->inAxis[1]->Tq) / differential->ratio; differential->inAxis[0]->brkTq = (differential0->inAxis[0]->brkTq + differential0->inAxis[1]->brkTq) / differential->ratio; differential->inAxis[1]->brkTq = (differential1->inAxis[0]->brkTq + differential1->inAxis[1]->brkTq) / differential->ratio; SimDifferentialUpdate(car, differential, 1); /* printf("\nCentral : s0 %f - s1 %f (%f) inTq %f -- Tq0 %f - Tq1 %f (%f)\n", */ /* differential->outAxis[0]->spinVel, differential->outAxis[1]->spinVel, differential->outAxis[0]->spinVel - differential->outAxis[1]->spinVel, */ /* differential->in.Tq, */ /* differential->outAxis[0]->Tq, differential->outAxis[1]->Tq, differential->outAxis[0]->Tq - differential->outAxis[1]->Tq); */ differential = differential0; SimDifferentialUpdate(car, differential, 0); /* printf("Front : s0 %f - s1 %f (%f) inTq %f -- Tq0 %f - Tq1 %f (%f)\n", */ /* differential->outAxis[0]->spinVel, differential->outAxis[1]->spinVel, differential->outAxis[0]->spinVel - differential->outAxis[1]->spinVel, */ /* differential->in.Tq, */ /* differential->outAxis[0]->Tq, differential->outAxis[1]->Tq, differential->outAxis[0]->Tq - differential->outAxis[1]->Tq); */ differential = differential1; SimDifferentialUpdate(car, differential, 0); /* printf("Rear : s0 %f - s1 %f (%f) inTq %f -- Tq0 %f - Tq1 %f (%f)\n", */ /* differential->outAxis[0]->spinVel, differential->outAxis[1]->spinVel, differential->outAxis[0]->spinVel - differential->outAxis[1]->spinVel, */ /* differential->in.Tq, */ /* differential->outAxis[0]->Tq, differential->outAxis[1]->Tq, differential->outAxis[0]->Tq - differential->outAxis[1]->Tq); */ break; } }