SoTransformSeparator(3)

๐Ÿ“ฆ
version 4.0.10 ยท 4 versions
, in fedora 43, fedora 44

๐ŸŽ€ SoTransformSeparator(3) โ€” Coin ๐ŸŽ€

okay bestie so this is the manual page for SoTransformSeparator, section 3 of the Coin manual, and it is long, so buckle up. This is part 1, and yes there's more coming, so don't wander off ๐Ÿ’…


๐Ÿ’– NAME ๐Ÿ’–

SoTransformSeparator โ€” it's a class that's a group node, and the whole ~thing~ about it is that it preserves the current transformations. That's the vibe. That's the whole assignment. Slay.


โœจ SYNOPSIS โœจ

#include <Inventor/nodes/SoTransformSeparator.h>

It inherits from SoGroup. So everything SoGroup can do, this girl can do too (and more, lowkey). ๐Ÿฆ‹


๐ŸŒธ Public Member Functions ๐ŸŒธ

  • virtual SoType getTypeId (void) const โ€” the type-id getter, and it's virtual, so it knows who it is at runtime. main character energy fr ๐Ÿ’…
  • SoTransformSeparator (void) โ€” the no-args constructor. brand new, no children, fresh start โœจ
  • SoTransformSeparator (int nChildren) โ€” the constructor that takes nChildren, so you can roll in with your child slots already prepped ๐Ÿ‘‘
  • virtual void doAction (SoAction *action) โ€” the generic action hook. it does the action thing.
  • virtual void callback (SoCallbackAction *action) โ€” the callback-action hook.
  • virtual void GLRender (SoGLRenderAction *action) โ€” the render hook, i.e. the one that makes pixels happen ๐ŸŒˆ
  • virtual void pick (SoPickAction *action) โ€” the pick-action hook.
  • virtual void getBoundingBox (SoGetBoundingBoxAction *action) โ€” the bounding-box hook ๐Ÿ“ฆ
  • virtual void getMatrix (SoGetMatrixAction *action) โ€” the matrix hook. matrices are literally the whole personality of this node, iykyk ๐Ÿ”ฅ
  • virtual void getPrimitiveCount (SoGetPrimitiveCountAction *action) โ€” the primitive-counting hook.
  • virtual void audioRender (SoAudioRenderAction *action) โ€” the audio-render hook ๐Ÿ”Š

๐Ÿฆ‹ Public Member Functions inherited from SoGroup ๐Ÿฆ‹

  • SoGroup (void) โ€” constructor, no children.
  • SoGroup (int nchildren) โ€” constructor, with a slot count.
  • virtual void addChild (SoNode *node) โ€” add a child.
  • virtual void insertChild (SoNode *child, int newchildindex) โ€” insert a child at a specific index, very specific of you ๐Ÿ’–
  • virtual SoNode * getChild (int index) const โ€” grab the child at index.
  • virtual int findChild (const SoNode *node) const โ€” find where a given child lives.
  • virtual int getNumChildren (void) const โ€” how many children do we have? the census.
  • virtual void removeChild (int childindex) โ€” yeet the child at childindex.
  • virtual void removeChild (SoNode *child) โ€” yeet a specific child.
  • virtual void removeAllChildren (void) โ€” yeet all of them. clear the whole roster ๐Ÿ’€
  • virtual void replaceChild (int index, SoNode *newchild) โ€” swap by index.
  • virtual void replaceChild (SoNode *oldchild, SoNode *newchild) โ€” swap by pointer. out with the old, in with the new ๐ŸŽ€
  • virtual void handleEvent (SoHandleEventAction *action) โ€” event-handling hook.
  • virtual void search (SoSearchAction *action) โ€” search-action hook.
  • virtual void write (SoWriteAction *action) โ€” write-action hook, for when you gotta save it.
  • virtual SoChildList * getChildren (void) const โ€” hands you the actual child list pointer.
  • virtual void addWriteReference (SoOutput *out, SbBool isfromfield=FALSE) โ€” adds a write reference; note the isfromfield=FALSE default, don't forget it โญ

