- added compounds model in OsgGraph

git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@9176 30fe4595-0a0c-4342-8851-515496e4dcbd
This commit is contained in:
torcs-ng 2023-10-28 21:07:34 +00:00
parent 3359fba8db
commit 4a998d9883
4 changed files with 140 additions and 30 deletions

View File

@ -841,6 +841,7 @@ typedef struct CarElt
#define PRM_ENGBRKCOEFF "brake coefficient"
#define PRM_ENGBRKLINCOEFF "brake linear coefficient"
#define PRM_ENGINEMAXTEMPWATER "max temperature water"
#define PRM_ENGINETEMPCOEFF "engine temperature coefficient"
#define PRM_POWER "power"
#define PRM_TURBO "turbo"
#define PRM_TURBO_RPM "turbo rpm"

View File

@ -33,6 +33,17 @@ osg::ref_ptr<osg::Node> SDWheels::initWheels(tCarElt *car_elt,void *handle)
this->brakes.setCar(car);
const char *wheelSoft3DModNamePrfx =
GfParmGetStr(handle, SECT_GROBJECTS, PRM_WHEELSOFT_3D, "");
const char *wheelMedium3DModNamePrfx =
GfParmGetStr(handle, SECT_GROBJECTS, PRM_WHEELMEDIUM_3D, "");
const char *wheelHard3DModNamePrfx =
GfParmGetStr(handle, SECT_GROBJECTS, PRM_WHEELHARD_3D, "");
const char *wheelWet3DModNamePrfx =
GfParmGetStr(handle, SECT_GROBJECTS, PRM_WHEELWET_3D, "");
const char *wheelExtremWet3DModNamePrfx =
GfParmGetStr(handle, SECT_GROBJECTS, PRM_WHEELEXTWET_3D, "");
const char *wheelFront3DModFileNamePrfx =
GfParmGetStr(handle, SECT_GROBJECTS, PRM_FRONT_WHEEL_3D, "");
const char *wheelRear3DModFileNamePrfx =
@ -40,26 +51,41 @@ osg::ref_ptr<osg::Node> SDWheels::initWheels(tCarElt *car_elt,void *handle)
const char *wheel3DModFileNamePrfx =
GfParmGetStr(handle, SECT_GROBJECTS, PRM_WHEEL_3D, "wheel");
if (*wheelFront3DModFileNamePrfx)
if (*wheelSoft3DModNamePrfx)
{
wheels[FRNT_RGT] = initWheel(FRNT_RGT, wheelFront3DModFileNamePrfx);
wheels[FRNT_LFT] = initWheel(FRNT_LFT, wheelFront3DModFileNamePrfx);
}
else
{
wheels[FRNT_RGT] =initWheel(FRNT_RGT, wheel3DModFileNamePrfx);
wheels[FRNT_LFT] =initWheel(FRNT_LFT, wheel3DModFileNamePrfx);
}
wheels[FRNT_RGT] =initWheel(FRNT_RGT, true, wheelSoft3DModNamePrfx, wheelMedium3DModNamePrfx,
wheelHard3DModNamePrfx, wheelWet3DModNamePrfx, wheelExtremWet3DModNamePrfx);
wheels[FRNT_LFT] =initWheel(FRNT_LFT, true, wheelSoft3DModNamePrfx, wheelMedium3DModNamePrfx,
wheelHard3DModNamePrfx, wheelWet3DModNamePrfx, wheelExtremWet3DModNamePrfx);
if (*wheelRear3DModFileNamePrfx)
{
wheels[REAR_RGT] =initWheel(REAR_RGT, wheelRear3DModFileNamePrfx);
wheels[REAR_LFT] =initWheel(REAR_LFT, wheelRear3DModFileNamePrfx);
wheels[REAR_RGT] =initWheel(REAR_RGT, true, wheelSoft3DModNamePrfx, wheelMedium3DModNamePrfx,
wheelHard3DModNamePrfx, wheelWet3DModNamePrfx, wheelExtremWet3DModNamePrfx);
wheels[REAR_LFT] =initWheel(REAR_LFT, true, wheelSoft3DModNamePrfx, wheelMedium3DModNamePrfx,
wheelHard3DModNamePrfx, wheelWet3DModNamePrfx, wheelExtremWet3DModNamePrfx);
}
else
{
wheels[REAR_RGT] =initWheel(REAR_RGT, wheel3DModFileNamePrfx);
wheels[REAR_LFT] =initWheel(REAR_LFT, wheel3DModFileNamePrfx);
if (*wheelFront3DModFileNamePrfx)
{
wheels[FRNT_RGT] = initWheel(FRNT_RGT, false, wheelFront3DModFileNamePrfx, NULL, NULL, NULL, NULL);
wheels[FRNT_LFT] = initWheel(FRNT_LFT, false, wheelFront3DModFileNamePrfx, NULL, NULL, NULL, NULL);
}
else
{
wheels[FRNT_RGT] =initWheel(FRNT_RGT, false, wheel3DModFileNamePrfx, NULL, NULL, NULL, NULL);
wheels[FRNT_LFT] =initWheel(FRNT_LFT, false, wheel3DModFileNamePrfx, NULL, NULL, NULL, NULL);
}
if (*wheelRear3DModFileNamePrfx)
{
wheels[REAR_RGT] =initWheel(REAR_RGT, false, wheelRear3DModFileNamePrfx, NULL, NULL, NULL, NULL);
wheels[REAR_LFT] =initWheel(REAR_LFT, false, wheelRear3DModFileNamePrfx, NULL, NULL, NULL, NULL);
}
else
{
wheels[REAR_RGT] =initWheel(REAR_RGT, false, wheel3DModFileNamePrfx, NULL, NULL, NULL, NULL);
wheels[REAR_LFT] =initWheel(REAR_LFT, false, wheel3DModFileNamePrfx, NULL, NULL, NULL, NULL);
}
}
osg::ref_ptr<osg::Group> group = new osg::Group;
@ -72,12 +98,15 @@ osg::ref_ptr<osg::Node> SDWheels::initWheels(tCarElt *car_elt,void *handle)
return group.get();
}
osg::ref_ptr<osg::MatrixTransform> SDWheels::initWheel(int wheelIndex, const char * wheel_mod_name)
osg::ref_ptr<osg::MatrixTransform> SDWheels::initWheel(int wheelIndex, bool compound, const char *wheel_mod_name,
const char *medium_mod_name, const char *hard_mod_name,
const char *wet_mod_name, const char *extwet_mod_name)
{
osgLoader loader;
char wheel_file_name[32];
static const int MaxPathSize = 512;
char buf[MaxPathSize];
compounds = compound;
const bool bCustomSkin = strlen(this->car->_skinName) != 0;
@ -92,7 +121,7 @@ osg::ref_ptr<osg::MatrixTransform> SDWheels::initWheel(int wheelIndex, const cha
GfLogInfo("Car Texture = %s\n", bSkinName.c_str());
if (!exist)
bSkinName.clear();
bSkinName.clear();
else
{
snprintf(buf, MaxPathSize, "wheel3d-%s", car->_skinName);
@ -121,15 +150,81 @@ osg::ref_ptr<osg::MatrixTransform> SDWheels::initWheel(int wheelIndex, const cha
wheels_switches[wheelIndex] = new osg::Switch;
// Load speed-dependant 3D wheel model if available
for(int j=0;j<4;j++)
if (compounds)
{
osg::ref_ptr<osg::Node> wheel = 0;
if (wheel_mod_name && strlen(wheel_mod_name))
for(int j=0; j<4; j++)
{
snprintf(wheel_file_name, 32, "%s%d.acc", wheel_mod_name, j);
wheel = loader.Load3dFile(wheel_file_name, true, bSkinName);
wheels_switches[wheelIndex]->addChild(wheel.get(), false);
osg::ref_ptr<osg::Node> wheel = 0;
if (wheel_mod_name && strlen(wheel_mod_name))
{
snprintf(wheel_file_name, 32, "%s%d.acc", wheel_mod_name, j);
wheel = loader.Load3dFile(wheel_file_name, true, bSkinName);
wheels_switches[wheelIndex]->addChild(wheel.get(), false);
GfLogDebug("Loading compound %s\n", wheel_mod_name);
}
}
for(int j=0; j<4; j++)
{
osg::ref_ptr<osg::Node> wheel = 0;
if (medium_mod_name && strlen(medium_mod_name))
{
snprintf(wheel_file_name, 32, "%s%d.acc", medium_mod_name, j);
wheel = loader.Load3dFile(wheel_file_name, true, bSkinName);
wheels_switches[wheelIndex]->addChild(wheel.get(), false);
GfLogDebug("Loading compound %s\n", medium_mod_name);
}
}
for(int j=0; j<4; j++)
{
osg::ref_ptr<osg::Node> wheel = 0;
if (hard_mod_name && strlen(hard_mod_name))
{
snprintf(wheel_file_name, 32, "%s%d.acc", hard_mod_name, j);
wheel = loader.Load3dFile(wheel_file_name, true, bSkinName);
wheels_switches[wheelIndex]->addChild(wheel.get(), false);
GfLogDebug("Loading compound %s\n", hard_mod_name);
}
}
for(int j=0; j<4; j++)
{
osg::ref_ptr<osg::Node> wheel = 0;
if (wet_mod_name && strlen(wet_mod_name))
{
snprintf(wheel_file_name, 32, "%s%d.acc", wet_mod_name, j);
wheel = loader.Load3dFile(wheel_file_name, true, bSkinName);
wheels_switches[wheelIndex]->addChild(wheel.get(), false);
GfLogDebug("Loading compound %s\n", wet_mod_name);
}
}
for(int j=0; j<4; j++)
{
osg::ref_ptr<osg::Node> wheel = 0;
if (extwet_mod_name && strlen(extwet_mod_name))
{
snprintf(wheel_file_name, 32, "%s%d.acc", extwet_mod_name, j);
wheel = loader.Load3dFile(wheel_file_name, true, bSkinName);
wheels_switches[wheelIndex]->addChild(wheel.get(), false);
GfLogDebug("Loading compound %s\n", extwet_mod_name);
}
}
}
else
{
// Load speed-dependant 3D wheel model if available
for(int j=0; j<4; j++)
{
osg::ref_ptr<osg::Node> wheel = 0;
if (wheel_mod_name && strlen(wheel_mod_name))
{
snprintf(wheel_file_name, 32, "%s%d.acc", wheel_mod_name, j);
wheel = loader.Load3dFile(wheel_file_name, true, bSkinName);
wheels_switches[wheelIndex]->addChild(wheel.get(), false);
}
}
}
@ -185,12 +280,23 @@ void SDWheels::updateWheels()
trans->setMatrix(spinMatrix);
wheels[i]->setMatrix(posMatrix);
for (j = 0; j < 3; j++)
{
if (fabs(car->_wheelSpinVel(i)) < maxVel[j])
break;
}
this->wheels_switches[i]->setSingleChildOn(j);
int compoundSelector = (car->priv.wheel[i].compound - 1);
int selectchild = compoundSelector * 4;
int v = j + selectchild;
if (compounds)
{
this->wheels_switches[i]->setSingleChildOn(v);
GfLogDebug("Drawing Compounds = %i\n", v);
}
else
this->wheels_switches[i]->setSingleChildOn(j);
}
}

View File

@ -37,7 +37,10 @@ private :
osg::ref_ptr<osg::Switch> wheels_switches[4];
osg::ref_ptr<osg::MatrixTransform> wheels[4];
SDBrakes brakes;
osg::ref_ptr<osg::MatrixTransform> initWheel(int wheelIndex, const char *wheel_mod_name);
osg::ref_ptr<osg::MatrixTransform> initWheel(int wheelIndex, bool compound, const char *wheel_mod_name,
const char *medium_mod_name, const char *hard_mod_name,
const char *wet_mod_name, const char *extwet_mod_name);
bool compounds;
public :
SDWheels() : car(nullptr) { }

View File

@ -20,6 +20,7 @@
#include "sim.h"
float enginePressure;
double engineCoefficient;
void
SimEngineConfig(tCar *car)
@ -56,6 +57,7 @@ SimEngineConfig(tCar *car)
car->engine.I_joint = car->engine.I;
car->engine.timeInLimiter = 0.0f;
car->engine.max_temp_water = GfParmGetNum(hdle, SECT_ENGINE, PRM_ENGINEMAXTEMPWATER, (char*)NULL, 95.0f);
engineCoefficient = GfParmGetNum(hdle, SECT_ENGINE, PRM_ENGINETEMPCOEFF, (char*)NULL, 0.0000047f);
car->carElt->_engineMaxTempWater = car->engine.max_temp_water;
if(car->options->engine_temperature)
@ -407,7 +409,7 @@ tdble SimEngineUpdateWater(tCar *car)
else
temp2 = Tair;
tdble temp = 35.0 / K2C(temp2);
tdble temp = 32.0 / K2C(temp2);
if (water < engine->max_temp_water - 20.0f)
water = engine->temp_water + (1.0f / (engine->rads * Tair * SimDeltaTime));
@ -426,8 +428,6 @@ tdble SimEngineUpdateWater(tCar *car)
car->airSpeed2, SimAirPressure, air,gain);
}
if(car->options->engine_damage)
damage = tdble(car->dammage) / 10000.0;
else
@ -451,7 +451,7 @@ tdble SimEngineUpdateWater(tCar *car)
engine->temp_water = water;
if(engine->temp_water > engine->max_temp_water + 10.0f)
if(engine->temp_water > engine->max_temp_water + 6.0f)
car->carElt->_state |= RM_CAR_STATE_BROKEN;
return 0.0;