def readWheelsAndGroups(xmlCtx, section): wheelGroups = [] wheels = [] defSyncAngle = section.readFloat('wheels/leadingWheelSyncAngle', 60) for sname, subsection in _xml.getChildren(xmlCtx, section, 'wheels'): if sname == 'group': ctx = (xmlCtx, 'wheels/group') group = chassis_components.WheelGroup( isLeft=_xml.readBool(ctx, subsection, 'isLeft'), template=intern( _xml.readNonEmptyString(ctx, subsection, 'template')), count=_xml.readInt(ctx, subsection, 'count', 1), startIndex=subsection.readInt('startIndex', 0), radius=_xml.readPositiveFloat(ctx, subsection, 'radius')) wheelGroups.append(group) if sname == 'wheel': ctx = (xmlCtx, 'wheels/wheel') w = chassis_components.Wheel( isLeft=_xml.readBool(ctx, subsection, 'isLeft'), radius=_xml.readPositiveFloat(ctx, subsection, 'radius'), nodeName=intern( _xml.readNonEmptyString(ctx, subsection, 'name')), isLeading=subsection.readBool('isLeading', False), leadingSyncAngle=subsection.readFloat('syncAngle', defSyncAngle)) wheels.append(w) return (tuple(wheelGroups), tuple(wheels))
def readWheelsAndGroups(xmlCtx, section): """Reads sections 'wheels/group' and 'wheels/wheel' for each chassis. :param xmlCtx: tuple(root ctx or None, path to section). :param section: instance of DataSection. :return: tuple(sequence of groups, sequence of wheels). """ wheelGroups = [] wheels = [] defSyncAngle = section.readFloat('wheels/leadingWheelSyncAngle', 60) for sname, subsection in _xml.getChildren(xmlCtx, section, 'wheels'): if sname == 'group': ctx = (xmlCtx, 'wheels/group') group = chassis_components.WheelGroup( isLeft=_xml.readBool(ctx, subsection, 'isLeft'), template=_xml.readNonEmptyString(ctx, subsection, 'template'), count=_xml.readInt(ctx, subsection, 'count', 1), startIndex=subsection.readInt('startIndex', 0), radius=_xml.readPositiveFloat(ctx, subsection, 'radius')) wheelGroups.append(group) elif sname == 'wheel': ctx = (xmlCtx, 'wheels/wheel') w = chassis_components.Wheel( isLeft=_xml.readBool(ctx, subsection, 'isLeft'), radius=_xml.readPositiveFloat(ctx, subsection, 'radius'), nodeName=_xml.readNonEmptyString(ctx, subsection, 'name'), isLeading=subsection.readBool('isLeading', False), leadingSyncAngle=subsection.readFloat('syncAngle', defSyncAngle)) wheels.append(w) return (tuple(wheelGroups), tuple(wheels))
def readWheelsAndGroups(xmlCtx, section): wheelGroups = [] wheels = [] wheelId = 0 defSyncAngle = section.readFloat('wheels/leadingWheelSyncAngle', 60) for sname, subsection in _xml.getChildren(xmlCtx, section, 'wheels'): if sname == 'group': ctx = (xmlCtx, 'wheels/group') group = chassis_components.WheelGroup(isLeft=_xml.readBool(ctx, subsection, 'isLeft'), template=intern(_xml.readNonEmptyString(ctx, subsection, 'template')), count=_xml.readInt(ctx, subsection, 'count', 1), startIndex=subsection.readInt('startIndex', 0), radius=_xml.readPositiveFloat(ctx, subsection, 'radius')) wheelGroups.append(group) if sname == 'wheel': from items.vehicles import _readHitTester, _readArmor ctx = (xmlCtx, 'wheels/wheel[{}]'.format(wheelId)) radiusKey = 'radius' if subsection.has_key('radius') else 'geometry/radius' index = _xml.readIntOrNone(ctx, subsection, 'index') actualIndex = wheelId if index is None else index w = chassis_components.Wheel(index=index, isLeft=_xml.readBool(ctx, subsection, 'isLeft'), radius=_xml.readPositiveFloat(ctx, subsection, radiusKey), nodeName=intern(_xml.readNonEmptyString(ctx, subsection, 'name')), isLeading=subsection.readBool('isLeading', False), leadingSyncAngle=subsection.readFloat('syncAngle', defSyncAngle), hitTesterManager=_readHitTester(ctx, subsection, 'hitTester', optional=True), materials=_readArmor(ctx, subsection, 'armor', optional=True, index=actualIndex), position=subsection.readVector3('wheelPos', (0, 0, 0))) if IS_EDITOR: w.editorData.defSyncAngle = defSyncAngle wheels.append(w) wheelId += 1 wheelIndices = [ wheel.index for wheel in wheels ] if sorted(wheelIndices) == range(len(wheels)): sortedWheels = [None] * len(wheels) for wheel in wheels: sortedWheels[wheel.index] = wheel wheels = sortedWheels elif wheelIndices == [None] * len(wheels): pass else: LOG_ERROR('Invalid wheel index detected', xmlCtx, wheels) return (tuple(wheelGroups), tuple(wheels))
def apply(vDesc, modelDesc, modelsSet): for key in chassis_params: obj = copy.deepcopy(modelDesc['chassis'][key]) if key == 'traces': obj['size'] = tuple(obj['size']) obj = cc.Traces(**obj) elif key == 'tracks': obj = cc.TrackBasicParams(**obj) elif key == 'wheels': obj = cc.WheelsConfig(groups=tuple(cc.WheelGroup(**d) for d in obj['groups']), wheels=tuple(cc.Wheel(**d) for d in obj['wheels'])) elif key == 'groundNodes': obj = NodesAndGroups(nodes=tuple(cc.GroundNode(**d) for d in obj['nodes']), groups=tuple(cc.GroundNodeGroup(**d) for d in obj['groups']), activePostmortem=obj['activePostmortem'], lodSettings=obj['lodSettings']) elif key == 'trackNodes': obj = NodesAndGroups(nodes=tuple(cc.TrackNode(**d) for d in obj['nodes']), groups=(), activePostmortem=obj['activePostmortem'], lodSettings=obj['lodSettings']) elif key == 'splineDesc': obj = cc.SplineConfig(({modelsSet: cc.SplineSegmentModelSet(**obj['segmentModelSets'])} or None), **{k: v for k, v in obj.items() if k != 'segmentModelSets'}) elif key == 'trackSplineParams': obj = cc.TrackSplineParams(**obj) elif key == 'leveredSuspension': if obj is not None: obj = cc.LeveredSuspensionConfig(([cc.SuspensionLever(**d) for d in obj['levers']] or None), **{k: v for k, v in obj.items() if k != 'levers'}) setattr(vDesc.chassis, key, obj) vDesc.chassis.chassisLodDistance = modelDesc['chassis']['chassisLodDistance'] vDesc.chassis.physicalTracks = {} if modelDesc['chassis']['AODecals']: AODecalsOffset = vDesc.chassis.hullPosition - Math.Vector3(*modelDesc['chassis']['hullPosition']) vDesc.chassis.AODecals = copy.deepcopy(modelDesc['chassis']['AODecals']) vDesc.chassis.AODecals[0].setElement(3, 1, AODecalsOffset.y) exclMask = modelDesc['common']['camouflage']['exclusionMask'] vDesc.type.camouflage = Camouflage( modelDesc['common']['camouflage']['tiling'] if exclMask else vDesc.type.camouflage.tiling, exclMask, None, None) for partName in TankPartNames.ALL: part = getattr(vDesc, partName) models = part.modelsSets[modelsSet] part.modelsSets[modelsSet] = ModelStatesPaths(modelDesc[partName]['undamaged'], models.destroyed, models.exploded) part.models = part.modelsSets['default'] part.emblemSlots = tuple(modelDesc[partName]['emblemSlots']) if partName == 'chassis': continue camoData = modelDesc[partName]['camouflage'] exclMask = camoData['exclusionMask'] if exclMask: part.camouflage = Camouflage(camoData['tiling'], exclMask, None, None) vDesc.gun.drivenJoints = modelDesc['gun']['drivenJoints'] exhaust = modelDesc['hull']['exhaust'] for effectDesc in vDesc.hull.customEffects: if exhaust['nodes']: effectDesc.nodes[:] = exhaust['nodes'] effectDesc._selectorDesc = g_cache._customEffects['exhaust'].get(exhaust['pixie'], effectDesc._selectorDesc) nationID = vDesc.type.id[0] for partName, cacheName, cacheIDs in ( ('chassis', 'chassis', 'chassisIDs'), ('engine', 'engines', 'engineIDs'), ('gun', 'guns', 'gunIDs')): soundID = modelDesc[partName].get('soundID') if soundID: part = getattr(vDesc, partName) pickFrom = getattr(g_cache, cacheName)(nationID).get(getattr(g_cache, cacheIDs)(nationID).get(soundID)) if pickFrom is not None: if partName != 'gun': part.sounds = pickFrom.sounds else: part.effects = pickFrom.effects part.reloadEffect = pickFrom.reloadEffect