@@ -253,6 +253,11 @@ def export_material(self, bo, bm):
253253 if i + 1 < curr_stencils :
254254 stencil_layer .state .miscFlags |= hsGMatState .kMiscBindNext
255255 hsgmat .addLayer (stencil_layer .key )
256+ if slot .texture .plasma_layer .funky_type != "FunkyNone" :
257+ funky_ramp = self ._export_funky_slot (bo , bm , hsgmat , slot , idx )
258+ if funky_ramp :
259+ tex_layer .state .miscFlags |= hsGMatState .kMiscBindNext
260+ hsgmat .addLayer (funky_ramp .key )
256261
257262 # Plasma makes several assumptions that every hsGMaterial has at least one layer. If this
258263 # material had no Textures, we will need to initialize a default layer
@@ -357,6 +362,93 @@ def export_waveset_material(self, bo, bm):
357362 # Wasn't that easy?
358363 return hsgmat .key
359364
365+ def _export_funky_slot (self , bo , bm , hsgmat , slot , idx ) -> plLayerInterface :
366+ name = "{}_{}_funkRamp" .format (hsgmat .key .name , slot .name )
367+ self ._report .msg ("Exporting Plasma Funky Ramp Layer '{}'" , name , indent = 2 )
368+
369+ texture = slot .texture
370+ layer_props = texture .plasma_layer
371+ funky_type = layer_props .funky_type
372+
373+ near_trans = layer_props .funky_near_trans
374+ near_opaq = layer_props .funky_near_opaq
375+ far_trans = layer_props .funky_far_trans
376+ far_opaq = layer_props .funky_far_opaq
377+
378+ if funky_type != "FunkyDist" :
379+ near_trans = max (min (near_trans , 180.0 ), 0.0 )
380+ near_opaq = max (min (near_opaq , 180.0 ), 0.0 )
381+ far_trans = max (min (far_trans , 180.0 ), 0.0 )
382+ far_opaq = max (min (far_opaq , 180.0 ), 0.0 )
383+
384+ if near_trans > far_trans :
385+ near_trans , far_trans = far_trans , near_trans
386+ near_opaq , far_opaq = far_opaq , near_opaq
387+
388+ if near_trans == near_opaq or far_opaq == far_trans :
389+ return None
390+
391+ additive = near_trans > near_opaq and far_opaq > far_trans
392+
393+ if funky_type != "FunkyDist" :
394+ near_trans = math .cos (near_trans * (math .pi / 180.0 ))
395+ near_opaq = math .cos (near_opaq * (math .pi / 180.0 ))
396+ far_opaq = math .cos (far_opaq * (math .pi / 180.0 ))
397+ far_trans = math .cos (far_trans * (math .pi / 180.0 ))
398+
399+ uvwXfm = hsMatrix44 ()
400+ uvwXfm [0 ,0 ] = uvwXfm [1 ,1 ] = uvwXfm [2 ,2 ] = 0.0
401+
402+ if near_opaq != near_trans :
403+ uvwXfm [0 ,2 ] = - 1.0 / (near_trans - near_opaq )
404+ uvwXfm [0 ,3 ] = uvwXfm [0 ,2 ] * - near_trans
405+ else :
406+ uvwXfm [0 ,3 ] = 1.0
407+
408+ if far_opaq != far_trans :
409+ uvwXfm [1 ,2 ] = - 1.0 / (far_trans - far_opaq )
410+ uvwXfm [1 ,3 ] = uvwXfm [1 ,2 ] * - far_trans
411+ else :
412+ uvwXfm [1 ,3 ] = 1.0
413+
414+ ramp_layer = self ._mgr .find_create_object (plLayer , name = name , bl = bo )
415+
416+ rampName = "FunkyRampAdd" if additive else "FunkyRampMult"
417+ page = self ._mgr .get_textures_page (ramp_layer .key )
418+ ramp_key = self ._mgr .find_key (plMipmap , loc = page , name = rampName )
419+
420+ if ramp_key is None :
421+ funkRamp = plMipmap (rampName , 16 , 16 , 1 , plBitmap .kUncompressed , plBitmap .kRGB8888 )
422+ create_funky_ramp (funkRamp , additive )
423+ self ._mgr .AddObject (page , funkRamp )
424+ ramp_key = funkRamp .key
425+
426+ ramp_layer .texture = ramp_key
427+ ramp_layer .ambient = hsColorRGBA (1.0 , 1.0 , 1.0 , 1.0 )
428+ ramp_layer .preshade = hsColorRGBA (0.0 , 0.0 , 0.0 , 1.0 )
429+ ramp_layer .runtime = hsColorRGBA (0.0 , 0.0 , 0.0 , 1.0 )
430+ ramp_layer .specular = hsColorRGBA (0.0 , 0.0 , 0.0 , 1.0 )
431+
432+ ramp_layer .state .ZFlags = hsGMatState .kZNoZWrite
433+ ramp_layer .state .clampFlags = hsGMatState .kClampTexture
434+ ramp_layer .state .blendFlags = hsGMatState .kBlendAlpha | hsGMatState .kBlendNoTexColor | hsGMatState .kBlendAlphaMult
435+
436+ ramp_layer .transform = uvwXfm
437+
438+ if funky_type == "FunkyDist" :
439+ ramp_layer .UVWSrc = plLayerInterface .kUVWPosition
440+ ramp_layer .state .miscFlags |= hsGMatState .kMiscNoShadowAlpha
441+ elif funky_type == "FunkyNormal" :
442+ ramp_layer .UVWSrc = plLayerInterface .kUVWNormal
443+ elif funky_type == "FunkyUp" :
444+ ramp_layer .UVWSrc = plLayerInterface .kUVWNormal
445+ ramp_layer .state .miscFlags |= hsGMatState .kMiscOrthoProjection
446+ elif funky_type == "FunkyReflect" :
447+ ramp_layer .UVWSrc = plLayerInterface .kUVWReflect
448+
449+ return ramp_layer
450+
451+
360452 def export_bumpmap_slot (self , bo , bm , hsgmat , slot , idx ):
361453 name = "{}_{}" .format (hsgmat .key .name , slot .name )
362454 self ._report .msg ("Exporting Plasma Bumpmap Layers for '{}'" , name , indent = 2 )
0 commit comments