NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

staticParticleField.py (6636B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\evegraphics\environments\staticParticleField.py
      2 from __future__ import absolute_import
      3 import evetypes
      4 import trinity
      5 import geo2
      6 from fsdBuiltData.client.groupGraphics import GetColorFromTypeID
      7 from evegraphics.environments import BaseEnvironmentObject
      8 import evegraphics.settings as gfxsettings
      9 import logging
     10 log = logging.getLogger(__name__)
     11 
     12 class AddObjectError(Exception):
     13 
     14     def __init__(self, message):
     15         self.message = message
     16 
     17     def __str__(self):
     18         return self.message
     19 
     20 
     21 def AddClientBall(pos):
     22     from .environmentManager import EnvironmentManager
     23     if EnvironmentManager.BALLPARK_MODE:
     24         from tacticalNavigation.ballparkFunctions import AddClientBall
     25         return AddClientBall(pos)
     26 
     27 
     28 class StaticParticleField(BaseEnvironmentObject):
     29 
     30     def __init__(self, meshFile, maxParticleCount, particleMinSize, particleMaxSize, density, staticClusters):
     31         super(StaticParticleField, self).__init__()
     32         self.clusterBalls = []
     33         self.staticParticleField = None
     34         self.meshFile = meshFile
     35         self.maxParticleCount = maxParticleCount
     36         self.particleMinSize = particleMinSize
     37         self.particleMaxSize = particleMaxSize
     38         self.density = density
     39         self.staticClusters = staticClusters
     40 
     41     def Setup(self):
     42         log.debug("Setting up static particle field '%s'" % self.meshFile)
     43         self.staticParticleField = trinity.EveSceneStaticParticles()
     44         self.staticParticleField.mesh = self.Load(self.meshFile)
     45         self.staticParticleField.maxParticleCount = self.maxParticleCount
     46         self.staticParticleField.maxSize = self.particleMaxSize
     47         self.staticParticleField.minSize = self.particleMinSize
     48         self.staticParticleField.clusterParticleDensity = self.density
     49         for curve in self.environmentTranslationCurves:
     50             curvePosition = (curve.x, curve.y, curve.z)
     51             for i, cluster in self.staticClusters.iteritems():
     52                 positions = []
     53                 radius = cluster.radius
     54                 if radius <= 0.0:
     55                     return
     56                 if cluster.position is not None:
     57                     positions = [(cluster.position.x, cluster.position.y, cluster.position.z)]
     58                 elif cluster.modelLocatorSetName:
     59                     if not hasattr(curve, 'GetModel'):
     60                         return
     61                     model = curve.GetModel()
     62                     if model is None:
     63                         return
     64                     locatorSet = model.locatorSets.FindByName(cluster.modelLocatorSetName)
     65                     if locatorSet is not None:
     66                         modelRotation = geo2.MatrixRotationQuaternion(getattr(model.rotationCurve, 'currentValue', (0, 0, 0, 1)))
     67                         for location in locatorSet.locators:
     68                             pos = geo2.Vec3Transform(location[0], modelRotation)
     69                             positions.append(pos)
     70 
     71                     else:
     72                         log.warning("Could not find locator with name '%s' on for environment", cluster.modelLocatorSetName)
     73                 for position in positions:
     74                     pos = map(sum, zip(curvePosition, position))
     75                     ball = AddClientBall(pos)
     76                     self.AddCluster(pos, radius, cluster.color, cluster.baseColor, ball)
     77 
     78     def IsDisabled(self):
     79         return gfxsettings.Get(gfxsettings.UI_ASTEROID_ATMOSPHERICS) == 0
     80 
     81     def IsReady(self):
     82         return self.staticParticleField is not None
     83 
     84     def ApplyToScene(self):
     85         if self.IsDisabled():
     86             return
     87         self.RebuildParticleField()
     88         self.scene.staticParticles.append(self.staticParticleField)
     89 
     90     def AddObjects(self, environmentObjects):
     91         addedObject = False
     92         for environmentObject in environmentObjects:
     93             groupID = evetypes.GetGroupID(environmentObject.typeID)
     94             for _, staticCluster in self.staticClusters.iteritems():
     95                 if groupID in staticCluster.groupIdFilter:
     96                     addedObject = True
     97                     color = getattr(staticCluster, 'color', None)
     98                     color = color or GetColorFromTypeID(environmentObject.typeID, (1.0, 1.0, 1.0, 1.0))
     99                     baseColor = tuple(staticCluster.baseColor)
    100                     ball = getattr(environmentObject, 'ball', None)
    101                     if ball:
    102                         ball = environmentObject.ball
    103                         if ball.GetModel() is not None:
    104                             radius = max(ball.radius, ball.GetModel().boundingSphereRadius)
    105                         else:
    106                             radius = ball.radius
    107                         self.clusterBalls.append(ball)
    108                     else:
    109                         radius = environmentObject.radius
    110                     self.AddCluster(environmentObject.position, radius, color, baseColor, ball)
    111 
    112         if addedObject:
    113             log.info('Added clusters to environment at position %s', self.environmentPosition)
    114             self.RebuildParticleField()
    115 
    116     def AddCluster(self, worldPosition, radius, color, baseColor, ball):
    117         if self.staticParticleField is None:
    118             return
    119         worldPos = worldPosition
    120         ballID = 0
    121         if ball is None:
    122             ballWorldPosition = [ x + y for x, y in zip(worldPosition, self.environmentPosition) ]
    123             ball = AddClientBall(ballWorldPosition)
    124             if ball is not None:
    125                 worldPos = (ball.x, ball.y, ball.z)
    126                 ballID = ball.id
    127             else:
    128                 worldPos = ballWorldPosition
    129         seed = int(ballID % 123456)
    130         self.staticParticleField.AddCluster(worldPos, radius, color, baseColor, seed)
    131 
    132     def RebuildParticleField(self):
    133         log.debug('Rebuilding particle field')
    134         self.staticParticleField.Rebuild()
    135 
    136     def LinkToDistanceField(self, distanceFieldEnvironmentItem):
    137         for ball in self.clusterBalls:
    138             distanceFieldEnvironmentItem.AddBallToField(ball)
    139 
    140     def TearDown(self):
    141         log.debug('Tearing down static particle field')
    142         if self.staticParticleField is not None:
    143             self.staticParticleField.ClearClusters()
    144             self.staticParticleField.mesh = None
    145             if self.scene and self.staticParticleField in self.scene.staticParticles:
    146                 self.scene.staticParticles.fremove(self.staticParticleField)
    147             del self.staticParticleField
    148             self.staticParticleField = None
    149         self.clusterBalls = []
    150         self.scene = None