๐ŸŒˆ Public Member Functions inherited from SoNode ๐ŸŒˆ

  • void setOverride (const SbBool state) โ€” sets the override state.
  • SbBool isOverride (void) const โ€” asks: is it override?
  • void setNodeType (const NodeType type) โ€” sets the node type.
  • NodeType getNodeType (void) const โ€” gets the node type.
  • virtual SoNode * copy (SbBool copyconnections=FALSE) const โ€” makes a copy, with copyconnections=FALSE as the default. careful with those connections bestie ๐Ÿ™ˆ
  • virtual SbBool affectsState (void) const โ€” does it affect state?
  • virtual void GLRenderBelowPath (SoGLRenderAction *action) โ€” render below path.
  • virtual void GLRenderInPath (SoGLRenderAction *action) โ€” render in path.
  • virtual void GLRenderOffPath (SoGLRenderAction *action) โ€” render off path.
  • virtual void rayPick (SoRayPickAction *action) โ€” ray pick hook.
  • virtual void grabEventsSetup (void) โ€” grab-events setup.
  • virtual void grabEventsCleanup (void) โ€” grab-events cleanup.
  • virtual void startNotify (void) โ€” kicks off notification.
  • virtual void notify (SoNotList *l) โ€” the notification itself.
  • SbUniqueId getNodeId (void) const โ€” your node's unique id, like a little name tag ๐Ÿ‘‘
  • virtual void writeInstance (SoOutput *out) โ€” writes this instance out.
  • virtual SoNode * addToCopyDict (void) const โ€” adds itself to the copy dictionary.
  • virtual SoFieldContainer * copyThroughConnection (void) const โ€” copies through a connection.

๐Ÿ’œ Public Member Functions inherited from SoFieldContainer ๐Ÿ’œ

  • void setToDefaults (void) โ€” reset everything to defaults.
  • SbBool hasDefaultValues (void) const โ€” are we all defaults?
  • SbBool fieldsAreEqual (const SoFieldContainer *container) const โ€” do our fields match container's?
  • void copyFieldValues (const SoFieldContainer *container, SbBool copyconnections=FALSE) โ€” copies field values over, with copyconnections=FALSE by default.
  • SbBool set (const char *const fielddata) โ€” set from a field-data string.
  • void get (SbString &fielddata) โ€” get out as a field-data string.
  • virtual int getFields (SoFieldList &l) const โ€” get the fields into l.
  • virtual int getAllFields (SoFieldList &l) const โ€” get all the fields into l.
  • virtual SoField * getField (const SbName &name) const โ€” grab the field called name.
  • virtual SoField * getEventIn (const SbName &name) const โ€” grab the event-in called name.
  • virtual SoField * getEventOut (const SbName &name) const โ€” grab the event-out called name.
  • SbBool getFieldName (const SoField *const field, SbName &name) const โ€” figure out a field's name.
  • SbBool enableNotify (const SbBool flag) โ€” toggle notifications on/off.
  • SbBool isNotifyEnabled (void) const โ€” are notifications enabled?
  • SbBool set (const char *fielddata, SoInput *input) โ€” the SoInput-flavoured set.
  • void get (SbString &fielddata, SoOutput *out) โ€” the SoOutput-flavoured get.
  • virtual SbBool validateNewFieldValue (SoField *field, void *newval) โ€” validate a new value before it lands.
  • SbBool getIsBuiltIn (void) const โ€” is it built in?
  • virtual void getFieldsMemorySize (size_t &managed, size_t &unmanaged) const โ€” reports memory sizes into managed and unmanaged.
  • void setUserData (void *userdata) const โ€” stash your own user data.
  • void * getUserData (void) const โ€” get your own user data back ๐Ÿซถ

๐ŸŽ€ Public Member Functions inherited from SoBase ๐ŸŽ€

  • void ref (void) const โ€” bump the reference count.
  • void unref (void) const โ€” drop the reference count.
  • void unrefNoDelete (void) const โ€” drop the count but no delete. rude to delete, honestly.
  • int32_t getRefCount (void) const โ€” how many refs we got?
  • void touch (void) โ€” touch it. it knows. โœจ
  • SbBool isOfType (SoType type) const โ€” Returns TRUE if the type of this object is either of the same type or inherited from type. so it's giving "am I one of you?" energy.
  • virtual SbName getName (void) const โ€” get the name.
  • virtual void setName (const SbName &newname) โ€” set the name to newname.
  • void addAuditor (void *const auditor, const SoNotRec::Type type) โ€” add an auditor of a given SoNotRec::Type.
  • void removeAuditor (void *const auditor, const SoNotRec::Type type) โ€” remove that auditor.
  • const SoAuditorList & getAuditors (void) const โ€” get the whole auditor list.
  • SbBool shouldWrite (void) โ€” should this be written?
  • void assertAlive (void) const โ€” asserts the object is alive. dramatic but necessary ๐Ÿ’€

