Okay, did some real testing. Created a spell and had it use this script:
Spoiler Scriptname ST_SummonShaderObjectsEffectScript extends activemagiceffect{Summons a variety of objects and applies shader effects to them};--=== Imports ===--Import UtilityImport Game;--=== Properties ===--Actor Property PlayerREF autoHazard Property testHazard AutoActivator Property testActivator AutoWEAPON Property testWeapon AutoPotion Property testPotion AutoSTATIC Property testStatic AutoActorBase Property testActorBase AutoIngredient Property testIngredient AutoMiscObject Property testMiscObject AutoArmor Property testArmor AutoEffectShader Property FireFXShader Auto;--=== Variables ===--Actor PlayerActor testActorObjectReference[] TestObject;--=== Events ===--Event OnInit()Player = PlayerRefTestObject = New ObjectReference[10]EndEventEvent onEffectStart(Actor akTarget, Actor akCaster)Debug.Trace(self + ": Casting began!")testActor = Player.PlaceActorAtMe(testActorBase)TestActor.EnableAI(0)TestActor.MoveTo(Player,-100,100,100)Debug.Notification("Waiting for all objects to load...")TestObject[0] = Player.PlaceAtMe(testHazard,abInitiallyDisabled = True)TestObject[1] = Player.PlaceAtMe(testActivator,abInitiallyDisabled = True)TestObject[2] = Player.PlaceAtMe(testWeapon,abInitiallyDisabled = True)TestObject[3] = Player.PlaceAtMe(testArmor,abInitiallyDisabled = True)TestObject[4] = Player.PlaceAtMe(testStatic,abInitiallyDisabled = True)TestObject[5] = Player.PlaceAtMe(testPotion,abInitiallyDisabled = True)TestObject[6] = Player.PlaceAtMe(testIngredient,abInitiallyDisabled = True)TestObject[7] = Player.PlaceAtMe(testMiscObject,abInitiallyDisabled = True)int i =0While i < TestObject.Length && TestObject[i] != None Debug.Trace(self + ": Moving object " + i) TestObject[i].MoveTo(Player,i * 100,100,100) TestObject[i].Enable(0) Wait(0.01) TestObject[i].SetMotionType(TestObject[i].Motion_Keyframed) i += 1EndWhileWait(2)Debug.Notification("Playing shader on all objects!")FireFXShader.Play(TestActor)i = 0While i < TestObject.Length && TestObject[i] != None Debug.Trace(self + ": Applying shader to object " + i) FireFXShader.Play(TestObject[i]) i += 1EndWhileEndEventEvent onEffectFinish(Actor akTarget, Actor akCaster)Debug.Trace(self + ": Casting ended!")EndEvent;--=== Functions ===--
After trying a couple of different shader effects and several different objects of each type, I've figured out the following:
Actors: Shader effects + particles work every time.
Activators: Very inconsistent. Particles sometimes work on a small piece of the Activator mesh, sometimes there's no particles at all.
Hazards: Most hazards are already full of particle effects. Some, like FXHavokRockHazard, appear to display shader particles, but it is at least as inconsistent as the Activator.
Weapons, Armor, everything else: Membrane shader only, particle effects are completely absent.
Next step is to pull up the meshes for these various objects in NIFscope and see if maybe there's some flag that tells the engine whether to render particle shaders on a given object.