Esempio n. 1
0
    def attach(self, compoundModel, isDamaged, showDamageStickers):
        for componentName, attachNodeName in VehicleStickers.COMPONENT_NAMES:
            idx = TankPartNames.getIdx(componentName)
            node = compoundModel.node(attachNodeName)
            if node is None:
                continue
            geometryLink = compoundModel.getPartGeometryLink(idx)
            componentStickers = self.__stickers[componentName]
            componentStickers.stickers.attachStickers(geometryLink, node, isDamaged)
            if showDamageStickers:
                for damageSticker in componentStickers.damageStickers.itervalues():
                    if damageSticker.handle is not None:
                        componentStickers.stickers.delDamageSticker(damageSticker.handle)
                        damageSticker.handle = None
                        LOG_WARNING('Adding %s damage sticker to occupied slot' % componentName)
                    damageSticker.handle = componentStickers.stickers.addDamageSticker(damageSticker.stickerID, damageSticker.rayStart, damageSticker.rayEnd)

        if self.__animateGunInsignia:
            gunNode = compoundModel.node(TankNodeNames.GUN_INCLINATION) if isDamaged else compoundModel.node(VehicleStickers.__INSIGNIA_NODE_NAME)
        else:
            gunNode = compoundModel.node(TankNodeNames.GUN_INCLINATION)
        if gunNode is None:
            return
        else:
            gunGeometry = compoundModel.getPartGeometryLink(TankPartIndexes.GUN)
            self.__stickers['gunInsignia'].stickers.attachStickers(gunGeometry, gunNode, isDamaged)
            return
Esempio n. 2
0
 def __setupModel(self, buildIdx):
     self.__assembleModel()
     matrix = math_utils.createSRTMatrix(Math.Vector3(1.0, 1.0, 1.0), Math.Vector3(self.__vEntity.yaw, self.__vEntity.pitch, self.__vEntity.roll), self.__vEntity.position)
     self.__vEntity.model.matrix = matrix
     self.__doFinalSetup(buildIdx)
     self.__vEntity.typeDescriptor = self.__vDesc
     typeDescr = self.__vDesc
     wheelConfig = typeDescr.chassis.generalWheelsAnimatorConfig
     if self.wheelsAnimator is not None and wheelConfig is not None:
         self.wheelsAnimator.createCollision(wheelConfig, self.collisions)
     gunColBox = self.collisions.getBoundingBox(TankPartNames.getIdx(TankPartNames.GUN) + 3)
     center = 0.5 * (gunColBox[1] - gunColBox[0])
     gunoffset = Math.Matrix()
     gunoffset.setTranslate((0.0, 0.0, center.z + gunColBox[0].z))
     gunNode = self.__getGunNode()
     gunLink = math_utils.MatrixProviders.product(gunoffset, gunNode)
     collisionData = ((TankPartNames.getIdx(TankPartNames.CHASSIS), self.__vEntity.model.matrix),
      (TankPartNames.getIdx(TankPartNames.HULL), self.__vEntity.model.node(TankPartNames.HULL)),
      (TankPartNames.getIdx(TankPartNames.TURRET), self.__vEntity.model.node(TankPartNames.TURRET)),
      (TankPartNames.getIdx(TankPartNames.GUN), gunNode))
     self.collisions.connect(self.__vEntity.id, ColliderTypes.VEHICLE_COLLIDER, collisionData)
     collisionData = ((TankPartNames.getIdx(TankPartNames.GUN) + 1, self.__vEntity.model.node(TankPartNames.HULL)), (TankPartNames.getIdx(TankPartNames.GUN) + 2, self.__vEntity.model.node(TankPartNames.TURRET)), (TankPartNames.getIdx(TankPartNames.GUN) + 3, gunLink))
     self.collisions.connect(self.__vEntity.id, self._getColliderType(), collisionData)
     self._reloadColliderType(self.__vEntity.state)
     self.__reloadShadowManagerTarget(self.__vEntity.state)
     return
Esempio n. 3
0
def applyPlayerCache(outfit, vehName, seasonCache):
    itemsCache = dependency.instance(IItemsCache)
    for itemTypeName in seasonCache.keys():
        if itemTypeName not in ('paint', 'modification', 'emblem',
                                'inscription'):
            if itemTypeName != 'camo':
                print '%s: invalid item type in outfit cache for %s:' % (
                    g_config.ID, vehName), itemTypeName
                del seasonCache[itemTypeName]
            continue
        itemDB = items.vehicles.g_cache.customization20().itemTypes[
            C11N_ITEM_TYPE_MAP[GUI_ITEM_TYPE_INDICES[itemTypeName]]]
        for areaName in seasonCache[itemTypeName].keys():
            if itemTypeName == 'modification':
                if areaName != 'misc':
                    print g_config.ID + ': wrong area name for', vehName, 'modification:', areaName
                    del seasonCache[itemTypeName][areaName]
                    continue
                else:
                    areaId = Area.MISC
            else:
                try:
                    areaId = TankPartNames.getIdx(areaName)
                except Exception as e:
                    print g_config.ID + ': exception while reading outfit cache for', vehName, 'in', areaName + ':', e.message
                    continue
            slot = outfit.getContainer(areaId).slotFor(
                GUI_ITEM_TYPE_INDICES[itemTypeName])
            for regionIdx in seasonCache[itemTypeName][areaName].keys():
                itemID = seasonCache[itemTypeName][areaName][regionIdx]
                if not itemID:
                    try:
                        slot.remove(int(regionIdx))
                    except KeyError:  # a paint is being deleted while not applied at all. possible change after last cache
                        del seasonCache[itemTypeName][areaName][
                            regionIdx]  # so we remove an obsolete key
                    continue
                if itemID not in itemDB:
                    print '%s: wrong item ID for %s, idx %s:' % (
                        g_config.ID, areaName, regionIdx), itemID
                    del seasonCache[itemTypeName][areaName][regionIdx]
                    continue
                intCD = itemDB[itemID].compactDescr
                if itemsCache.items.isSynced():
                    item = itemsCache.items.getItemByCD(intCD)
                else:
                    item = itemsCache.items.itemsFactory.createCustomization(
                        intCD)
                slot.set(item, int(regionIdx))
            if not seasonCache[itemTypeName][areaName]:
                del seasonCache[itemTypeName][areaName]
    outfit.invalidate()
    def __startBuild(self, vDesc, vState):
        self.__curBuildInd += 1
        self.__vState = vState
        self.__resources = {}
        self.__vehicleStickers = None
        cfg = hangarCFG()
        if vState == 'undamaged':
            self.__currentEmblemsAlpha = cfg['emblems_alpha_undamaged']
            self.__isVehicleDestroyed = False
        else:
            self.__currentEmblemsAlpha = cfg['emblems_alpha_damaged']
            self.__isVehicleDestroyed = True
        self.__vDesc = vDesc
        resources = camouflages.getCamoPrereqs(self.__outfit, vDesc)
        splineDesc = vDesc.chassis.splineDesc
        if splineDesc is not None:
            resources.append(splineDesc.segmentModelLeft)
            resources.append(splineDesc.segmentModelRight)
            if splineDesc.leftDesc is not None:
                resources.append(splineDesc.leftDesc)
            if splineDesc.rightDesc is not None:
                resources.append(splineDesc.rightDesc)
            if splineDesc.segment2ModelLeft is not None:
                resources.append(splineDesc.segment2ModelLeft)
            if splineDesc.segment2ModelRight is not None:
                resources.append(splineDesc.segment2ModelRight)
        from vehicle_systems import model_assembler
        resources.append(model_assembler.prepareCompoundAssembler(self.__vDesc, ModelsSetParams(self.__outfit.modelsSet, self.__vState), self.__spaceId))
        g_eventBus.handleEvent(CameraRelatedEvents(CameraRelatedEvents.VEHICLE_LOADING, ctx={'started': True,
         'vEntityId': self.__vEntity.id}), scope=EVENT_BUS_SCOPE.DEFAULT)
        cfg = hangarCFG()
        gunScale = Math.Vector3(1.0, 1.0, 1.1)
        capsuleScale = Math.Vector3(1.5, 1.5, 1.5)
        loadedGunScale = cfg.get('cam_capsule_gun_scale', gunScale)
        if loadedGunScale is not None:
            gunScale = loadedGunScale
        loadedCapsuleScale = cfg.get('cam_capsule_scale', capsuleScale)
        if loadedCapsuleScale is not None:
            capsuleScale = loadedCapsuleScale
        bspModels = ((TankPartNames.getIdx(TankPartNames.CHASSIS), vDesc.chassis.hitTester.bspModelName),
         (TankPartNames.getIdx(TankPartNames.HULL), vDesc.hull.hitTester.bspModelName),
         (TankPartNames.getIdx(TankPartNames.TURRET), vDesc.turret.hitTester.bspModelName),
         (TankPartNames.getIdx(TankPartNames.GUN), vDesc.gun.hitTester.bspModelName),
         (TankPartNames.getIdx(TankPartNames.GUN) + 1, vDesc.hull.hitTester.bspModelName, capsuleScale),
         (TankPartNames.getIdx(TankPartNames.GUN) + 2, vDesc.turret.hitTester.bspModelName, capsuleScale),
         (TankPartNames.getIdx(TankPartNames.GUN) + 3, vDesc.gun.hitTester.bspModelName, gunScale))
        collisionAssembler = BigWorld.CollisionAssembler(bspModels, self.__spaceId)
        resources.append(collisionAssembler)
        physicalTracksBuilders = vDesc.chassis.physicalTracks
        for name, builder in physicalTracksBuilders.iteritems():
            resources.append(builder.createLoader('{0}PhysicalTrack'.format(name)))

        BigWorld.loadResourceListBG(tuple(resources), makeCallbackWeak(self.__onResourcesLoaded, self.__curBuildInd))
        return
 def start(self, prereqs=None):
     self.collisions = prereqs['collisionAssembler']
     self.__typeDesc.chassis.hitTester.bbox = self.collisions.getBoundingBox(TankPartNames.getIdx(TankPartNames.CHASSIS))
     self.__typeDesc.hull.hitTester.bbox = self.collisions.getBoundingBox(TankPartNames.getIdx(TankPartNames.HULL))
     self.__typeDesc.turret.hitTester.bbox = self.collisions.getBoundingBox(TankPartNames.getIdx(TankPartNames.TURRET))
     self.__typeDesc.gun.hitTester.bbox = self.collisions.getBoundingBox(TankPartNames.getIdx(TankPartNames.GUN))
     self.__compoundModel = prereqs[self.__typeDesc.name]
     self.__boundEffects = bound_effects.ModelBoundEffects(self.__compoundModel)
     isCurrentModelDamaged = self.__currentDamageState.isCurrentModelDamaged
     fashions = camouflages.prepareFashions(isCurrentModelDamaged)
     if not isCurrentModelDamaged:
         model_assembler.setupTracksFashion(self.__typeDesc, fashions.chassis)
     self.__setFashions(fashions, self.__isTurretDetached)
     self.__setupModels()
     if not isCurrentModelDamaged:
         self.__splineTracks = model_assembler.setupSplineTracks(self.__fashion, self.__typeDesc, self.__compoundModel, prereqs)
         self.crashedTracksController = CrashedTrackController(self.__typeDesc, self.__fashion)
     else:
         self.__trackScrollCtl = None
     if self.__currentDamageState.effect is not None:
         self.__playEffect(self.__currentDamageState.effect, SpecialKeyPointNames.STATIC)
     self.__chassisDecal.create()
     return
    def attach(self,
               compoundModel,
               isDamaged,
               showDamageStickers,
               isDetachedTurret=False):
        for componentName, attachNodeName in self.__componentNames:
            idx = DetachedTurretPartNames.getIdx(
                componentName) if isDetachedTurret else TankPartNames.getIdx(
                    componentName)
            node = compoundModel.node(attachNodeName)
            if node is None:
                continue
            if idx is None:
                node = compoundModel.node(componentName + (
                    '_normal' if not isDamaged else '_destroyed'))
                idx = compoundModel.findPartHandleByNode(node)
            geometryLink = compoundModel.getPartGeometryLink(idx)
            componentStickers = self.__stickers[componentName]
            componentStickers.stickers.attachStickers(geometryLink, node,
                                                      isDamaged)
            if showDamageStickers:
                for damageSticker in componentStickers.damageStickers.itervalues(
                ):
                    if damageSticker.handle is not None:
                        componentStickers.stickers.delDamageSticker(
                            damageSticker.handle)
                        damageSticker.handle = None
                        LOG_WARNING(
                            'Adding %s damage sticker to occupied slot' %
                            componentName)
                    damageSticker.handle = componentStickers.stickers.addDamageSticker(
                        damageSticker.stickerID, damageSticker.rayStart,
                        damageSticker.rayEnd)

        if isDetachedTurret:
            gunGeometry = compoundModel.getPartGeometryLink(
                DetachedTurretPartIndexes.GUN)
        else:
            gunGeometry = compoundModel.getPartGeometryLink(
                TankPartIndexes.GUN)
        for key in set(Insignia.Types.ALL) & set(self.__stickers.keys()):
            gunNode, toPartRoot = self.__getInsigniaAttachNode(
                key, isDamaged, compoundModel)
            if gunNode is None:
                return
            self.__stickers[key].stickers.attachStickers(
                gunGeometry, gunNode, isDamaged, toPartRoot)

        return
Esempio n. 7
0
    def attach(self, compoundModel, isDamaged, showDamageStickers):
        for componentName, attachNodeName in VehicleStickers.COMPONENT_NAMES:
            idx = TankPartNames.getIdx(componentName)
            node = compoundModel.node(attachNodeName)
            if node is None:
                continue
            geometryLink = compoundModel.getPartGeometryLink(idx)
            componentStickers = self.__stickers[componentName]
            componentStickers.stickers.attachStickers(geometryLink, node,
                                                      isDamaged)
            if showDamageStickers:
                for damageSticker in componentStickers.damageStickers.itervalues(
                ):
                    if damageSticker.handle is not None:
                        componentStickers.stickers.delDamageSticker(
                            damageSticker.handle)
                        damageSticker.handle = None
                        LOG_WARNING(
                            'Adding %s damage sticker to occupied slot' %
                            componentName)
                    damageSticker.handle = componentStickers.stickers.addDamageSticker(
                        damageSticker.stickerID, damageSticker.rayStart,
                        damageSticker.rayEnd)

        if isDamaged:
            gunNode = compoundModel.node(TankPartNames.GUN)
        elif self.__animateGunInsignia:
            gunNode = compoundModel.node(
                TankNodeNames.GUN_INCLINATION
            ) if isDamaged else compoundModel.node(
                VehicleStickers.__INSIGNIA_NODE_NAME)
        else:
            gunNode = compoundModel.node(TankNodeNames.GUN_INCLINATION)
        if gunNode is None:
            return
        else:
            gunGeometry = compoundModel.getPartGeometryLink(
                TankPartIndexes.GUN)
            if isDamaged:
                toPartRoot = mathUtils.createIdentityMatrix()
            else:
                toPartRoot = Math.Matrix(gunNode)
                toPartRoot.invert()
                toPartRoot.preMultiply(
                    compoundModel.node(TankNodeNames.GUN_INCLINATION))
            self.__stickers['gunInsignia'].stickers.attachStickers(
                gunGeometry, gunNode, isDamaged, toPartRoot)
            return
Esempio n. 8
0
def setupCollisions(vehicleDesc, collisions):
    hitTestersByPart = {TankPartNames.CHASSIS: vehicleDesc.chassis.hitTester,
     TankPartNames.HULL: vehicleDesc.hull.hitTester,
     TankPartNames.TURRET: vehicleDesc.turret.hitTester,
     TankPartNames.GUN: vehicleDesc.gun.hitTester}
    for partName, hitTester in hitTestersByPart.iteritems():
        partID = TankPartNames.getIdx(partName)
        hitTester.bbox = collisions.getBoundingBox(partID)
        if not hitTester.bbox:
            _logger.error("Couldn't find bounding box for the part '%s' (collisions=%s)", partName, collisions)

    trackPairs = vehicleDesc.chassis.trackPairs[1:]
    for idx, trackPair in enumerate(trackPairs):
        trackPair.hitTester.bbox = collisions.getBoundingBox(trackPairIdxToCollisionIdx(idx))
        if not trackPair.hitTester.bbox:
            _logger.error("Couldn't find bounding box for the track pair '%i' (collisions=%s)", idx, collisions)
 def onAddedSticker(self, shotDamage, damageSticker, transform):
     geometryLink = shotDamage.compound.getPartGeometryLink(
         TankPartNames.getIdx(shotDamage.partName))
     m = Math.Matrix()
     m.setIdentity()
     stickerModel = damageSticker.stickerModel
     stickerModel.setupSuperModel(geometryLink, m)
     node = shotDamage.compound.node(shotDamage.partName)
     node.attach(damageSticker.stickerModel)
     stickerModel.setLODDistance(damageSticker.lodDistance)
     stickerId = vehicles.g_cache.damageStickers['ids'][
         damageSticker.damageSticker]
     segStart = transform.transform.applyPoint(
         Math.Vector3(0, 0, -damageSticker.offset))
     segEnd = transform.transform.applyPoint(
         Math.Vector3(0, 0, damageSticker.offset))
     stickerModel.addDamageSticker(stickerId, segStart, segEnd, True)
     stickerModel.setupFadeout(damageSticker.fadeoutTime)
Esempio n. 10
0
def prepareCollisionAssembler(vehicleDesc, isTurretDetached, worldID):
    hitTestersByPart = {TankPartNames.CHASSIS: vehicleDesc.chassis.hitTester,
     TankPartNames.HULL: vehicleDesc.hull.hitTester}
    if not isTurretDetached:
        hitTestersByPart[TankPartNames.TURRET] = vehicleDesc.turret.hitTester
        hitTestersByPart[TankPartNames.GUN] = vehicleDesc.gun.hitTester
    bspModels = []
    for partName, hitTester in hitTestersByPart.iteritems():
        partId = TankPartNames.getIdx(partName)
        bspModel = (partId, hitTester.bspModelName, (0.0, 0.0, 0.0))
        bspModels.append(bspModel)

    trackPairs = vehicleDesc.chassis.trackPairs[1:]
    for idx, trackPair in enumerate(trackPairs):
        totalDefaultParts = len(TankPartNames.ALL)
        bspModels.append((totalDefaultParts + idx, trackPair.hitTester.bspModelName))

    assembler = BigWorld.CollisionAssembler(tuple(bspModels), worldID)
    return assembler
