/// <inheritdoc /> public override unsafe void PatchVertexBuffer(ParticleVertexBuilder vertexBuilder, Vector3 invViewX, Vector3 invViewY, ParticleSorter sorter) { // If you want, you can integrate the base builder here and not call it. It should result in slight speed up base.PatchVertexBuffer(vertexBuilder, invViewX, invViewY, sorter); var colorField = sorter.GetField(ParticleFields.Color); if (!colorField.IsValid()) { return; } var colAttribute = vertexBuilder.GetAccessor(VertexAttributes.Color); if (colAttribute.Size <= 0) { return; } foreach (var particle in sorter) { // Set the vertex color attribute to the particle's color field var color = (uint)(*(Color4 *)particle[colorField]).ToRgba(); vertexBuilder.SetAttributePerParticle(colAttribute, (IntPtr)(&color)); vertexBuilder.NextParticle(); } vertexBuilder.RestartBuffer(); }
/// <inheritdoc /> public unsafe override void PatchVertexBuffer(ParticleVertexBuilder vertexBuilder, Vector3 invViewX, Vector3 invViewY, ParticleSorter sorter) { // If you want, you can implement the base builder here and not call it. It should result in slight speed up base.PatchVertexBuffer(vertexBuilder, invViewX, invViewY, sorter); // The UV Builder, if present, animates the basic (0, 0, 1, 1) uv coordinates of each billboard UVBuilder?.BuildUVCoordinates(vertexBuilder, sorter, vertexBuilder.DefaultTexCoords); vertexBuilder.RestartBuffer(); // If the particles have color field, the base class should have already passed the information if (HasColorField) { return; } // If the particles don't have color field but there is no color stream either we don't need to fill anything var colAttribute = vertexBuilder.GetAccessor(VertexAttributes.Color); if (colAttribute.Size <= 0) { return; } // Since the particles don't have their own color field, set the default color to white var color = 0xFFFFFFFF; foreach (var particle in sorter) { vertexBuilder.SetAttributePerParticle(colAttribute, (IntPtr)(&color)); vertexBuilder.NextParticle(); } vertexBuilder.RestartBuffer(); }
public unsafe override void PatchVertexBuffer(ParticleVertexBuilder vertexBuilder, Vector3 invViewX, Vector3 invViewY, ParticleSorter sorter) { // If you want, you can integrate the base builder here and not call it. It should result in slight speed up base.PatchVertexBuffer(vertexBuilder, invViewX, invViewY, sorter); // Update the non-default coordinates first, because they update off the default ones UVBuilder1?.BuildUVCoordinates(vertexBuilder, sorter, texCoord1); // Update the default coordinates last UVBuilder0?.BuildUVCoordinates(vertexBuilder, sorter, texCoord0); // If the particles have color field, the base class should have already passed the information if (HasColorField) { return; } // If there is no color stream we don't need to fill anything var colAttribute = vertexBuilder.GetAccessor(VertexAttributes.Color); if (colAttribute.Size <= 0) { return; } // Since the particles don't have their own color field, set the default color to white var color = 0xFFFFFFFF; vertexBuilder.RestartBuffer(); foreach (var particle in sorter) { vertexBuilder.SetAttributePerParticle(colAttribute, (IntPtr)(&color)); vertexBuilder.NextParticle(); } vertexBuilder.RestartBuffer(); }