โญ Static Public Member Functions โญ

  • static SoType getClassTypeId (void) โ€” the class type id, static version.
  • static void initClass (void) โ€” Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system. so basically it does the admin so you don't have to ๐Ÿ‘‘

โœจ Static Public Member Functions inherited from SoGroup โœจ

  • static SoType getClassTypeId (void) โ€” class type id, static.
  • static void initClass (void) โ€” Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system.

โœจ Static Public Member Functions inherited from SoNode โœจ

  • static uint32_t getCompatibilityTypes (const SoType &nodetype) โ€” compatibility types, as a uint32_t.
  • static SoType getClassTypeId (void) โ€” class type id, static.
  • static SoNode * getByName (const SbName &name) โ€” look a node up by name.
  • static int getByName (const SbName &name, SoNodeList &l) โ€” look nodes up by name into l.
  • static void initClass (void) โ€” Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system.
  • static void initClasses (void) โ€” plural! init all the classes ๐Ÿ’…
  • static SbUniqueId getNextNodeId (void) โ€” hand out the next unique node id.
  • static int getActionMethodIndex (const SoType type) โ€” action method index for type.
  • static void getBoundingBoxS (SoAction *action, SoNode *node) โ€” the S-suffixed static for bounding box.
  • static void GLRenderS (SoAction *action, SoNode *node) โ€” the S-suffixed static for GL render.
  • static void callbackS (SoAction *action, SoNode *node) โ€” the S-suffixed static for callback.
  • static void getMatrixS (SoAction *action, SoNode *node) โ€” the S-suffixed static for matrix.
  • static void handleEventS (SoAction *action, SoNode *node) โ€” the S-suffixed static for handle event.
  • static void pickS (SoAction *action, SoNode *node) โ€” the S-suffixed static for pick.
  • static void rayPickS (SoAction *action, SoNode *node) โ€” the S-suffixed static for ray pick.
  • static void searchS (SoAction *action, SoNode *node) โ€” the S-suffixed static for search.
  • static void writeS (SoAction *action, SoNode *node) โ€” the S-suffixed static for write.
  • static void audioRenderS (SoAction *action, SoNode *node) โ€” the S-suffixed static for audio render.
  • static void getPrimitiveCountS (SoAction *action, SoNode *node) โ€” the S-suffixed static for primitive count.

๐Ÿ’– Static Public Member Functions inherited from SoFieldContainer ๐Ÿ’–

  • static void initClass (void) โ€” Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system.
  • static SoType getClassTypeId (void) โ€” This static method returns the SoType object associated with objects of this class.
  • static void cleanupClass (void) โ€” cleanup time, tidy up bestie ๐Ÿงน
  • static void initCopyDict (void) โ€” init the copy dictionary.
  • static void addCopy (const SoFieldContainer *orig, const SoFieldContainer *copy) โ€” register a copy of orig.
  • static SoFieldContainer * checkCopy (const SoFieldContainer *orig) โ€” check whether orig has a copy.
  • static SoFieldContainer * findCopy (const SoFieldContainer *orig, const SbBool copyconnections) โ€” find the copy of orig, respecting copyconnections.
  • static void copyDone (void) โ€” copying's done, wrap it up โœจ

๐Ÿซถ Static Public Member Functions inherited from SoBase ๐Ÿซถ

  • static void initClass (void) โ€” Sets up initialization for data common to all instances of this class, like submitting necessary information to the Coin type system.
  • static SoType getClassTypeId (void) โ€” This static method returns the SoType object associated with objects of this class.
  • static void addName (SoBase *const base, const char *const name) โ€” give base the name name.
  • static void removeName (SoBase *const base, const char *const name) โ€” take that name away.
  • static void incrementCurrentWriteCounter (void) โ€” bump the current write counter.
  • static void decrementCurrentWriteCounter (void) โ€” drop the current write counter.
  • static SoBase * getNamedBase (const SbName &name, SoType type) โ€” get the named base of a given type.
  • static int getNamedBases (const SbName &name, SoBaseList &baselist, SoType type) โ€” get named bases into baselist.
  • static SbBool read (SoInput *input, SoBase *&base, SoType expectedtype) โ€” read from input, expecting expectedtype.
  • static void setInstancePrefix (const SbString &c) โ€” set the instance prefix to c.
  • static void setTraceRefs (SbBool trace) โ€” toggle reference tracing.
  • static SbBool getTraceRefs (void) โ€” get the reference tracing setting.
  • static SbBool connectRoute (SoInput *input, const SbName &fromnodename, const SbName &fromfieldname, const SbName &tonodename, const SbName &tofieldname) โ€” wire up a route from one node/field to another. matchmaking, but for fields ๐Ÿ’˜
  • static SbBool readRoute (SoInput *input) โ€” read a route in.

๐Ÿซถ Protected Member Functions ๐Ÿซถ

  • virtual const SoFieldData * getFieldData (void) const โ€” the protected field-data getter.
  • virtual ~SoTransformSeparator () โ€” the destructor, and it's virtual. say bye properly ๐Ÿ’…

๐ŸŒธ Protected Member Functions inherited from SoGroup ๐ŸŒธ

  • virtual ~SoGroup () โ€” virtual destructor.
  • virtual SbBool readInstance (SoInput *in, unsigned short flags) โ€” read an instance from in with flags.
  • virtual SbBool readChildren (SoInput *in) โ€” read the children from in.
  • virtual void copyContents (const SoFieldContainer *from, SbBool copyconnections) โ€” copy the contents from from.
  • virtual SoNotRec createNotRec (void) โ€” create a notification record.
  • void setOperation (const SoNotRec::OperationType opType=SoNotRec::UNSPECIFIED, const SoNode *cc=NULL, const SoNode *pc=NULL, const int ci=-1) โ€” set the operation, and look at those defaults: opType=SoNotRec::UNSPECIFIED, cc=NULL, pc=NULL, ci=-1. keep them exactly as written bestie โญ

๐Ÿฆ‹ Protected Member Functions inherited from SoNode ๐Ÿฆ‹

  • SoNode (void) โ€” protected constructor.
  • virtual ~SoNode () โ€” virtual destructor.

๐Ÿ’œ Protected Member Functions inherited from SoFieldContainer ๐Ÿ’œ

  • SoFieldContainer (void) โ€” protected constructor.
  • virtual ~SoFieldContainer () โ€” virtual destructor.

๐ŸŽ€ Protected Member Functions inherited from SoBase ๐ŸŽ€

  • SoBase (void) โ€” protected constructor.
  • virtual ~SoBase () โ€” virtual destructor.
  • virtual void destroy (void) โ€” destroy.
  • SbBool hasMultipleWriteRefs (void) const โ€” does it have multiple write refs?
  • SbBool writeHeader (SoOutput *out, SbBool isgroup, SbBool isengine) const โ€” write the header out.
  • void writeFooter (SoOutput *out) const โ€” write the footer out.
  • virtual const char * getFileFormatName (void) const โ€” get the file format name.

๐Ÿ’… Static Protected Member Functions ๐Ÿ’…

  • static const SoFieldData ** getFieldDataPtr (void) โ€” the static protected field-data pointer getter.

โœจ Static Protected Member Functions inherited from SoGroup โœจ

  • static const SoFieldData ** getFieldDataPtr (void) โ€” same deal, SoGroup edition.

๐ŸŒˆ Static Protected Member Functions inherited from SoNode ๐ŸŒˆ

  • static const SoFieldData ** getFieldDataPtr (void) โ€” same deal, SoNode edition.
  • static void setNextActionMethodIndex (int index) โ€” set the next action method index to index.
  • static int getNextActionMethodIndex (void) โ€” get the next action method index.
  • static void incNextActionMethodIndex (void) โ€” increment it.
  • static void setCompatibilityTypes (const SoType &nodetype, const uint32_t bitmask) โ€” set compatibility types for nodetype using bitmask.

๐Ÿซถ Static Protected Member Functions inherited from SoBase ๐Ÿซถ

  • static uint32_t getCurrentWriteCounter (void) โ€” get the current write counter.
  • static void staticDataLock (void) โ€” lock the static data ๐Ÿ”’
  • static void staticDataUnlock (void) โ€” unlock the static data ๐Ÿ”“

๐Ÿ‘‘ Additional Inherited Members ๐Ÿ‘‘

๐ŸŒŸ Public Types inherited from SoNode ๐ŸŒŸ

the NodeType enum, and it's a whole mood board of versions:

enum NodeType { INVENTOR = 0x0000, VRML1 = 0x0001, VRML2 = 0x0002,
    INVENTOR_1 = 0x0004, INVENTOR_2_0 = 0x0008, INVENTOR_2_1 = 0x0010,
    INVENTOR_2_5 = 0x0020, INVENTOR_2_6 = 0x0040, COIN_1_0 = 0x0080,
    COIN_2_0 = 0x0100, EXTENSION = 0x0200, COIN_2_2 = 0x0400, COIN_2_3 =
    0x0800, COIN_2_4 = 0x1000, INVENTOR_5_0 = 0x2000, COIN_2_5 = 0x4000,
    COIN_3_0 = 0x8000, INVENTOR_6_0 = 0x10000, COIN_4_0 = 0x20000 }

๐ŸŒŸ Protected Types inherited from SoBase ๐ŸŒŸ

enum BaseFlags { IS_ENGINE = 0x01, IS_GROUP = 0x02 }

๐ŸŒธ Protected Attributes inherited from SoGroup ๐ŸŒธ

  • SoChildList * children โ€” the children list pointer. it's protected, so hands off ๐Ÿ™ˆ

๐Ÿฆ‹ Protected Attributes inherited from SoNode ๐Ÿฆ‹

  • SbUniqueId uniqueId โ€” every node's own unique id.

๐Ÿ’œ Protected Attributes inherited from SoFieldContainer ๐Ÿ’œ

  • SbBool isBuiltIn โ€” whether it's built in or not.

โญ Static Protected Attributes inherited from SoNode โญ

  • static SbUniqueId nextUniqueId = 1 โ€” starts at 1, no cap.
  • static int nextActionMethodIndex = 0 โ€” starts at 0.

okay that's part 1 done and dusted, bestie โ€” do NOT go anywhere because part 2 is literally right there ๐Ÿ’–โœจ๐ŸŽ€

๐Ÿ’– DETAILED DESCRIPTION ๐Ÿ’–

Okay bestie, listen up, because SoTransformSeparator is lowkey one of the most useful little gremlins in the whole scene graph. ๐ŸŽ€

The SoTransformSeparator class is a group node that preserves the current transformations. That's its whole thing. That's the assignment and it ate. ๐Ÿ’…

It works exactly like the SoSeparator group node โ€” except it only stores and restores the current model matrix transformation. That's it. That's the only state it's gatekeeping. โœจ

Everything else? Materials, textures, cameras, lights, etc. โ€” all of those appearance settings will affect the remaining parts of the scene graph after traversal, just like they would with the SoGroup node. So don't come for this node expecting it to hold your textures too, because it said no. ๐Ÿ™ˆ

FILE FORMAT/DEFAULTS:

TransformSeparator {
}

See also

  • SoSeparator, SoGroup

๐Ÿ› ๏ธ CONSTRUCTOR & DESTRUCTOR DOCUMENTATION ๐Ÿ› ๏ธ

SoTransformSeparator::SoTransformSeparator (void )

Default constructor. The classic. The OG. No arguments, no drama. ๐Ÿฆ‹

SoTransformSeparator::SoTransformSeparator (int nChildren)

Constructor, but make it informed. ๐Ÿ“

The argument should be the approximate number of children which is expected to be inserted below this node. The number need not be exact, because bestie it is literally just a hint for better memory resource allocation โ€” it's the node's little heads-up so it can pre-game the memory situation. It's giving "I'm manifesting this many children." ๐Ÿ’ซ

SoTransformSeparator::~SoTransformSeparator () [protected], [virtual]

Destructor. Protected, virtual, and minding its own business. ๐Ÿซถ


โœจ MEMBER FUNCTION DOCUMENTATION โœจ

SoType SoTransformSeparator::getClassTypeId (void ) [static]

This static method returns the SoType object associated with objects of this class. Static, so you don't even need an instance to ask. Iconic behaviour, honestly. ๐Ÿ‘‘

SoType SoTransformSeparator::getTypeId (void ) const [virtual]

Returns the type identification of an object derived from a class inheriting SoBase. This is used for runtime type checking and "downward" casting.

Reimplemented from SoGroup.

Runtime type checking and downward casting, no cap. ๐Ÿ”

const SoFieldData ** SoTransformSeparator::getFieldDataPtr (void ) [static], [protected]

This API member is considered internal to the library, as it is not likely to be of interest to the application programmer.

Returns the SoFieldData class which holds information about fields in this node.

So like, unless you're doing library-internal shenanigans, this one's not for you, bestie. ๐Ÿšช

const SoFieldData * SoTransformSeparator::getFieldData (void ) const [protected], [virtual]

Returns a pointer to the class-wide field data storage object for this instance. If no fields are present, returns NULL.

Reimplemented from SoGroup.

NULL! If there are no fields, you get NULL. That's the deal. ๐Ÿ’€

void SoTransformSeparator::doAction (SoAction * action) [virtual]

This function performs the typical operation of a node for any action. Any action, one method, the multitasker of the century. ๐ŸŒˆ

Reimplemented from SoGroup.

void SoTransformSeparator::callback (SoCallbackAction * action) [virtual]

Action method for SoCallbackAction.

Simply updates the state according to how the node behaves for the render action, so the application programmer can use the SoCallbackAction for extracting information about the scene graph.

Yes bestie, it's literally just updating state so you can go extract scene graph info. You're welcome. ๐Ÿ•ต๏ธ

Reimplemented from SoGroup.

void SoTransformSeparator::GLRender (SoGLRenderAction * action) [virtual]

Action method for the SoGLRenderAction.

This is called during rendering traversals. Nodes influencing the rendering state in any way or want to throw geometry primitives at OpenGL override this method.

Throwing geometry primitives at OpenGL is such a mood, fr fr. ๐Ÿ”ฅ

Reimplemented from SoGroup.

void SoTransformSeparator::pick (SoPickAction * action) [virtual]

Action method for SoPickAction.

Does common processing for SoPickAction action instances.

Common processing, no fuss, no notes. ๐Ÿ’…

Reimplemented from SoGroup.

void SoTransformSeparator::getBoundingBox (SoGetBoundingBoxAction * action) [virtual]

Action method for the SoGetBoundingBoxAction.

Calculates bounding box and center coordinates for node and modifies the values of the action to encompass the bounding box for this node and to shift the center point for the scene more towards the one for this node.

So it's out here doing math: expanding the action's values to swallow up this node's bounding box, AND nudging the scene's center point closer to this node's own center. Two jobs. Slay. ๐Ÿ“โœจ

Nodes influencing how geometry nodes calculate their bounding box also override this method to change the relevant state variables.

Reimplemented from SoGroup.

void SoTransformSeparator::getMatrix (SoGetMatrixAction * action) [virtual]

Action method for SoGetMatrixAction.

Updates action by accumulating with the transformation matrix of this node (if any).

(if any) โ€” the parenthetical that keeps us humble. ๐Ÿ˜Œ

Reimplemented from SoGroup.

void SoTransformSeparator::getPrimitiveCount (SoGetPrimitiveCountAction * action) [virtual]

Action method for the SoGetPrimitiveCountAction.

Calculates the number of triangle, line segment and point primitives for the node and adds these to the counters of the action.

Triangles, line segments AND points โ€” it's counting all three, bestie. Very thorough. ๐Ÿงฎ

Nodes influencing how geometry nodes calculate their primitive count also override this method to change the relevant state variables.

Reimplemented from SoGroup.

void SoTransformSeparator::audioRender (SoAudioRenderAction * action) [virtual]

Action method for SoAudioRenderAction.

Does common processing for SoAudioRenderAction action instances.

Audio representation, but make it common processing. ๐ŸŽง

Reimplemented from SoGroup.

๐Ÿ‘‘ AUTHOR ๐Ÿ‘‘

Generated automatically by Doxygen for Coin from the source code.


And that's the whole page, babe! ๐Ÿ’œ This was Coin version 4.0.10, dated Thu Jun 25 2026 00:00:00, so likeโ€ฆ future-coded of them. ๐Ÿฆ‹โœจ Go forth and separate those transforms, SoTransformSeparator(3) bestie. Periodt. ๐Ÿ’…๐ŸŽ€

๐Ÿ“ฆ where this page comes from