Esempio n. 11
0
def applyCamoCache(outfit, vehName, seasonCache):
    itemsCache = dependency.instance(IItemsCache)
    camouflages = items.vehicles.g_cache.customization20().camouflages
    applied = False
    cleaned = False
    for areaName in seasonCache.keys():
        try:
            areaId = TankPartNames.getIdx(areaName)
        except Exception as e:
            print g_config.ID + ': exception while reading camouflages cache for', vehName, 'in', areaName + ':', e.message
            continue
        slot = outfit.getContainer(areaId).slotFor(GUI_ITEM_TYPE.CAMOUFLAGE)
        if not seasonCache[areaName]:
            slot.remove(0)
            continue
        camoID, paletteIdx, scale = seasonCache[areaName]
        if camoID not in camouflages:
            print '%s: wrong camouflage ID for %s:' % (g_config.ID,
                                                       areaName), camoID
            del seasonCache[areaName]
            continue
        intCD = camouflages[camoID].compactDescr
        if itemsCache.items.isSynced():
            item = itemsCache.items.getItemByCD(intCD)
        else:
            item = Camouflage(intCD)
        if paletteIdx > len(item.palettes):
            print g_config.ID + ': wrong palette idx for', areaName, 'camouflage:', paletteIdx, '(available: %s)' % range(
                len(item.palettes))
            del seasonCache[areaName]
            continue
        if scale > len(item.scales):
            print g_config.ID + ': wrong scale for', areaName, 'camouflage:', scale, '(available: %s)' % range(
                len(item.scales))
        slot.set(item)
        component = slot.getComponent()
        component.palette = paletteIdx
        component.patternSize = scale
        applied = True
    if not seasonCache:
        cleaned = True
    outfit.invalidate()
    return applied, cleaned
def collideDynamicAndStatic(startPoint,
                            endPoint,
                            exceptIDs,
                            collisionFlags=128,
                            skipGun=False):
    ignoreDynamicID = 0
    if exceptIDs:
        ignoreDynamicID = exceptIDs[0]
    testRes = BigWorld.wg_collideDynamicStatic(
        BigWorld.player().spaceID, startPoint, endPoint, collisionFlags,
        ignoreDynamicID,
        -1 if not skipGun else TankPartNames.getIdx(TankPartNames.GUN))
    if testRes is not None:
        if testRes[1]:
            return (testRes[0],
                    EntityCollisionData(testRes[2], testRes[3], testRes[4],
                                        True))
        return (testRes[0], None)
    else:
        return
Esempio n. 13
0
 def __setupModel(self, buildIdx):
     self.__assembleModel()
     cfg = hangarCFG()
     matrix = mathUtils.createSRTMatrix(
         Math.Vector3(cfg['v_scale'], cfg['v_scale'], cfg['v_scale']),
         Math.Vector3(self.__vEntity.yaw, self.__vEntity.pitch,
                      self.__vEntity.roll), self.__vEntity.position)
     self.__vEntity.model.matrix = matrix
     self.__doFinalSetup(buildIdx)
     self.__vEntity.typeDescriptor = self.__vDesc
     gunColBox = self.collisions.getBoundingBox(
         TankPartNames.getIdx(TankPartNames.GUN) + 3)
     center = 0.5 * (gunColBox[1] - gunColBox[0])
     gunoffset = Math.Matrix()
     gunoffset.setTranslate((0.0, 0.0, center.z + gunColBox[0].z))
     gunLink = mathUtils.MatrixProviders.product(
         gunoffset, self.__vEntity.model.node(TankPartNames.GUN))
     collisionData = ((TankPartNames.getIdx(TankPartNames.CHASSIS),
                       self.__vEntity.model.matrix),
                      (TankPartNames.getIdx(TankPartNames.HULL),
                       self.__vEntity.model.node(TankPartNames.HULL)),
                      (TankPartNames.getIdx(TankPartNames.TURRET),
                       self.__vEntity.model.node(TankPartNames.TURRET)),
                      (TankPartNames.getIdx(TankPartNames.GUN),
                       self.__vEntity.model.node(TankPartNames.GUN)))
     self.collisions.connect(self.__vEntity.id,
                             ColliderTypes.VEHICLE_COLLIDER, collisionData)
     collisionData = ((TankPartNames.getIdx(TankPartNames.GUN) + 1,
                       self.__vEntity.model.node(TankPartNames.HULL)),
                      (TankPartNames.getIdx(TankPartNames.GUN) + 2,
                       self.__vEntity.model.node(TankPartNames.TURRET)),
                      (TankPartNames.getIdx(TankPartNames.GUN) + 3,
                       gunLink))
     self.collisions.connect(self.__vEntity.id,
                             ColliderTypes.HANGAR_VEHICLE_COLLIDER,
                             collisionData)
     self.__reloadColliderType(self.__vEntity.state)
     self.__reloadShadowManagerTarget(self.__vEntity.state)
 def __correctEmblemLookAgainstGun(self, hitPos, dir, up, emblem):
     checkDirWorld = dir * -10.0
     cornersWorld = self.__getEmblemCorners(hitPos, dir, up, emblem)
     result = self.collisions.collideShape(TankPartNames.getIdx(TankPartNames.GUN), (cornersWorld[0],
      cornersWorld[1],
      cornersWorld[2],
      cornersWorld[3]), checkDirWorld)
     if result < 0.0:
         return dir
     dirRot = Math.Matrix()
     angle = _HANGAR_UNDERGUN_EMBLEM_ANGLE_SHIFT
     turretMat = Math.Matrix(self.__vEntity.model.node(TankPartNames.TURRET))
     fromTurretToHit = hitPos - turretMat.translation
     gunDir = turretMat.applyVector(Math.Vector3(0, 0, 1))
     if Math.Vector3(0, 1, 0).dot(gunDir * fromTurretToHit) < 0:
         angle = -angle
     dirRot.setRotateY(angle)
     normRot = Math.Matrix()
     normRot.setRotateYPR((dir.yaw, dir.pitch, 0))
     dirRot.postMultiply(normRot)
     dir = dirRot.applyVector(Math.Vector3(0, 0, 1))
     return dir
