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

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