From 1e2ea50615fbba2b703e14ca7dd3ab2d40a87c99 Mon Sep 17 00:00:00 2001 From: Jonathan Dunn Date: Wed, 29 Jul 2026 11:48:30 +0000 Subject: [PATCH 1/3] New transform modifiers for Graphite These transform modifiers are a quicker and more convenient way of applying basic transform animations to objects without the need to set up binding and curves Shake - Randomizes the position of an object overtime whilst maintaining an anchor point, have amplitude and frequency controls Rotate - Rotates an object by a set amount each frame --- .../EveChildModifierRotate.cpp | 30 +++++++++++ .../EveChildModifierRotate.h | 26 +++++++++ .../EveChildModifierRotate_Blue.cpp | 17 ++++++ .../EveChildModifierShake.cpp | 53 +++++++++++++++++++ .../EveChildModifierShake.h | 27 ++++++++++ .../EveChildModifierShake_Blue.cpp | 18 +++++++ 6 files changed, 171 insertions(+) create mode 100644 trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate.cpp create mode 100644 trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate.h create mode 100644 trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate_Blue.cpp create mode 100644 trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake.cpp create mode 100644 trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake.h create mode 100644 trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake_Blue.cpp diff --git a/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate.cpp b/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate.cpp new file mode 100644 index 000000000..b7ebaf82d --- /dev/null +++ b/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate.cpp @@ -0,0 +1,30 @@ +// Copyright © 2026 CCP ehf. + +#include "StdAfx.h" +#include "EveChildModifierRotate.h" + +EveChildModifierRotate::EveChildModifierRotate( IRoot* lockobj ) : + m_rotationSpeed( 0.f, 0.f, 0.f ) +{ +} + +EveChildModifierRotate::~EveChildModifierRotate() +{ +} + +Matrix EveChildModifierRotate::ApplyTransform( const Matrix& transform, size_t, const Float4x3* ) const +{ + // Absolute time — never accumulated — so rotation stays stable across frame-time variation. + const double time = TimeAsDouble( BeOS->GetCurrentFrameTime() ); + const float angleX = float( time * double( m_rotationSpeed.x ) ); + const float angleY = float( time * double( m_rotationSpeed.y ) ); + const float angleZ = float( time * double( m_rotationSpeed.z ) ); + + const Matrix localRotation = + RotationXMatrix( angleX ) * + RotationYMatrix( angleY ) * + RotationZMatrix( angleZ ); + + // Right-multiply so the spin is in the object's local axes and translation is preserved. + return transform * localRotation; +} diff --git a/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate.h b/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate.h new file mode 100644 index 000000000..a389df1b5 --- /dev/null +++ b/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate.h @@ -0,0 +1,26 @@ +// Copyright © 2026 CCP ehf. + +#pragma once +#ifndef EveChildModifierRotate_H +#define EveChildModifierRotate_H + +#include "IEveChildTransformModifier.h" + +BLUE_CLASS( EveChildModifierRotate ) : + public IEveChildTransformModifier +{ +public: + EXPOSE_TO_BLUE(); + + EveChildModifierRotate( IRoot* lockobj = NULL ); + ~EveChildModifierRotate(); + + Matrix ApplyTransform( const Matrix& transform, size_t boneCount, const Float4x3* bones ) const; + +private: + Vector3 m_rotationSpeed; +}; + +TYPEDEF_BLUECLASS( EveChildModifierRotate ); + +#endif diff --git a/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate_Blue.cpp b/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate_Blue.cpp new file mode 100644 index 000000000..4e548da81 --- /dev/null +++ b/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate_Blue.cpp @@ -0,0 +1,17 @@ +// Copyright © 2026 CCP ehf. + +#include "StdAfx.h" +#include "EveChildModifierRotate.h" + +BLUE_DEFINE( EveChildModifierRotate ); + +const Be::ClassInfo* EveChildModifierRotate::ExposeToBlue() +{ + EXPOSURE_BEGIN( EveChildModifierRotate, "Rotates an object continuously around its local axes. Angle is recomputed from absolute time each frame so the spin does not drift." ) + MAP_INTERFACE( EveChildModifierRotate ) + MAP_INTERFACE( IEveChildTransformModifier ) + + MAP_ATTRIBUTE( "rotationSpeed", m_rotationSpeed, "Local-axis rotation speed in radians per second (x, y, z).", Be::READWRITE | Be::PERSIST ); + + EXPOSURE_END() +} diff --git a/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake.cpp b/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake.cpp new file mode 100644 index 000000000..4133e9345 --- /dev/null +++ b/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake.cpp @@ -0,0 +1,53 @@ +// Copyright © 2026 CCP ehf. + +#include "StdAfx.h" +#include "EveChildModifierShake.h" +#include "Include/TriMath.h" + +EveChildModifierShake::EveChildModifierShake( IRoot* lockobj ) : + m_frequency( 1.f ), + m_amplitude( 1.f ) +{ +} + +EveChildModifierShake::~EveChildModifierShake() +{ +} + +Matrix EveChildModifierShake::ApplyTransform( const Matrix& transform, size_t, const Float4x3* ) const +{ + // Randomized direction on the sphere + signed radius from multi-octave noise. + // Radius crosses through zero so the offset reaches every signed axis from the origin. + // Absolute time only — never accumulated — so the object cannot drift. + const double time = TimeAsDouble( BeOS->GetCurrentFrameTime() ); + const double seed = double( uintptr_t( this ) & 0xfff ); + const int octaves = 8; + + auto unitNoise = [&]( double phaseOffset ) -> float { + const float n = float( PerlinNoise1D( ( time + seed + phaseOffset ) * double( m_frequency ), 2.0, 2.0, octaves ) ); + // Fold any Perlin range into [0, 1] via a bounded sin so direction sampling stays well-defined. + return 0.5f * ( sinf( n * 17.13f ) + 1.f ); + }; + + const float u = unitNoise( 1.1 ); + const float v = unitNoise( 10.1 ); + const float w = unitNoise( 18.3 ); + + // Uniform-ish direction on the unit sphere (theta azimuth, phi from cos mapping). + const float theta = u * ( 2.f * TRI_PI ); + const float cosPhi = 2.f * v - 1.f; + const float sinPhi = sqrtf( cosPhi * cosPhi > 1.f ? 0.f : ( 1.f - cosPhi * cosPhi ) ); + + // Signed radius in [-amplitude, +amplitude] so motion passes through the origin + // into the opposite octant (up/down, left/right, forward/back). + const float radius = m_amplitude * sinf( w * ( 2.f * TRI_PI ) ); + + const Vector3 offset( + radius * sinPhi * cosf( theta ), + radius * cosPhi, + radius * sinPhi * sinf( theta ) ); + + Matrix result = transform; + result.GetTranslation() += offset; + return result; +} diff --git a/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake.h b/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake.h new file mode 100644 index 000000000..66c24bd10 --- /dev/null +++ b/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake.h @@ -0,0 +1,27 @@ +// Copyright © 2026 CCP ehf. + +#pragma once +#ifndef EveChildModifierShake_H +#define EveChildModifierShake_H + +#include "IEveChildTransformModifier.h" + +BLUE_CLASS( EveChildModifierShake ) : + public IEveChildTransformModifier +{ +public: + EXPOSE_TO_BLUE(); + + EveChildModifierShake( IRoot* lockobj = NULL ); + ~EveChildModifierShake(); + + Matrix ApplyTransform( const Matrix& transform, size_t boneCount, const Float4x3* bones ) const; + +private: + float m_frequency; + float m_amplitude; +}; + +TYPEDEF_BLUECLASS( EveChildModifierShake ); + +#endif diff --git a/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake_Blue.cpp b/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake_Blue.cpp new file mode 100644 index 000000000..0ee22869c --- /dev/null +++ b/trinity/Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake_Blue.cpp @@ -0,0 +1,18 @@ +// Copyright © 2026 CCP ehf. + +#include "StdAfx.h" +#include "EveChildModifierShake.h" + +BLUE_DEFINE( EveChildModifierShake ); + +const Be::ClassInfo* EveChildModifierShake::ExposeToBlue() +{ + EXPOSURE_BEGIN( EveChildModifierShake, "Shakes an object in place with randomized 3D noise around its original transform. Direction covers all axes (positive and negative); offset is recomputed each frame so the object cannot drift." ) + MAP_INTERFACE( EveChildModifierShake ) + MAP_INTERFACE( IEveChildTransformModifier ) + + MAP_ATTRIBUTE( "frequency", m_frequency, "Noise frequency. Higher values produce faster, more turbulent motion.", Be::READWRITE | Be::PERSIST ); + MAP_ATTRIBUTE( "amplitude", m_amplitude, "Maximum displacement from the origin. Motion reaches every direction within this radius, including negative axes.", Be::READWRITE | Be::PERSIST ); + + EXPOSURE_END() +} From 901844897ab9d67269e89b72288bdd4197b3e756 Mon Sep 17 00:00:00 2001 From: Jonathan Dunn Date: Fri, 7 Aug 2026 10:15:50 +0000 Subject: [PATCH 2/3] CMake changes for transform modifiers --- trinity/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/trinity/CMakeLists.txt b/trinity/CMakeLists.txt index dc0e9c6e0..2577fba15 100644 --- a/trinity/CMakeLists.txt +++ b/trinity/CMakeLists.txt @@ -481,9 +481,15 @@ set(_SOURCES Eve/SpaceObject/Children/TransformModifiers/EveChildModifierHaloInverted.cpp Eve/SpaceObject/Children/TransformModifiers/EveChildModifierHaloInverted.h Eve/SpaceObject/Children/TransformModifiers/EveChildModifierHaloInverted_Blue.cpp + Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate.cpp + Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate.h + Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate_Blue.cpp Eve/SpaceObject/Children/TransformModifiers/EveChildModifierSRT.cpp Eve/SpaceObject/Children/TransformModifiers/EveChildModifierSRT.h Eve/SpaceObject/Children/TransformModifiers/EveChildModifierSRT_Blue.cpp + Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake.cpp + Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake.h + Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake_Blue.cpp Eve/SpaceObject/Children/TransformModifiers/EveChildModifierStretch.cpp Eve/SpaceObject/Children/TransformModifiers/EveChildModifierStretch.h Eve/SpaceObject/Children/TransformModifiers/EveChildModifierStretch_Blue.cpp From becd8cd548359fb341888bc0fcac2151ba9d9b80 Mon Sep 17 00:00:00 2001 From: Jonathan Dunn Date: Fri, 7 Aug 2026 14:11:50 +0000 Subject: [PATCH 3/3] Update CMakeLists.txt Added missing references to CMakeLists.txt --- trinity/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/trinity/CMakeLists.txt b/trinity/CMakeLists.txt index dc0e9c6e0..925db9998 100644 --- a/trinity/CMakeLists.txt +++ b/trinity/CMakeLists.txt @@ -481,6 +481,12 @@ set(_SOURCES Eve/SpaceObject/Children/TransformModifiers/EveChildModifierHaloInverted.cpp Eve/SpaceObject/Children/TransformModifiers/EveChildModifierHaloInverted.h Eve/SpaceObject/Children/TransformModifiers/EveChildModifierHaloInverted_Blue.cpp + Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate.cpp + Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate.h + Eve/SpaceObject/Children/TransformModifiers/EveChildModifierRotate_Blue.cpp + Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake.cpp + Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake.h + Eve/SpaceObject/Children/TransformModifiers/EveChildModifierShake_Blue.cpp Eve/SpaceObject/Children/TransformModifiers/EveChildModifierSRT.cpp Eve/SpaceObject/Children/TransformModifiers/EveChildModifierSRT.h Eve/SpaceObject/Children/TransformModifiers/EveChildModifierSRT_Blue.cpp