Esempio n. 15
0
    def __init__(self, vehicleDesc, insigniaRank=0, outfit=None):
        self.__showEmblemsOnGun = vehicleDesc.turret.showEmblemsOnGun
        self.__defaultAlpha = vehicleDesc.type.emblemsAlpha
        self.__show = True
        self.__animateGunInsignia = vehicleDesc.gun.animateEmblemSlots
        self.__currentInsigniaRank = insigniaRank
        if outfit is None:
            outfit = Outfit()
        componentSlots = ((TankPartNames.HULL, vehicleDesc.hull.emblemSlots),
                          (TankPartNames.GUN if self.__showEmblemsOnGun else
                           TankPartNames.TURRET,
                           vehicleDesc.turret.emblemSlots),
                          (TankPartNames.TURRET
                           if self.__showEmblemsOnGun else TankPartNames.GUN,
                           []), ('gunInsignia', vehicleDesc.gun.emblemSlots))
        self.__stickers = {}
        for componentName, emblemSlots in componentSlots:
            try:
                componentIdx = TankPartNames.getIdx(componentName)
            except Exception:
                componentIdx = -1

            container = outfit.getContainer(componentIdx)
            emblems = None
            inscriptions = None
            if container:
                emblems = container.slotFor(GUI_ITEM_TYPE.EMBLEM)
                inscriptions = container.slotFor(GUI_ITEM_TYPE.INSCRIPTION)
            decals = {
                SlotTypes.PLAYER: emblems,
                SlotTypes.INSCRIPTION: inscriptions
            }
            modelStickers = ModelStickers(vehicleDesc, emblemSlots, decals,
                                          componentName == TankPartNames.HULL,
                                          self.__currentInsigniaRank)
            self.__stickers[componentName] = ComponentStickers(
                modelStickers, {}, 1.0)

        return
    def _connectCollider(self):
        if self.collisions is not None:
            chassisColisionMatrix, gunNodeName = self._vehicleColliderInfo
            if self.isTurretDetached:
                self.collisions.removeAttachment(
                    TankPartNames.getIdx(TankPartNames.TURRET))
                self.collisions.removeAttachment(
                    TankPartNames.getIdx(TankPartNames.GUN))
                collisionData = ((TankPartNames.getIdx(TankPartNames.HULL),
                                  self.compoundModel.node(TankPartNames.HULL)),
                                 (TankPartNames.getIdx(TankPartNames.CHASSIS),
                                  chassisColisionMatrix))
            else:
                collisionData = ((TankPartNames.getIdx(TankPartNames.HULL),
                                  self.compoundModel.node(TankPartNames.HULL)),
                                 (TankPartNames.getIdx(TankPartNames.TURRET),
                                  self.compoundModel.node(
                                      TankPartNames.TURRET)),
                                 (TankPartNames.getIdx(TankPartNames.CHASSIS),
                                  chassisColisionMatrix),
                                 (TankPartNames.getIdx(TankPartNames.GUN),
                                  self.compoundModel.node(gunNodeName)))
            defaultPartLength = len(TankPartNames.ALL)
            additionalChassisParts = []
            trackPairs = self.typeDescriptor.chassis.trackPairs
            if not trackPairs:
                trackPairs = [None]
            for x in xrange(len(trackPairs) - 1):
                additionalChassisParts.append(
                    (defaultPartLength + x, chassisColisionMatrix))

            if additionalChassisParts:
                collisionData += tuple(additionalChassisParts)
            self.collisions.connect(self.id, ColliderTypes.VEHICLE_COLLIDER,
                                    collisionData)
        return
    def __init__(self, vehicleDesc, insigniaRank=0, outfit=None):
        self.__defaultAlpha = vehicleDesc.type.emblemsAlpha
        self.__show = True
        self.__animateGunInsignia = vehicleDesc.gun.animateEmblemSlots
        self.__currentInsigniaRank = insigniaRank
        self.__vDesc = vehicleDesc
        self.__componentNames = [(TankPartNames.HULL, TankPartNames.HULL),
                                 (TankPartNames.TURRET, TankPartNames.TURRET),
                                 (TankPartNames.GUN,
                                  TankNodeNames.GUN_INCLINATION)]
        if outfit is None:
            outfit = Outfit(vehicleCD=vehicleDesc.makeCompactDescr())
        componentSlots = self._createComponentSlots(
            vehicleDesc, vehicleDesc.turret.showEmblemsOnGun, outfit)
        if not isUseDebugStickers():
            self.__stickerPacks = self._createStickerPacks(
                vehicleDesc, outfit, insigniaRank)
        else:
            self.__stickerPacks = self._createDebugStickerPacks(
                vehicleDesc, outfit, insigniaRank)
        self.__stickers = {}
        for componentName, emblemSlots in componentSlots:
            if componentName == Insignia.Types.SINGLE:
                componentIdx = Insignia.Indexes.SINGLE
            elif componentName == Insignia.Types.DUAL_LEFT:
                componentIdx = Insignia.Indexes.DUAL_LEFT
            elif componentName == Insignia.Types.DUAL_RIGHT:
                componentIdx = Insignia.Indexes.DUAL_RIGHT
            else:
                componentIdx = TankPartNames.getIdx(componentName)
            modelStickers = ModelStickers(componentIdx, self.__stickerPacks,
                                          vehicleDesc, emblemSlots)
            self.__stickers[componentName] = ComponentStickers(
                modelStickers, {}, 1.0)

        return
