Niagara / unreal GDC



Awesome stuff, being able to drive parameters similar to these video examples using frequency and amplitude ranges would be insane. Can’t wait to try this stuff out, keep up the great work.


I got DeltaTime to work by feeding it into Particles.DeltaTime, then adding an if into the evaluation scripts to choose between engine DeltaTime and Particles.Deltatime.

Doesn’t seem to crash for me and it allows writing aswell as an extra bonus :smiley:

Which is cool cause you can do stuff like this.


Ah, good to know! I was using the node version.


Great start. Nice little moment there.


It’s been a weird night. Couldn’t get my math working and ended up surfing with a disco ball.


Speaking of math, what types of math do you guys see being useful to learn given all the extra parameters we’ll have access to in creating our own modules?


Basic vector math, just for being able to write movement modules is probably going to be most prominent.
Transformation matrices.
Dotting for projection, crossing for finding normals and tangents and stuff.
Sine and cosine for rotations.

I think most basic solutions will be part of the kit though, so you’d probably get away with just understanding how it works.


My entire weekend…

Couldn’t get the feature I wanted working. Frustrated as hell. So I had some tequila and found some tentacles…


What were you trying to do that you couldn’t get working?


If anyone wants to try this:

Here is the particle update module:


@FrankFella So I gave Sequencer another crack…(Don’t tell anyone, but it’s my first time using it.) :neutral_face:

The play button has no effect on the system in my level. I’m guessing a n00b to Sequencer issue…


If it’s a blueprint, you probably want to be ingame aswell as have the specific instance of the level sequence running. Try using Simulate instead of play -> select your level sequence in the level -> Press play on that one aswell.


@cannabis.cod3r I think the issue here is that you’re animating parameters in the emitter spawn script. These values will only be evaluated when the component is activated and the emitter starts spawning, you’ll have better luck if you animate values used in one of the update scripts. Another thing to verify is that the user values are changing on the component in the details panel.


Yep, emitter spawn was the problem. Thanks Frank!

I never had a use for Sequencer until now. But OMFG the possibilities this opens up…


Experiment in using Niagara as a drawing brush.

@Simon_Tovey From the level blueprint, is it possible to reach into the Niagara System and get the material assigned under the NiagaraMeshRendererProperties module?


I love how adding a simple curve opens up new opportunities.


That’s not possible right now but something along those lines will be possible on release.
Though I think it more likely that you’d create an MID in your BP and push that into the system as an override in some fashion and drive things that way.
Rather than reaching into the system to pull out a particular material on a particular emitter and a particular renderer.


Added a quick get tangent z method (using my amazing copy and paste skills):

template<typename TransformHandlerType, typename VertexIndexType>
void UNiagaraDataInterfaceStaticMesh::GetVertexTangentZ(FVectorVMContext& Context)
	VertexIndexType VertexIndexParam(Context);
	FUserPtrHandler<FNDIStaticMesh_InstanceData> InstData(Context);

	FRegisterHandler<float> OutPosX(Context);
	FRegisterHandler<float> OutPosY(Context);
	FRegisterHandler<float> OutPosZ(Context);
	FRegisterHandler<float> OutPosW(Context);

	FStaticMeshLODResources& Res = InstData->Mesh->RenderData->LODResources[0];
	const FPositionVertexBuffer& Positions = Res.VertexBuffers.PositionVertexBuffer;

	const int32 NumVerts = Positions.GetNumVertices();
	for (int32 i = 0; i < Context.NumInstances; i++)
		int32 VertexIndex = VertexIndexParam.Get() % NumVerts;
		FQuat Quat = Res.VertexBuffers.StaticMeshVertexBuffer.VertexTangentZ(VertexIndex).Rotation().Quaternion();

		*OutPosX.GetDestAndAdvance() = Quat.X;
		*OutPosY.GetDestAndAdvance() = Quat.Y;
		*OutPosZ.GetDestAndAdvance() = Quat.Z;
		*OutPosW.GetDestAndAdvance() = Quat.W;


Waiting for UE4 to build is like watching paint dry.

What I wouldn’t give for a few extra machines running SN-DBS right now. That would be a wicked home setup. Totally worth it in compile time savings, but try telling that to my wife.

After way too much PUBG and some build problems, I’m back with a quick addition: duplicating radial distributions. I used this trick create the blue tornado.


Annnnnd one more. I felt compelled to go back and do a little…


Disable accumulative transforms: