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