Esempio n. 18
0
def applyOutfitCache(outfit, seasonCache, clean=True):
    itemsCache = dependency.instance(IItemsCache)
    for itemTypeName, itemCache in seasonCache.items():
        itemType = GUI_ITEM_TYPE_INDICES[itemTypeName]
        itemDB = items.vehicles.g_cache.customization20().itemTypes[
            C11N_ITEM_TYPE_MAP[itemType]]
        for areaName, areaCache in itemCache.items():
            areaId = (Area.MISC if areaName == 'misc' else
                      TankPartNames.getIdx(areaName))
            slot = outfit.getContainer(areaId).slotFor(itemType)
            for regionIdx in areaCache.keys():
                itemID = areaCache[regionIdx]['id']
                if itemID is None:
                    if slot.getItem(int(regionIdx)) is not None:
                        slot.remove(int(regionIdx))
                    elif clean:  # item is being deleted while not applied at all. possible change after last cache
                        del areaCache[
                            regionIdx]  # so we remove an obsolete key
                    continue
                if itemID not in itemDB:
                    print g_config.ID + ': wrong item ID for %s, idx %s:' % (
                        areaName, regionIdx), itemID
                    del areaCache[regionIdx]
                    continue
                intCD = itemDB[itemID].compactDescr
                item = (
                    itemsCache.items.getItemByCD
                    if itemsCache.items.isSynced() else
                    itemsCache.items.itemsFactory.createCustomization)(intCD)
                component = emptyComponent(itemType)
                [
                    setattr(component, k, v)
                    for k, v in areaCache[regionIdx].items()
                ]
                slot.set(item, int(regionIdx), component)
    outfit.invalidate()
    def prerequisites(self,
                      typeDescriptor,
                      vID,
                      health=1,
                      isCrewActive=True,
                      isTurretDetached=False,
                      outfitCD=''):
        prereqs = self.__appearance.prerequisites(typeDescriptor, vID, health,
                                                  isCrewActive,
                                                  isTurretDetached, outfitCD)
        compoundAssembler = prepareCompoundAssembler(
            typeDescriptor, self.__appearance.modelsSetParams,
            BigWorld.player().spaceID, isTurretDetached)
        if not isTurretDetached:
            bspModels = ((TankPartNames.getIdx(TankPartNames.CHASSIS),
                          typeDescriptor.chassis.hitTester.bspModelName),
                         (TankPartNames.getIdx(TankPartNames.HULL),
                          typeDescriptor.hull.hitTester.bspModelName),
                         (TankPartNames.getIdx(TankPartNames.TURRET),
                          typeDescriptor.turret.hitTester.bspModelName),
                         (TankPartNames.getIdx(TankPartNames.GUN),
                          typeDescriptor.gun.hitTester.bspModelName))
        else:
            bspModels = ((TankPartNames.getIdx(TankPartNames.CHASSIS),
                          typeDescriptor.chassis.hitTester.bspModelName),
                         (TankPartNames.getIdx(TankPartNames.HULL),
                          typeDescriptor.hull.hitTester.bspModelName))
        collisionAssembler = BigWorld.CollisionAssembler(
            bspModels,
            BigWorld.player().spaceID)
        prereqs += [compoundAssembler, collisionAssembler]
        physicalTracksBuilders = typeDescriptor.chassis.physicalTracks
        for name, builder in physicalTracksBuilders.iteritems():
            prereqs.append(
                builder.createLoader('{0}PhysicalTrack'.format(name)))

        return (compoundAssembler, prereqs)
