def createTrackNodesAnimator(compoundModel, typeDescriptor, wheelsDataProvider=None, lodStateLink=None): trackNodesConfig = typeDescriptor.chassis.trackNodes trackParams = typeDescriptor.chassis.trackParams if not trackNodesConfig: return else: trackNodesAnimator = Vehicular.TrackNodesAnimator( compoundModel, TankNodeNames.HULL_SWINGING) if trackParams is not None: trackNodesAnimator.setParameters(trackParams.thickness, trackParams.gravity, trackParams.maxAmplitude, trackParams.maxOffset) for trackNode in trackNodesConfig.nodes: leftSibling = '' if trackNode.leftNodeName is None else trackNode.leftNodeName rightSibling = '' if trackNode.rightNodeName is None else trackNode.rightNodeName trackNodesAnimator.addTrackNode( trackNode.name, trackNode.isLeft, trackNode.initialOffset, leftSibling, rightSibling, (trackNode.damping, trackNode.elasticity, trackNode.forwardElasticityCoeff, trackNode.backwardElasticityCoeff)) trackNodesAnimator.setWheelsDataProvider(wheelsDataProvider) trackNodesAnimator.setLodLink(lodStateLink) trackNodesAnimator.setLodSettings( shared_components.LodSettings( typeDescriptor.chassis.wheels.lodDist, DEFAULT_MAX_LOD_PRIORITY)) return trackNodesAnimator
def createSuspension(compoundModel, vehicleDescriptor, lodStateLink, collisionObstaclesCollector, tessellationCollisionSensor): groundNodesConfig = vehicleDescriptor.chassis.groundNodes groundNodeGroups = groundNodesConfig.groups groundNodes = groundNodesConfig.nodes hasGroundNodes = len(groundNodeGroups) or len(groundNodes) if not hasGroundNodes: return None else: suspension = Vehicular.Suspension(compoundModel, tessellationCollisionSensor, TankPartIndexes.CHASSIS) for groundGroup in groundNodeGroups: nodes = _createNodeNameListByTemplate(groundGroup.startIndex, groundGroup.template, groundGroup.count) suspension.addGroundNodesGroup(nodes, groundGroup.isLeft, groundGroup.minOffset, groundGroup.maxOffset) for groundNode in groundNodes: suspension.addGroundNode(groundNode.name, groundNode.isLeft, groundNode.minOffset, groundNode.maxOffset) trackParams = vehicleDescriptor.chassis.trackParams suspension.setParameters(trackParams.thickness) suspension.setLodLink(lodStateLink) suspension.setLodSettings( shared_components.LodSettings( vehicleDescriptor.chassis.wheels.lodDist, DEFAULT_MAX_LOD_PRIORITY)) suspension.setCollisionObstaclesCollector(collisionObstaclesCollector) return suspension
def assembleVehicleTraces(appearance, f, lodStateLink=None): vehicleTraces = Vehicular.VehicleTraces() tracesConfig = appearance.typeDescriptor.chassis.traces textures = {} for matKindName, texId in DecalMap.g_instance.getTextureSet( tracesConfig.textureSet).iteritems(): if matKindName != 'bump': for matKind in material_kinds.EFFECT_MATERIAL_IDS_BY_NAMES[ matKindName]: textures[matKind] = texId vehicleTraces.setTrackTraces( tracesConfig.bufferPrefs, textures, tracesConfig.centerOffset, tracesConfig.size, appearance.typeDescriptor.chassis.topRightCarryingPoint[1] * 2) vehicleTraces.setCompound(appearance.compoundModel) isLeftFlying = DataLinks.createBoolLink(appearance.flyingInfoProvider, 'isLeftSideFlying') isRightFlying = DataLinks.createBoolLink(appearance.flyingInfoProvider, 'isRightSideFlying') vehicleTraces.setFlyingInfo(isLeftFlying, isRightFlying) vehicleTraces.setLodLink(lodStateLink) vehicleTraces.setLodSettings( shared_components.LodSettings(tracesConfig.lodDist, DEFAULT_MAX_LOD_PRIORITY)) vehicleTraces.setMovementInfo(f.movementInfo) appearance.vehicleTraces = vehicleTraces
def createTankWheelsAnimator(appearance, typeDescriptor, splineTracks, lodStateLink=None): wheelsAnimator = None try: compoundModel = appearance.compoundModel f = appearance.filter wheelsConfig = typeDescriptor.chassis.wheels wheelsAnimator = appearance.createComponent(Vehicular.TankWheelsAnimator, compoundModel) for group in wheelsConfig.groups: nodes = _createNameListByTemplate(group.startIndex, group.template, group.count) wheelsAnimator.addWheelGroup(group.isLeft, group.radius, nodes) for wheel in wheelsConfig.wheels: wheelsAnimator.addWheel(wheel.isLeft, wheel.radius, wheel.nodeName, wheel.isLeading, wheel.leadingSyncAngle) if splineTracks is not None and splineTracks.left and splineTracks.right: wheelsAnimator.setSplineTrackMovementData(splineTracks.left[0], splineTracks.right[0]) wheelsAnimator.setLodLink(lodStateLink) wheelsAnimator.setLodSettings(shared_components.LodSettings(typeDescriptor.chassis.chassisLodDistance, DEFAULT_MAX_LOD_PRIORITY)) if f is not None: wheelsAnimator.setMovementInfo(f.movementInfo) return wheelsAnimator except BigWorld.AssetException: _logger.error('Failed to create TankWheelsAnimator', exc_info=True) if wheelsAnimator is not None: appearance.removeComponent(wheelsAnimator) return return
def createGeneralWheelsAnimator(appearance, colliderType, typeDescriptor, wheelsState, wheelsScroll, wheelsSteering, lodStateLink=None): config = typeDescriptor.chassis.generalWheelsAnimatorConfig generalWheelsAnimator = appearance.createComponent(Vehicular.GeneralWheelsAnimator, config, appearance.compoundModel, appearance.collisions, colliderType, wheelsState, wheelsScroll, wheelsSteering, appearance.id) generalWheelsAnimator.setLodLink(lodStateLink) generalWheelsAnimator.setLodSettings(shared_components.LodSettings(typeDescriptor.chassis.chassisLodDistance, DEFAULT_MAX_LOD_PRIORITY)) generalWheelsAnimator.connectVehicleFashion(appearance.fashion) return generalWheelsAnimator
def assembleVehicleTraces(appearance, f, lodStateLink=None): vehicleTraces = appearance.createComponent(Vehicular.VehicleTraces) chassisConfig = appearance.typeDescriptor.chassis tracesConfig = chassisConfig.traces textures = {} for matKindName, texId in DecalMap.g_instance.getTextureSet(tracesConfig.textureSet).iteritems(): if matKindName != 'bump': for matKind in material_kinds.EFFECT_MATERIAL_IDS_BY_NAMES[matKindName]: textures[matKind] = texId vehicleTraces.setTrackTextures(textures) vehicleTraces.setCompound(appearance.compoundModel) if chassisConfig.generalWheelsAnimatorConfig is None: wrOffset = Math.Vector2(tracesConfig.centerOffset, 0) wlOffset = Math.Vector2(-tracesConfig.centerOffset, 0) length = appearance.typeDescriptor.chassis.topRightCarryingPoint[1] * 2 vehicleTraces.addTrackTrace('', wrOffset, tracesConfig.size, length, tracesConfig.bufferPrefs, False) vehicleTraces.addTrackTrace('', wlOffset, tracesConfig.size, length, tracesConfig.bufferPrefs, False) else: traceConfigs = appearance.wheelsAnimator.getTraceConfigs() for trace in traceConfigs: vehicleTraces.addTrackTrace('', trace[0], tracesConfig.size, trace[1], tracesConfig.bufferPrefs, False) isLeftFlying = DataLinks.createBoolLink(appearance.flyingInfoProvider, 'isLeftSideFlying') isRightFlying = DataLinks.createBoolLink(appearance.flyingInfoProvider, 'isRightSideFlying') vehicleTraces.setFlyingInfo(isLeftFlying, isRightFlying) vehicleTraces.setLodLink(lodStateLink) vehicleTraces.setLodSettings(shared_components.LodSettings(tracesConfig.lodDist, DEFAULT_MAX_LOD_PRIORITY)) vehicleTraces.setMovementInfo(f.movementInfo) vehicleTraces.setActivePostmortem(tracesConfig.activePostmortem) appearance.vehicleTraces = vehicleTraces return
def assembleTessellationCollisionSensor(appearance, lodStateLink): tessellationCollisionSensor = appearance.createComponent(Vehicular.TessellationCollisionSensor, appearance.compoundModel, TankPartIndexes.CHASSIS) if lodStateLink is not None: tessellationCollisionSensor.setLodLink(lodStateLink) tessellationCollisionSensor.setLodSettings(shared_components.LodSettings(appearance.typeDescriptor.chassis.chassisLodDistance, DEFAULT_MAX_LOD_PRIORITY)) appearance.tessellationCollisionSensor = tessellationCollisionSensor return
def assembleWaterSensor(vehicleDesc, appearance, lodStateLink): MIN_DEPTH_FOR_HEAVY_SPLASH = 0.5 WATER_SENSOR_LOD_DIST = 150.0 WATER_SENSOR_MAX_PRIORITY = 15 turretOffset = vehicleDesc.chassis.hullPosition + vehicleDesc.hull.turretPositions[ 0] trPoint = vehicleDesc.chassis.topRightCarryingPoint lightVelocityThreshold = vehicleDesc.type.collisionEffectVelocities[ 'waterContact'] heavyVelocityThreshold = vehicleDesc.type.heavyCollisionEffectVelocities[ 'waterContact'] sensorConfig = (turretOffset, trPoint, lightVelocityThreshold, heavyVelocityThreshold, MIN_DEPTH_FOR_HEAVY_SPLASH, BigWorld.player().spaceID) sensor = Vehicular.WaterSensor(sensorConfig) sensor.sensorPlaneLink = appearance.compoundModel.root sensor.speedLink = DataLinks.createFloatLink(appearance.filter, 'averageSpeed') sensor.onWaterSplash = appearance.onWaterSplash sensor.onUnderWaterSwitch = appearance.onUnderWaterSwitch sensor.setLodLink(lodStateLink) sensor.setLodSettings( shared_components.LodSettings(WATER_SENSOR_LOD_DIST, WATER_SENSOR_MAX_PRIORITY)) return sensor
def assembleSimpleTracks(vehicleDesc, fashion, wheelsDataProvider, tracks): tracksCfg = vehicleDesc.chassis.tracks if tracksCfg is None: return else: leftTracks = [] rightTracks = [] for i in xrange(len(tracksCfg.trackPairs)): left = (Vehicular.SimpleTrack, True, i, tracksCfg.trackPairs[i].leftMaterial, fashion, wheelsDataProvider, tracksCfg.trackPairs[i].textureScale) right = (Vehicular.SimpleTrack, False, i, tracksCfg.trackPairs[i].rightMaterial, fashion, wheelsDataProvider, tracksCfg.trackPairs[i].textureScale) leftTracks.append(left) rightTracks.append(right) lodSettings = shared_components.LodSettings(_INFINITY, DEFAULT_MAX_LOD_PRIORITY) tracks.addTrackComponent(True, leftTracks, lodSettings) tracks.addTrackComponent(False, rightTracks, lodSettings) return
def createTrackNodesAnimator(appearance, typeDescriptor, lodStateLink=None): trackNodesAnimator = None try: compoundModel = appearance.compoundModel wheelsDataProvider = appearance.wheelsAnimator trackNodesConfig = typeDescriptor.chassis.trackNodes trackSplineParams = typeDescriptor.chassis.trackSplineParams if not trackNodesConfig: return trackNodesAnimator = appearance.createComponent(Vehicular.TrackNodesAnimator, compoundModel, TankNodeNames.HULL_SWINGING) if trackSplineParams is not None: trackNodesAnimator.setParameters(trackSplineParams.thickness, trackSplineParams.gravity, trackSplineParams.maxAmplitude, trackSplineParams.maxOffset) for trackNode in trackNodesConfig.nodes: leftSibling = '' if trackNode.leftNodeName is None else trackNode.leftNodeName rightSibling = '' if trackNode.rightNodeName is None else trackNode.rightNodeName trackNodesAnimator.addTrackNode(trackNode.name, trackNode.isLeft, trackNode.initialOffset, leftSibling, rightSibling, (trackNode.damping, trackNode.elasticity, trackNode.forwardElasticityCoeff, trackNode.backwardElasticityCoeff)) trackNodesAnimator.setWheelsDataProvider(wheelsDataProvider) trackNodesAnimator.setLodLink(lodStateLink) trackNodesAnimator.setLodSettings(shared_components.LodSettings(typeDescriptor.chassis.chassisLodDistance, DEFAULT_MAX_LOD_PRIORITY)) return trackNodesAnimator except BigWorld.AssetException: _logger.error('Failed to create TrackNodesAnimator', exc_info=True) if trackNodesAnimator is not None: appearance.removeComponent(trackNodesAnimator) return return
def createWheelsAnimator(compoundModel, typeDescriptor, splineTracks, f=None, lodStateLink=None): wheelsConfig = typeDescriptor.chassis.wheels wheelsAnimator = Vehicular.WheelsAnimator(compoundModel) for group in wheelsConfig.groups: nodes = _createNodeNameListByTemplate(group.startIndex, group.template, group.count) wheelsAnimator.addWheelGroup(group.isLeft, group.radius, nodes) for wheel in wheelsConfig.wheels: wheelsAnimator.addWheel(wheel.isLeft, wheel.radius, wheel.nodeName, wheel.isLeading, wheel.leadingSyncAngle) if splineTracks is not None: wheelsAnimator.setSplineTrackMovementData(splineTracks.left, splineTracks.right) wheelsAnimator.setLodLink(lodStateLink) wheelsAnimator.setLodSettings( shared_components.LodSettings(typeDescriptor.chassis.wheels.lodDist, DEFAULT_MAX_LOD_PRIORITY)) if f is not None: wheelsAnimator.setMovementInfo(f.movementInfo) return wheelsAnimator
def assembleCollisionObstaclesCollector(appearance, lodStateLink, desc): isWheeledVehicle = 'wheeledVehicle' in desc.type.tags collisionObstaclesCollector = appearance.createComponent(Vehicular.CollisionObstaclesCollector, appearance.compoundModel, isWheeledVehicle) if lodStateLink is not None: collisionObstaclesCollector.setLodLink(lodStateLink) collisionObstaclesCollector.setLodSettings(shared_components.LodSettings(appearance.typeDescriptor.chassis.chassisLodDistance, DEFAULT_MAX_LOD_PRIORITY)) appearance.collisionObstaclesCollector = collisionObstaclesCollector return
def createSuspension(appearance, vehicleDescriptor, lodStateLink): suspension = None try: compoundModel = appearance.compoundModel collisionObstaclesCollector = appearance.collisionObstaclesCollector tessellationCollisionSensor = appearance.tessellationCollisionSensor wheelsDataProvider = appearance.wheelsAnimator groundNodesConfig = vehicleDescriptor.chassis.groundNodes groundNodeGroups = groundNodesConfig.groups groundNodes = groundNodesConfig.nodes hasGroundNodes = len(groundNodeGroups) or len(groundNodes) if not hasGroundNodes: return siegeSwitchOnTime = 0.0 siegeSwitchOffTime = 0.0 if vehicleDescriptor.type.siegeModeParams is not None: siegeSwitchOnTime = vehicleDescriptor.type.siegeModeParams['switchOnTime'] siegeSwitchOffTime = vehicleDescriptor.type.siegeModeParams['switchOffTime'] if vehicleDescriptor.isWheeledVehicle: siegeSwitchOnTime = siegeSwitchOffTime = __getWheelsRiseTime(vehicleDescriptor) suspension = appearance.createComponent(Vehicular.Suspension, compoundModel, tessellationCollisionSensor, wheelsDataProvider, TankPartIndexes.CHASSIS, siegeSwitchOnTime, siegeSwitchOffTime, groundNodesConfig.activePostmortem, vehicleDescriptor.isWheeledVehicle) for groundGroup in groundNodeGroups: nodes = _createNameListByTemplate(groundGroup.startIndex, groundGroup.nodesTemplate, groundGroup.nodesCount) wheels = [''] if groundGroup.affectedWheelsTemplate is not None: wheels = _createNameListByTemplate(groundGroup.startIndex, groundGroup.affectedWheelsTemplate, groundGroup.nodesCount) suspension.addGroundNodesGroup(nodes, groundGroup.isLeft, groundGroup.minOffset, groundGroup.maxOffset, wheels, groundGroup.collisionSamplesCount, groundGroup.hasLiftMode) for groundNode in groundNodes: suspension.addGroundNode(groundNode.nodeName, groundNode.isLeft, groundNode.minOffset, groundNode.maxOffset, groundNode.affectedWheelName, groundNode.collisionSamplesCount, groundNode.hasLiftMode) if vehicleDescriptor.chassis.trackSplineParams is not None: trackSplineParams = vehicleDescriptor.chassis.trackSplineParams suspension.setParameters(trackSplineParams.thickness) else: suspension.setParameters(0.0) suspension.setLodLink(lodStateLink) lodSettings = groundNodesConfig.lodSettings if lodSettings is None: lodSettings = shared_components.LodSettings(vehicleDescriptor.chassis.chassisLodDistance, DEFAULT_MAX_LOD_PRIORITY) suspension.setLodSettings(lodSettings) suspension.setCollisionObstaclesCollector(collisionObstaclesCollector) collisionObstaclesCollector.setActivePostmortem(groundNodesConfig.activePostmortem) tessellationCollisionSensor.setActivePostmortem(groundNodesConfig.activePostmortem) return suspension except BigWorld.AssetException: _logger.error('Failed to create Suspension', exc_info=True) if suspension is not None: appearance.removeComponent(suspension) return return
def assembleTessellationCollisionSensor(appearance, lodStateLink): tessellationCollisionSensor = Vehicular.TessellationCollisionSensor(appearance.compoundModel, TankPartIndexes.CHASSIS) if lodStateLink is not None: tessellationCollisionSensor.setLodLink(lodStateLink) tessellationCollisionSensor.setLodSettings(shared_components.LodSettings(appearance.typeDescriptor.chassis.wheels.lodDist, DEFAULT_MAX_LOD_PRIORITY)) groundNodesConfig = appearance.typeDescriptor.chassis.groundNodes groundNodeGroups = groundNodesConfig.groups groundNodes = groundNodesConfig.nodes hasGroundNodes = len(groundNodeGroups) or len(groundNodes) if not hasGroundNodes: tessellationCollisionSensor.disable() appearance.tessellationCollisionSensor = tessellationCollisionSensor return
def assembleCollisionObstaclesCollector(appearance, lodStateLink): collisionObstaclesCollector = Vehicular.CollisionObstaclesCollector(appearance.compoundModel, BigWorld.player().spaceID) if lodStateLink is not None: collisionObstaclesCollector.setLodLink(lodStateLink) collisionObstaclesCollector.setLodSettings(shared_components.LodSettings(appearance.typeDescriptor.chassis.wheels.lodDist, DEFAULT_MAX_LOD_PRIORITY)) groundNodesConfig = appearance.typeDescriptor.chassis.groundNodes groundNodeGroups = groundNodesConfig.groups groundNodes = groundNodesConfig.nodes hasGroundNodes = len(groundNodeGroups) or len(groundNodes) if not hasGroundNodes: collisionObstaclesCollector.disable() appearance.collisionObstaclesCollector = collisionObstaclesCollector return
def assembleCollisionObstaclesCollector(appearance, lodStateLink, desc, spaceID): isWheeledVehicle = 'wheeledVehicle' in desc.type.tags collisionObstaclesCollector = appearance.createComponent(Vehicular.CollisionObstaclesCollector, appearance.compoundModel, spaceID, isWheeledVehicle) if lodStateLink is not None: collisionObstaclesCollector.setLodLink(lodStateLink) collisionObstaclesCollector.setLodSettings(shared_components.LodSettings(appearance.typeDescriptor.chassis.chassisLodDistance, DEFAULT_MAX_LOD_PRIORITY)) groundNodesConfig = appearance.typeDescriptor.chassis.groundNodes groundNodeGroups = groundNodesConfig.groups groundNodes = groundNodesConfig.nodes hasGroundNodes = len(groundNodeGroups) or len(groundNodes) if not hasGroundNodes: collisionObstaclesCollector.disable() appearance.collisionObstaclesCollector = collisionObstaclesCollector return
def assembleTerrainMatKindSensor(appearance, lodStateLink): TERRAIN_MAT_KIND_SENSOR_LOD_DIST = 100.0 TERRAIN_MAT_KIND_SENSOR_MAX_PRIORITY = 15 compoundModel = appearance.compoundModel invertedOrigin = Math.Matrix(compoundModel.matrix) leftNodeMatrix = Math.Matrix(compoundModel.node(TankNodeNames.TRACK_LEFT_MID)) rightNodeMatrix = Math.Matrix(compoundModel.node(TankNodeNames.TRACK_RIGHT_MID)) leftNodeMatrix.postMultiply(invertedOrigin) rightNodeMatrix.postMultiply(invertedOrigin) scanLength = 4.0 offset = Math.Vector3(0.0, scanLength * 0.5, 0.0) localPoints = (leftNodeMatrix.translation + offset, rightNodeMatrix.translation + offset, Math.Vector3(0.0, 0.0, 0.0) + offset) sensor = appearance.terrainMatKindSensor = Vehicular.TerrainMatKindSensor(compoundModel.root, localPoints, scanLength, BigWorld.player().spaceID) sensor.setLodLink(lodStateLink) sensor.setLodSettings(shared_components.LodSettings(TERRAIN_MAT_KIND_SENSOR_LOD_DIST, TERRAIN_MAT_KIND_SENSOR_MAX_PRIORITY))
def assembleSplineTracks(vehicleDesc, appearance, splineTracksImpl, tracks): if splineTracksImpl is None: return else: lodDist = vehicleDesc.chassis.splineDesc.lodDist lodSettings = shared_components.LodSettings(lodDist, _SPLINE_TRACKS_MAX_COUNT) leftSplineTracks = [] rightSplineTracks = [] for left, right in zip(splineTracksImpl[0], splineTracksImpl[1]): leftSplineTracks.append(Vehicular.SplineTrack(appearance.worldID, left, appearance.compoundModel, appearance.wheelsAnimator)) rightSplineTracks.append(Vehicular.SplineTrack(appearance.worldID, right, appearance.compoundModel, appearance.wheelsAnimator)) if leftSplineTracks: tracks.addTrackComponent(True, leftSplineTracks, lodSettings) if rightSplineTracks: tracks.addTrackComponent(False, rightSplineTracks, lodSettings) return
def assembleSimpleTracks(appearance, vehicleDesc, fashion, wheelsDataProvider, tracks): tracksCfg = vehicleDesc.chassis.tracks if tracksCfg is None: return else: leftTracks = [] rightTracks = [] for i in xrange(tracksCfg.pairsCount): left = Vehicular.SimpleTrack(appearance.worldID, True, i, tracksCfg.leftMaterial, fashion, wheelsDataProvider) right = Vehicular.SimpleTrack(appearance.worldID, False, i, tracksCfg.rightMaterial, fashion, wheelsDataProvider) meterToTexScale = tracksCfg.textureScale left.meterToTexScale = meterToTexScale right.meterToTexScale = meterToTexScale leftTracks.append(left) rightTracks.append(right) lodSettings = shared_components.LodSettings(_INFINITY, DEFAULT_MAX_LOD_PRIORITY) tracks.addTrackComponent(True, leftTracks, lodSettings) tracks.addTrackComponent(False, rightTracks, lodSettings) return
def readLodSettings(xmlCtx, section, cache): return shared_components.LodSettings( maxLodDistance=readLodDist(xmlCtx, section, 'lodSettings/maxLodDistance', cache), maxPriority=_xml.readIntOrNone(xmlCtx, section, 'lodSettings/maxPriority'))
import WoT import debug_utils import material_kinds from constants import IS_DEVELOPMENT, IS_EDITOR from soft_exception import SoftException import math_utils from helpers import DecalMap from items.components import shared_components, component_constants from vehicle_systems.vehicle_damage_state import VehicleDamageState from vehicle_systems.tankStructure import getPartModelsFromDesc, getCollisionModelsFromDesc, TankNodeNames, TankPartNames, TankPartIndexes, RenderStates, TankCollisionPartNames from vehicle_systems.components.hull_aiming_controller import HullAimingController DEFAULT_MAX_LOD_PRIORITY = None _INFINITY = 10000 _PHYSICAL_TRACKS_MAX_DISTANCE = 60 _PHYSICAL_TRACKS_MAX_COUNT = 5 _PHYSICAL_TRACKS_LOD_SETTINGS = shared_components.LodSettings(_PHYSICAL_TRACKS_MAX_DISTANCE, _PHYSICAL_TRACKS_MAX_COUNT) _SPLINE_TRACKS_MAX_COUNT = 5 _AREA_LOD_FOR_NONSIMPLE_TRACKS = 50 _WHEEL_TO_TRACE_RATIO = 0.75 _DEFAULT_LOD_INDEX = 0 def __getWheelsRiseTime(vehicleDesc): wheelsRiseTime = 0.0 chassisXPhysics = vehicleDesc.type.xphysics['chassis'][vehicleDesc.chassis.name] if 'wheelRiseSpeed' in chassisXPhysics: wheelRiseSpeed = chassisXPhysics['wheelRiseSpeed'] if wheelRiseSpeed > 0.0: wheelsRiseTime = 1.0 / wheelRiseSpeed return wheelsRiseTime