iconGenerator.py (9533B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\cosmetics\client\iconGenerator.py 2 from __future__ import absolute_import 3 import trinity 4 import blue 5 import os 6 import telemetry 7 from iconrendering2.renderers.utils_scene import GetViewAndProjectionUsingBoundingSphere, GetViewAndProjectionUsingMeshGeometry 8 from pytelemetry.zoning import TelemetryContext 9 from trinity.sceneRenderJobSpaceJessica import CreateJessicaSpaceRenderJob 10 from fsdBuiltData.common.graphicIDs import GetGraphicFile 11 from eve.client.script.environment.spaceObject.cosmeticsManager import CosmeticsManager 12 from .liveIconCacheUtils import get_unique_filename 13 _LIGHT_RIG_GRAPHIC_ID = 27583 14 15 class IconGenerator(object): 16 __guid__ = 'form.IconGenerator' 17 __renderObject__ = trinity.Tr2Sprite2d 18 19 def __init__(self, width = 256, height = 256, skin_design = None, bg_texture_path = None): 20 self._scenePath = 'res:/dx9/scene/iconbackground/generic.red' 21 self._scene = None 22 self.object = None 23 self.renderJob = None 24 self._outline_step = None 25 self.width = width 26 self.height = height 27 self._bg_texture_path = bg_texture_path 28 self.skin_design = skin_design 29 self.cachedTexturePath = None 30 self.light_rig = trinity.EveEffectRoot2() 31 32 def __del__(self): 33 self.renderJob = None 34 self._scene = None 35 self.object = None 36 self.light_rig = None 37 self._outline_step = None 38 39 def save_texture_to_disk(self, skin_design, bg_texture_path): 40 fileName = get_unique_filename(skin_design, bg_texture_path) 41 p = fileName.encode('ascii', 'ignore') 42 hostBitmap = trinity.Tr2HostBitmap(self.renderJob.renderTarget) 43 trinity.WaitForResourceLoads() 44 hostBitmap.Save(p) 45 blue.pyos.BeNice() 46 return p 47 48 def create_bg_sprite(self): 49 sprite = trinity.Tr2Sprite2d() 50 sprite.texturePrimary = trinity.Tr2Sprite2dTexture() 51 sprite.displayHeight = 1 52 sprite.displayWidth = 1 53 sprite.displayX = 0 54 sprite.displayY = 0 55 return sprite 56 57 def AddLightRig(self): 58 ligth_rig_resource_path = GetGraphicFile(_LIGHT_RIG_GRAPHIC_ID) 59 light_rig = trinity.Load(ligth_rig_resource_path) 60 if light_rig: 61 self.light_rig.effectChildren.append(light_rig) 62 63 def AdjustLightRig(self, boundingSphereRadius, boundingSphereCenter): 64 lightRigContainer = self.light_rig.effectChildren.FindByName('ShipLights_Scaler') 65 if not lightRigContainer: 66 return 67 lightRigContainer.scaling = (boundingSphereRadius, boundingSphereRadius, boundingSphereRadius) 68 lightRigContainer.translation = (lightRigContainer.translation[0], boundingSphereCenter[1], lightRigContainer.translation[2]) 69 70 def _GetRenderStepPosition(rj, name): 71 for i, each in enumerate(rj.steps): 72 if each.name == name: 73 return i 74 75 return -1 76 77 def create_outline_step(self): 78 step = trinity.Tr2RenderNodeEffect() 79 step.effect = trinity.Tr2Effect() 80 step.effect.effectFilePath = 'res:/graphics/effect/managed/space/system/outline.fx' 81 step.AddSource('BlitSource', self.renderJob.renderDriver) 82 step.AddSource('DepthMap', self.renderJob.renderDriver, 'DepthMap') 83 self.renderJob.executeNode.node = step 84 self._outline_step = step 85 86 @telemetry.ZONE_METHOD 87 def construct_render_job(self): 88 try: 89 self._shaderModel = trinity.GetShaderModel() 90 self._scene = blue.resMan.LoadObject(self._scenePath) 91 if self._scene is None: 92 return 93 blue.pyos.BeNice() 94 self._scene.backgroundRenderingEnabled = False 95 self._scene.sunDiffuseColorWithDynamicLights = (0.2, 0.2, 0.2, 0.2) 96 self._scene.sunDiffuseColor = (0.7, 0.7, 0.7, 0.7) 97 self.AddLightRig() 98 self.renderJob = CreateJessicaSpaceRenderJob() 99 self.renderJob.CreateBasicRenderSteps() 100 self.renderJob.overrideSettings.enableUpscaling = False 101 self.renderJob.overrideSettings.antiAliasingQuality = 0 102 self.renderJob.overrideSettings.postProcessingQuality = 0 103 self.renderJob.overrideSettings.reflectionQuality = 0 104 bgStep = trinity.Tr2RenderNodeSprite2dScene() 105 bg_sprite = self.create_bg_sprite() 106 bgSpriteScene = trinity.Tr2Sprite2dScene() 107 bgSpriteScene.children.append(bg_sprite) 108 bgStep.scene = bgSpriteScene 109 self.renderJob.renderDriver.background = bgStep 110 setattr(self.renderJob, 'backgroundTexture', bg_sprite.texturePrimary) 111 self._scene.useSunDiffuseColorWithDynamicLights = True 112 self.renderJob.SetScene(self._scene) 113 self.create_outline_step() 114 blue.resMan.Wait() 115 finally: 116 trinity.renderJobs.UnscheduleByName('FPS') 117 118 def set_skin_design(self, skin_design): 119 self.skin_design = skin_design 120 self.construct_space_object(skin_design) 121 122 def construct_space_object(self, skin_design): 123 dna_string = CosmeticsManager.CreateSOFDNAfromSkinState(skin_design, skin_design.ship_type_id) 124 space_object = sm.GetService('sofService').spaceObjectFactory.BuildFromDNA(dna_string) 125 trinity.WaitForResourceLoads() 126 CosmeticsManager.UpdatePatternProjectionParametersFromSkinState(skin_design, space_object, typeID=skin_design.ship_type_id) 127 blend_mode = skin_design.slot_layout.pattern_blend_mode 128 if blend_mode is not None: 129 CosmeticsManager.SetBlendMode(space_object, blendMode=blend_mode) 130 self.space_object = space_object 131 self.set_object(self.space_object) 132 133 def attach_render_target(self, render_target): 134 self.renderJob.SetDestinationTarget(render_target) 135 self.renderJob.renderTarget = render_target 136 self.renderJob.Enable(False) 137 138 @telemetry.ZONE_METHOD 139 def set_object(self, object): 140 if self.object: 141 self._scene.objects.fremove(self.object) 142 self.object = object 143 if not object: 144 return 145 with TelemetryContext('initializing'): 146 self._initialize_object() 147 with TelemetryContext('view projection'): 148 aspectRatio = float(self.width) / float(self.height) 149 center = self.object.boundingSphereCenter 150 radius = self.object.boundingSphereRadius 151 translation = trinity.Tr2CurveConstant() 152 translation.value = (0, 153 -0.1 * radius, 154 0, 155 0) 156 self.object.modelTranslationCurve = translation 157 view, projection = GetViewAndProjectionUsingMeshGeometry(self.object.mesh.geometry, scene=self._scene, boundingSphereRadius=radius, boundingSphereCenter=center, aspectRatio=aspectRatio) 158 with TelemetryContext('set camera'): 159 if self.renderJob is not None: 160 self.renderJob.SetActiveCamera(view=view, projection=projection) 161 with TelemetryContext('obj things'): 162 if self._scene is not None: 163 self._scene.objects.removeAt(-1) 164 self._scene.objects.append(self.light_rig) 165 self._scene.objects.append(self.object) 166 self.AdjustLightRig(object.boundingSphereRadius, object.boundingSphereCenter) 167 trinity.WaitForResourceLoads() 168 if self._scene is not None: 169 self._scene.UpdateScene(blue.os.GetTime()) 170 171 def _construct_render_target(self, width, height): 172 self.render_target = trinity.Tr2RenderTarget(width, height, 1, trinity.PIXEL_FORMAT.B8G8R8X8_UNORM) 173 174 @telemetry.ZONE_METHOD 175 def render_icon(self, skin_design, bg_texture_path, render_glow = True): 176 self.bg_texture_path = bg_texture_path 177 self._construct_render_target(self.width, self.height) 178 if self.renderJob is None: 179 return 180 self.attach_render_target(self.render_target) 181 if render_glow: 182 self.renderJob.executeNode.node = self._outline_step 183 else: 184 self.renderJob.executeNode.node = self.renderJob.renderDriver 185 self.renderJob.ScheduleOnce() 186 self.renderJob.ScheduleOnce() 187 self.renderJob.WaitForFinish() 188 blue.synchro.Yield() 189 p = self.save_texture_to_disk(skin_design, bg_texture_path) 190 return p 191 192 @telemetry.ZONE_METHOD 193 def _initialize_object(self): 194 perlinCurves = self.object.Find('trinity.TriPerlinCurve') 195 for curve in perlinCurves: 196 curve.scale = 0.0 197 198 if hasattr(self.object, 'modelRotationCurve'): 199 self.object.modelRotationCurve = None 200 if hasattr(self.object, 'modelTranslationCurve'): 201 self.object.modelTranslationCurve = None 202 if hasattr(self.object, 'rotationCurve'): 203 self.object.rotationCurve = None 204 if hasattr(self.object, 'translationCurve'): 205 self.object.translationCurve = None 206 if hasattr(self.object, 'boosters'): 207 self.object.boosters = None 208 if self._scene is not None: 209 self._scene.gpuParticleSystem = trinity.Tr2GpuParticleSystem() 210 211 @property 212 def bg_texture_path(self): 213 return self._bg_texture_path 214 215 @bg_texture_path.setter 216 def bg_texture_path(self, value): 217 self._bg_texture_path = value 218 if self.renderJob: 219 self.renderJob.backgroundTexture.resPath = value