Esempio n. 20
0
    def __startBuild(self, vDesc, vState):
        self.__curBuildInd += 1
        self.__vState = vState
        self.__resources = {}
        self.__vehicleStickers = None
        cfg = hangarCFG()
        if vState == 'undamaged':
            self.__currentEmblemsAlpha = cfg['emblems_alpha_undamaged']
            self.__isVehicleDestroyed = False
        else:
            self.__currentEmblemsAlpha = cfg['emblems_alpha_damaged']
            self.__isVehicleDestroyed = True
        self.__vDesc = vDesc
        resources = camouflages.getCamoPrereqs(self.__outfit, vDesc)
        if not self.__isVehicleDestroyed:
            self.__attachments = camouflages.getAttachments(self.__outfit, vDesc)
        modelsSet = self.__outfit.modelsSet
        splineDesc = vDesc.chassis.splineDesc
        if splineDesc is not None:
            for _, trackDesc in splineDesc.trackPairs.iteritems():
                resources += trackDesc.prerequisites(modelsSet)

        from vehicle_systems import model_assembler
        resources.append(model_assembler.prepareCompoundAssembler(self.__vDesc, ModelsSetParams(modelsSet, self.__vState, self.__attachments), self.__spaceId))
        g_eventBus.handleEvent(CameraRelatedEvents(CameraRelatedEvents.VEHICLE_LOADING, ctx={'started': True,
         'vEntityId': self.__vEntity.id,
         'intCD': self.__vDesc.type.compactDescr}), scope=EVENT_BUS_SCOPE.DEFAULT)
        cfg = hangarCFG()
        gunScale = Math.Vector3(1.0, 1.0, 1.1)
        capsuleScale = Math.Vector3(1.5, 1.5, 1.5)
        loadedGunScale = cfg.get('cam_capsule_gun_scale', gunScale)
        if loadedGunScale is not None:
            gunScale = loadedGunScale
        loadedCapsuleScale = cfg.get('cam_capsule_scale', capsuleScale)
        if loadedCapsuleScale is not None:
            capsuleScale = loadedCapsuleScale
        hitTesterManagers = {TankPartNames.CHASSIS: vDesc.chassis.hitTesterManager,
         TankPartNames.HULL: vDesc.hull.hitTesterManager,
         TankPartNames.TURRET: vDesc.turret.hitTesterManager,
         TankPartNames.GUN: vDesc.gun.hitTesterManager}
        bspModels = ()
        crashedBspModels = ()
        for partName, htManager in hitTesterManagers.iteritems():
            partId = TankPartNames.getIdx(partName)
            bspModel = (partId, htManager.modelHitTester.bspModelName)
            bspModels = bspModels + (bspModel,)
            if htManager.crashedModelHitTester:
                crashedBspModel = (partId, htManager.crashedModelHitTester.bspModelName)
                crashedBspModels = crashedBspModels + (crashedBspModel,)

        bspModels = bspModels + ((TankPartNames.getIdx(TankPartNames.GUN) + 1, vDesc.hull.hitTesterManager.modelHitTester.bspModelName, capsuleScale), (TankPartNames.getIdx(TankPartNames.GUN) + 2, vDesc.turret.hitTesterManager.modelHitTester.bspModelName, capsuleScale), (TankPartNames.getIdx(TankPartNames.GUN) + 3, vDesc.gun.hitTesterManager.modelHitTester.bspModelName, gunScale))
        if vDesc.hull.hitTesterManager.crashedModelHitTester:
            crashedBspModels = crashedBspModels + ((TankPartNames.getIdx(TankPartNames.GUN) + 1, vDesc.hull.hitTesterManager.crashedModelHitTester.bspModelName, capsuleScale),)
        if vDesc.turret.hitTesterManager.crashedModelHitTester:
            crashedBspModels = crashedBspModels + ((TankPartNames.getIdx(TankPartNames.GUN) + 2, vDesc.turret.hitTesterManager.crashedModelHitTester.bspModelName, capsuleScale),)
        if vDesc.gun.hitTesterManager.crashedModelHitTester:
            crashedBspModels = crashedBspModels + ((TankPartNames.getIdx(TankPartNames.GUN) + 3, vDesc.gun.hitTesterManager.crashedModelHitTester.bspModelName, gunScale),)
        modelCA = BigWorld.CollisionAssembler(bspModels, self.__spaceId)
        modelCA.name = 'ModelCollisions'
        resources.append(modelCA)
        if crashedBspModels:
            crashedModelCA = BigWorld.CollisionAssembler(crashedBspModels, self.__spaceId)
            crashedModelCA.name = 'CrashedModelCollisions'
            resources.append(crashedModelCA)
        physicalTracksBuilders = vDesc.chassis.physicalTracks
        for name, builders in physicalTracksBuilders.iteritems():
            for index, builder in enumerate(builders):
                resources.append(builder.createLoader(self.__spaceId, '{0}{1}PhysicalTrack'.format(name, index), modelsSet))

        BigWorld.loadResourceListBG(tuple(resources), makeCallbackWeak(self.__onResourcesLoaded, self.__curBuildInd))
        return
    def construct(self, isPlayer, resourceRefs):
        self.collisions = resourceRefs['collisionAssembler']
        self.typeDescriptor.chassis.hitTester.bbox = self.collisions.getBoundingBox(TankPartNames.getIdx(TankPartNames.CHASSIS))
        self.typeDescriptor.hull.hitTester.bbox = self.collisions.getBoundingBox(TankPartNames.getIdx(TankPartNames.HULL))
        self.typeDescriptor.turret.hitTester.bbox = self.collisions.getBoundingBox(TankPartNames.getIdx(TankPartNames.TURRET))
        self.typeDescriptor.gun.hitTester.bbox = self.collisions.getBoundingBox(TankPartNames.getIdx(TankPartNames.GUN))
        self.__isObserver = 'observer' in self.typeDescriptor.type.tags
        self._compoundModel = resourceRefs[self.typeDescriptor.name]
        self.__boundEffects = bound_effects.ModelBoundEffects(self.compoundModel)
        isCurrentModelDamaged = self.damageState.isCurrentModelDamaged
        fashions = camouflages.prepareFashions(isCurrentModelDamaged)
        if not isCurrentModelDamaged:
            model_assembler.setupTracksFashion(self.typeDescriptor, fashions.chassis)
        self._setFashions(fashions, self.isTurretDetached)
        self._setupModels()
        if not isCurrentModelDamaged:
            modelsSet = self.outfit.modelsSet
            self._splineTracks = model_assembler.setupSplineTracks(self.fashion, self.typeDescriptor, self.compoundModel, resourceRefs, modelsSet)
            self.crashedTracksController = CrashedTrackController(self.typeDescriptor, self.fashion, modelsSet)
        else:
            self.__trackScrollCtl = None
        self._chassisDecal.create()
        self.__modelAnimators = camouflages.getModelAnimators(self.outfit, self.typeDescriptor, self.worldID, resourceRefs, self.compoundModel)
        if self.modelsSetParams.state == 'undamaged':
            self.__modelAnimators.extend(camouflages.getAttachmentsAnimators(self.__attachments, self.worldID, resourceRefs, self.compoundModel))
        self.transform = self.createComponent(GenericComponents.TransformComponent, Math.Vector3(0, 0, 0))
        self.areaTriggerTarget = self.createComponent(Triggers.AreaTriggerTarget)
        self.__filter = model_assembler.createVehicleFilter(self.typeDescriptor)
        compoundModel = self.compoundModel
        if self.isAlive:
            self.detailedEngineState, self.gearbox = model_assembler.assembleDrivetrain(self, isPlayer)
            if not gEffectsDisabled():
                self.customEffectManager = CustomEffectManager(self)
                if self.typeDescriptor.hasSiegeMode:
                    self.siegeEffects = SiegeEffectsController(self, isPlayer)
                model_assembler.assembleVehicleAudition(isPlayer, self)
                self.detailedEngineState.onEngineStart = self._onEngineStart
                self.detailedEngineState.onStateChanged = self.engineAudition.onEngineStateChanged
            if isPlayer:
                turret = self.typeDescriptor.turret
                gunRotatorAudition = self.createComponent(Vehicular.GunRotatorAudition, turret.turretRotatorSoundManual, turret.weight / 1000.0, compoundModel.node(TankPartNames.TURRET))
                gunRotatorAudition.vehicleMatrixLink = self.compoundModel.root
                gunRotatorAudition.damaged = lambda : self.turretDamaged()
                gunRotatorAudition.maxTurretRotationSpeed = lambda : self.maxTurretRotationSpeed()
                self.gunRotatorAudition = gunRotatorAudition
                self.frictionAudition = self.createComponent(Vehicular.FrictionAudition, TANK_FRICTION_EVENT)
        isLodTopPriority = isPlayer
        lodCalcInst = self.createComponent(Vehicular.LodCalculator, DataLinks.linkMatrixTranslation(compoundModel.matrix), True, VEHICLE_PRIORITY_GROUP, isLodTopPriority)
        self.lodCalculator = lodCalcInst
        self.allLodCalculators.append(lodCalcInst)
        lodLink = DataLinks.createFloatLink(lodCalcInst, 'lodDistance')
        lodStateLink = lodCalcInst.lodStateLink
        if IS_EDITOR:
            matrixBinding = None
            changeCamera = None
        else:
            matrixBinding = BigWorld.player().consistentMatrices.onVehicleMatrixBindingChanged
            changeCamera = BigWorld.player().inputHandler.onCameraChanged
        self.shadowManager = VehicleShadowManager(compoundModel, matrixBinding, changeCamera)
        if not self.damageState.isCurrentModelDamaged:
            self.__assembleNonDamagedOnly(resourceRefs, isPlayer, lodLink, lodStateLink)
            dirtEnabled = BigWorld.WG_dirtEnabled() and 'HD' in self.typeDescriptor.type.tags
            if dirtEnabled and self.fashions is not None:
                dirtHandlers = [BigWorld.PyDirtHandler(True, compoundModel.node(TankPartNames.CHASSIS).position.y),
                 BigWorld.PyDirtHandler(False, compoundModel.node(TankPartNames.HULL).position.y),
                 BigWorld.PyDirtHandler(False, compoundModel.node(TankPartNames.TURRET).position.y),
                 BigWorld.PyDirtHandler(False, compoundModel.node(TankPartNames.GUN).position.y)]
                modelHeight, _ = self.computeVehicleHeight()
                self.dirtComponent = self.createComponent(Vehicular.DirtComponent, dirtHandlers, modelHeight)
                for fashionIdx, _ in enumerate(TankPartNames.ALL):
                    self.fashions[fashionIdx].addMaterialHandler(dirtHandlers[fashionIdx])
                    self.fashions[fashionIdx].addTrackMaterialHandler(dirtHandlers[fashionIdx])

        model_assembler.setupTurretRotations(self)
        self.waterSensor = model_assembler.assembleWaterSensor(self.typeDescriptor, self, lodStateLink, self.worldID)
        if self.engineAudition is not None:
            self.engineAudition.setIsUnderwaterInfo(DataLinks.createBoolLink(self.waterSensor, 'isUnderWater'))
            self.engineAudition.setIsInWaterInfo(DataLinks.createBoolLink(self.waterSensor, 'isInWater'))
        self.__postSetupFilter()
        compoundModel.setPartBoundingBoxAttachNode(TankPartIndexes.GUN, TankNodeNames.GUN_INCLINATION)
        camouflages.updateFashions(self)
        model_assembler.assembleCustomLogicComponents(self, self.__attachments, self.__modelAnimators)
        return
Esempio n. 22
0
 def computeVehicleLength(self):
     vehicleLength = 0.0
     if self.collisions is not None:
         hullBB = self.collisions.getBoundingBox(TankPartNames.getIdx(TankPartNames.HULL))
         vehicleLength = abs(hullBB[1][2] - hullBB[0][2])
     return vehicleLength
 def _getBBCenter(tankPartName):
     partIdx = TankPartNames.getIdx(tankPartName)
     boundingBox = Math.Matrix(
         self.__vEntity.model.getBoundsForPart(partIdx))
     bbCenter = boundingBox.applyPoint((0.5, 0.5, 0.5))
     return bbCenter
 def addCameraCollider(self):
     collider = self.collisions
     if collider is not None:
         colliderData = (collider.getColliderID(), (TankPartNames.getIdx(TankPartNames.HULL), TankPartNames.getIdx(TankPartNames.TURRET)))
         BigWorld.appendCameraCollider(colliderData)
     return
 def activate(self):
     if self.__activated or self.__vehicle is None:
         return
     else:
         if self.collisions is not None and self.__vehicle.isTurretDetached:
             self.collisions.removeAttachment(
                 TankPartNames.getIdx(TankPartNames.TURRET))
             self.collisions.removeAttachment(
                 TankPartNames.getIdx(TankPartNames.GUN))
         super(CompoundAppearance, self).activate()
         isPlayerVehicle = self.__vehicle.isPlayerVehicle
         self.__isObserver = 'observer' in self.__typeDesc.type.tags
         player = BigWorld.player()
         self.__originalFilter = self.__vehicle.filter
         self.__vehicle.filter = self.__filter
         self.__vehicle.filter.enableStabilisedMatrix(isPlayerVehicle)
         self.__filter.isStrafing = self.__vehicle.isStrafing
         self.__filter.vehicleCollisionCallback = player.handleVehicleCollidedVehicle
         if isPlayerVehicle and self.collisions is not None:
             colliderData = (self.collisions.getColliderID(),
                             (TankPartNames.getIdx(TankPartNames.HULL),
                              TankPartNames.getIdx(TankPartNames.TURRET)))
             BigWorld.appendCameraCollider(colliderData)
             self.__inSpeedTreeCollision = True
             BigWorld.setSpeedTreeCollisionBody(
                 self.__compoundModel.getBoundsForPart(
                     TankPartIndexes.HULL))
         self.__linkCompound()
         if not self.__isObserver:
             self.__chassisDecal.attach()
         self.__createAndAttachStickers()
         if self.__currentDamageState.isCurrentModelDamaged:
             self.__chassisColisionMatrix.target = self.__compoundModel.matrix
             gunNodeName = 'gun'
         else:
             self.__chassisColisionMatrix.target = self.__vehicle.filter.groundPlacingMatrix
             gunNodeName = TankNodeNames.GUN_INCLINATION
         if not self.__isObserver:
             self.__startSystems()
         self.setupGunMatrixTargets()
         if not self.__isObserver:
             self.__vehicle.filter.enableLagDetection(
                 not self.__currentDamageState.isCurrentModelDamaged)
         self.onModelChanged()
         if self.lodCalculator is not None:
             self.lodCalculator.setupPosition(
                 DataLinks.linkMatrixTranslation(
                     self.__compoundModel.matrix))
         if hasattr(self.filter, 'placingCompensationMatrix'
                    ) and self.swingingAnimator is not None:
             self.swingingAnimator.placingCompensationMatrix = self.filter.placingCompensationMatrix
             self.swingingAnimator.worldMatrix = self.__compoundModel.matrix
         if not self.__isObserver:
             if self.__periodicTimerID is not None:
                 BigWorld.cancelCallback(self.__periodicTimerID)
             self.__periodicTimerID = BigWorld.callback(
                 _PERIODIC_TIME, self.__onPeriodicTimer)
             self.__dirtUpdateTime = BigWorld.time()
         if self.fashion is not None:
             self.fashion.activate()
         if self.__isObserver:
             self.__compoundModel.visible = False
         BigWorld.player().arena.onPeriodChange += self.__arenaPeriodChanged
         BigWorld.player(
         ).inputHandler.onCameraChanged += self.__onCameraChanged
         if self.detailedEngineState is not None:
             engine_state.checkEngineStart(self.detailedEngineState,
                                           BigWorld.player().arena.period)
         if self.collisions is not None:
             collisionData = ((TankPartNames.getIdx(TankPartNames.HULL),
                               self.compoundModel.node(TankPartNames.HULL)),
                              (TankPartNames.getIdx(TankPartNames.TURRET),
                               self.compoundModel.node(
                                   TankPartNames.TURRET)),
                              (TankPartNames.getIdx(TankPartNames.CHASSIS),
                               self.__chassisColisionMatrix),
                              (TankPartNames.getIdx(TankPartNames.GUN),
                               self.compoundModel.node(gunNodeName)))
             self.collisions.connect(self.id,
                                     ColliderTypes.VEHICLE_COLLIDER,
                                     collisionData)
         self.__activated = True
         return