SOINDEXEDTRIANGLESTRIPSET(3coin3)

πŸ“¦ version 3.1.3, in fedora 43, fedora 44

πŸ’– NAME πŸ’–

okay so bestie, <rainbow>SoIndexedTriangleStripSet</rainbow> β€” this is the class (from the Library Functions Manual, section 3, iykyk) that literally keeps the data for rendering and otherwise representing triangle strips. that's the whole job. she holds the data. she serves. periodt. ✨


πŸ¦‹ SYNOPSIS πŸ¦‹

#include <Inventor/nodes/SoIndexedTriangleStripSet.h>

Inherits SoIndexedShape. yes she has a whole family tree, it's giving legacy. 🌳

🫢 Public Member Functions

  • virtual SoType getTypeId (void) const β€” hands you her type id, slay
  • SoIndexedTriangleStripSet (void) β€” the constructor, the birth of an icon πŸ’…
  • virtual void GLRender (SoGLRenderAction *action) β€” does the actual render thing
  • virtual void getPrimitiveCount (SoGetPrimitiveCountAction *action) β€” counts her primitives, no cap
  • virtual SbBool generateDefaultNormals (SoState *state, SoNormalBundle *nb) β€” makes default normals for you

🌸 Public Member Functions inherited from SoVertexShape

  • virtual void notify (SoNotList *nl) β€” the notification moment, she's keeping everyone in the loop fr fr
  • virtual void write (SoWriteAction *action) β€” writes herself out

🌼 Public Member Functions inherited from SoShape

  • virtual SbBool affectsState (void) const β€” does she touch the state? enquire within
  • virtual void getBoundingBox (SoGetBoundingBoxAction *action) β€” gets the bounding box πŸ’–
  • virtual void rayPick (SoRayPickAction *action) β€” ray pick energy
  • virtual void callback (SoCallbackAction *action) β€” callback time
  • const SoBoundingBoxCache * getBoundingBoxCache (void) const β€” the cached bounding box, iconic

⭐ Public Member Functions inherited from SoNode

  • void setOverride (const SbBool state) β€” sets the override
  • SbBool isOverride (void) const β€” are we overriding? asking for a friend
  • void setNodeType (const NodeType type) β€” sets the node type
  • NodeType getNodeType (void) const β€” gets the node type
  • virtual SoNode * copy (SbBool copyconnections=FALSE) const β€” copies herself, main character behaviour
  • virtual void doAction (SoAction *action) β€” do the action bestie
  • virtual void GLRenderBelowPath (SoGLRenderAction *action) β€” renders below the path
  • virtual void GLRenderInPath (SoGLRenderAction *action) β€” renders in the path
  • virtual void GLRenderOffPath (SoGLRenderAction *action) β€” renders off the path
  • virtual void getMatrix (SoGetMatrixAction *action) β€” gets the matrix, she's that girl
  • virtual void handleEvent (SoHandleEventAction *action) β€” handles the event
  • virtual void pick (SoPickAction *action) β€” picks
  • virtual void search (SoSearchAction *action) β€” searches
  • virtual void audioRender (SoAudioRenderAction *action) β€” audio render, sound on πŸ”Š
  • virtual void grabEventsSetup (void) β€” sets up the event grabbing
  • virtual void grabEventsCleanup (void) β€” cleans up the event grabbing
  • virtual void startNotify (void) β€” starts the notify
  • uint32_t getNodeId (void) const β€” her node id, very her
  • virtual SoChildList * getChildren (void) const β€” the children, her little minions
  • virtual void writeInstance (SoOutput *out) β€” writes the instance
  • virtual SoNode * addToCopyDict (void) const β€” adds to the copy dict
  • virtual void copyContents (const SoFieldContainer *from, SbBool copyconnections) β€” copies the contents
  • virtual SoFieldContainer * copyThroughConnection (void) const β€” copies through the connection

πŸ’œ Public Member Functions inherited from SoFieldContainer

  • void setToDefaults (void) β€” back to defaults, reset era
  • SbBool hasDefaultValues (void) const β€” does she have default values? vibe check
  • SbBool fieldsAreEqual (const SoFieldContainer *container) const β€” are the fields equal or not
  • void copyFieldValues (const SoFieldContainer *container, SbBool copyconnections=FALSE) β€” copies the field values
  • SbBool set (const char *const fielddata) β€” set it
  • void get (SbString &fielddata) β€” get it
  • virtual int getFields (SoFieldList &l) const β€” gets the fields
  • virtual int getAllFields (SoFieldList &l) const β€” gets ALL the fields, greedy queen
  • virtual SoField * getField (const SbName &name) const β€” gets one field by name
  • virtual SoField * getEventIn (const SbName &name) const β€” gets the event in
  • virtual SoField * getEventOut (const SbName &name) const β€” gets the event out
  • SbBool getFieldName (const SoField *const field, SbName &name) const β€” gets the field's name
  • SbBool enableNotify (const SbBool flag) β€” turns notify on
  • SbBool isNotifyEnabled (void) const β€” is notify enabled? πŸ‘€
  • SbBool set (const char *fielddata, SoInput *input) β€” set it, but with an SoInput
  • void get (SbString &fielddata, SoOutput *out) β€” get it, but with an SoOutput
  • virtual SbBool validateNewFieldValue (SoField *field, void *newval) β€” validates the new field value, she's checking receipts
  • virtual void addWriteReference (SoOutput *out, SbBool isfromfield=FALSE) β€” adds a write reference
  • SbBool getIsBuiltIn (void) const β€” is she built in? yes bestie she's a built-in
  • virtual void getFieldsMemorySize (size_t &managed, size_t &unmanaged) const β€” memory size of the fields, managed AND unmanaged
  • void setUserData (void *userdata) const β€” sets your user data
  • void * getUserData (void) const β€” hands your user data back

πŸŽ€ Public Member Functions inherited from SoBase

  • void ref (void) const β€” ref her up
  • void unref (void) const β€” unref her
  • void unrefNoDelete (void) const β€” unref but like, no delete
  • int32_t getRefCount (void) const β€” the ref count, the numbers don't lie
  • void touch (void) β€” touch, she needs a lil attention
  • SbBool isOfType (SoType type) const β€” is she of this type?
  • virtual SbName getName (void) const β€” gets the name
  • virtual void setName (const SbName &newname) β€” sets a new name, rebrand era
  • void addAuditor (void *const auditor, const SoNotRec::Type type) β€” adds an auditor
  • void removeAuditor (void *const auditor, const SoNotRec::Type type) β€” removes an auditor
  • const SoAuditorList & getAuditors (void) const β€” gets the auditor list
  • SbBool shouldWrite (void) β€” should she write? discuss
  • void assertAlive (void) const β€” asserts she's alive, not me checking on her tho 😭

✨ Static Public Member Functions ✨

  • static SoType getClassTypeId (void) β€” the class type id, static edition
  • static void initClass (void) β€” inits the class

✨ Static Public Member Functions inherited from SoIndexedShape ✨

  • static SoType getClassTypeId (void)
  • static void initClass (void)

✨ Static Public Member Functions inherited from SoVertexShape ✨

  • static SoType getClassTypeId (void)
  • static void initClass (void)

✨ Static Public Member Functions inherited from SoShape ✨

  • static SoType getClassTypeId (void)
  • static void initClass (void)
  • static void getScreenSize (SoState *const state, const SbBox3f &boundingbox, SbVec2s &rectsize) β€” gets the screen size from the bounding box
  • static float getDecimatedComplexity (SoState *state, float complexity) β€” gets the decimated complexity

✨ Static Public Member Functions inherited from SoNode ✨

  • static uint32_t getCompatibilityTypes (const SoType &nodetype) β€” gets the compatibility types
  • static SoType getClassTypeId (void)
  • static SoNode * getByName (const SbName &name) β€” gets a node by name
  • static int getByName (const SbName &name, SoNodeList &l) β€” gets nodes by name into a list
  • static void initClass (void)
  • static void initClasses (void) β€” plural, init ALL the classes
  • static uint32_t getNextNodeId (void) β€” the next node id
  • static int getActionMethodIndex (const SoType type) β€” the action method index
  • static void getBoundingBoxS (SoAction *action, SoNode *node) β€” the static bounding box getter
  • static void GLRenderS (SoAction *action, SoNode *node) β€” the static GL render
  • static void callbackS (SoAction *action, SoNode *node) β€” the static callback
  • static void getMatrixS (SoAction *action, SoNode *node) β€” the static matrix getter
  • static void handleEventS (SoAction *action, SoNode *node) β€” the static event handler
  • static void pickS (SoAction *action, SoNode *node) β€” the static pick
  • static void rayPickS (SoAction *action, SoNode *node) β€” the static ray pick
  • static void searchS (SoAction *action, SoNode *node) β€” the static search
  • static void writeS (SoAction *action, SoNode *node) β€” the static write
  • static void audioRenderS (SoAction *action, SoNode *node) β€” the static audio render
  • static void getPrimitiveCountS (SoAction *action, SoNode *node) β€” the static primitive count

✨ Static Public Member Functions inherited from SoFieldContainer ✨

  • static void initClass (void)
  • static SoType getClassTypeId (void)
  • static void cleanupClass (void) β€” cleanup, the post-party sweep
  • static void initCopyDict (void) β€” inits the copy dict
  • static void addCopy (const SoFieldContainer *orig, const SoFieldContainer *copy) β€” adds a copy
  • static SoFieldContainer * checkCopy (const SoFieldContainer *orig) β€” checks a copy
  • static SoFieldContainer * findCopy (const SoFieldContainer *orig, const SbBool copyconnections) β€” finds a copy
  • static void copyDone (void) β€” copy's done bestie

✨ Static Public Member Functions inherited from SoBase ✨

  • static void initClass (void)
  • static SoType getClassTypeId (void)
  • static void addName (SoBase *const base, const char *const name) β€” adds a name
  • static void removeName (SoBase *const base, const char *const name) β€” removes a name
  • static void incrementCurrentWriteCounter (void) β€” increments the current write counter
  • static void decrementCurrentWriteCounter (void) β€” decrements the current write counter
  • static SoBase * getNamedBase (const SbName &name, SoType type) β€” gets a named base
  • static int getNamedBases (const SbName &name, SoBaseList &baselist, SoType type) β€” gets named bases into a list
  • static SbBool read (SoInput *input, SoBase *&base, SoType expectedtype) β€” reads
  • static void setInstancePrefix (const SbString &c) β€” sets the instance prefix
  • static void setTraceRefs (SbBool trace) β€” sets trace refs
  • static SbBool getTraceRefs (void) β€” gets trace refs
  • static SbBool connectRoute (SoInput *input, const SbName &fromnodename, const SbName &fromfieldname, const SbName &tonodename, const SbName &tofieldname) β€” connects a route
  • static SbBool readRoute (SoInput *input) β€” reads a route

πŸ”’ Protected Member Functions πŸ”’

  • virtual const SoFieldData * getFieldData (void) const β€” gets the field data (protected, so mind your business)
  • virtual ~SoIndexedTriangleStripSet () β€” the destructor, she's leaving but she left a legacy πŸ’…
  • virtual SbBool generateDefaultNormals (SoState *state, SoNormalCache *nc) β€” generates default normals into a cache
  • virtual void generatePrimitives (SoAction *action) β€” generates primitives

πŸ”’ Protected Member Functions inherited from SoIndexedShape πŸ”’

  • SoIndexedShape (void) β€” the constructor
  • virtual ~SoIndexedShape () β€” the destructor
  • virtual void computeBBox (SoAction *action, SbBox3f &box, SbVec3f &center) β€” computes the bounding box
  • int getNumVerts (const int startCoord) β€” gets the number of verts from startCoord
  • void setupIndices (const int numParts, const int numFaces, const SbBool needNormals, const SbBool needTexCoords) β€” sets up the indices
  • const int32_t * getNormalIndices (void) β€” the normal indices
  • const int32_t * getColorIndices (void) β€” the color indices
  • const int32_t * getTexCoordIndices (void) β€” the tex coord indices
  • SbBool getVertexData (SoState *state, const SoCoordinateElement *&coords, const SbVec3f *&normals, const int32_t *&cindices, const int32_t *&nindices, const int32_t *&tindices, const int32_t *&mindices, int &numcindices, const SbBool needNormals, SbBool &normalCacheUsed) β€” the big vertex data getter, she does a LOT

πŸ”’ Protected Member Functions inherited from SoVertexShape πŸ”’

  • SoVertexShape (void) β€” the constructor
  • virtual ~SoVertexShape () β€” the destructor
  • virtual SbBool shouldGLRender (SoGLRenderAction *action) β€” should she GL render? decide
  • void setNormalCache (SoState *const state, const int num, const SbVec3f *normals) β€” sets the normal cache
  • SoNormalCache * getNormalCache (void) const β€” gets the normal cache
  • SoNormalCache * generateAndReadLockNormalCache (SoState *const state) β€” generates AND read-locks the normal cache, multitasking queen
  • void getVertexData (SoState *state, const SoCoordinateElement *&coords, const SbVec3f *&normals, const SbBool neednormals) β€” gets the vertex data, neednormals edition
  • void readLockNormalCache (void) β€” read-locks the normal cache
  • void readUnlockNormalCache (void) β€” read-unlocks the normal cache

bestie this is only part 1 of the page πŸ’– the rest is literally right there, keep scrolling, don't leave me hanging 🫢

✨ Protected Member Functions inherited from SoShape ✨

okay bestie, these are the protected functions that SoShape passes down like hand-me-downs but make it iconic πŸ’…

  • SoShape (void)
  • virtual ~SoShape ()
  • float getComplexityValue (SoAction *action)
  • void beginSolidShape (SoGLRenderAction *action)
  • void endSolidShape (SoGLRenderAction *action)
  • void GLRenderBoundingBox (SoGLRenderAction *action)
  • SbBool shouldPrimitiveCount (SoGetPrimitiveCountAction *action)
  • SbBool shouldRayPick (SoRayPickAction *const action)
  • void computeObjectSpaceRay (SoRayPickAction *const action)
  • void computeObjectSpaceRay (SoRayPickAction *const action, const SbMatrix &matrix)
  • virtual SoDetail * createTriangleDetail (SoRayPickAction *action, const SoPrimitiveVertex *v1, const SoPrimitiveVertex *v2, const SoPrimitiveVertex *v3, SoPickedPoint *pp)
  • virtual SoDetail * createLineSegmentDetail (SoRayPickAction *action, const SoPrimitiveVertex *v1, const SoPrimitiveVertex *v2, SoPickedPoint *pp)
  • virtual SoDetail * createPointDetail (SoRayPickAction *action, const SoPrimitiveVertex *v, SoPickedPoint *pp)
  • void invokeTriangleCallbacks (SoAction *const action, const SoPrimitiveVertex *const v1, const SoPrimitiveVertex *const v2, const SoPrimitiveVertex *const v3)
  • void invokeLineSegmentCallbacks (SoAction *const action, const SoPrimitiveVertex *const v1, const SoPrimitiveVertex *const v2)
  • void invokePointCallbacks (SoAction *const action, const SoPrimitiveVertex *const v)
  • void beginShape (SoAction *const action, const TriangleShape shapetype, SoDetail *const detail=NULL)
  • void shapeVertex (const SoPrimitiveVertex *const v)
  • void endShape (void)
  • void generateVertex (SoPrimitiveVertex *const pv, const SbVec3f &point, const SbBool useTexFunc, const SoTextureCoordinateElement *const tce, const float s, const float t, const SbVec3f &normal)
  • void generateVertex (SoPrimitiveVertex *const pv, const SbVec3f &point, const SbBool useTexFunc, const SoTextureCoordinateElement *const tce, const float s, const float t, const float r, const SbVec3f &normal)
  • SbBool startVertexArray (SoGLRenderAction *action, const SoCoordinateElement *coords, const SbVec3f *pervertexnormals, const SbBool texpervertex, const SbBool colorpervertex)
  • void finishVertexArray (SoGLRenderAction *action, const SbBool vbo, const SbBool normpervertex, const SbBool texpervertex, const SbBool colorpervertex)

✨ Protected Member Functions inherited from SoNode ✨

  • SoNode (void)
  • virtual ~SoNode ()
  • virtual SbBool readInstance (SoInput *in, unsigned short flags)

✨ Protected Member Functions inherited from SoFieldContainer ✨

  • SoFieldContainer (void)
  • virtual ~SoFieldContainer ()

✨ Protected Member Functions inherited from SoBase ✨

  • SoBase (void)
  • virtual ~SoBase ()
  • virtual void destroy (void)
  • SbBool hasMultipleWriteRefs (void) const
  • SbBool writeHeader (SoOutput *out, SbBool isgroup, SbBool isengine) const
  • void writeFooter (SoOutput *out) const
  • virtual const char * getFileFormatName (void) const

✨ Static Protected Member Functions ✨

  • static const SoFieldData ** getFieldDataPtr (void)

✨ Static Protected Member Functions inherited from SoIndexedShape ✨

  • static const SoFieldData ** getFieldDataPtr (void)
  • static SbBool areTexCoordsIndexed (SoAction *action)

✨ Static Protected Member Functions inherited from SoVertexShape ✨

  • static const SoFieldData ** getFieldDataPtr (void)

✨ Static Protected Member Functions inherited from SoShape ✨

  • static const SoFieldData ** getFieldDataPtr (void)

✨ Static Protected Member Functions inherited from SoNode ✨

  • static const SoFieldData ** getFieldDataPtr (void)
  • static void setNextActionMethodIndex (int index)
  • static int getNextActionMethodIndex (void)
  • static void incNextActionMethodIndex (void)
  • static void setCompatibilityTypes (const SoType &nodetype, const uint32_t bitmask)

✨ Static Protected Member Functions inherited from SoBase ✨

  • static uint32_t getCurrentWriteCounter (void)
  • static void staticDataLock (void)
  • static void staticDataUnlock (void)

✨ Additional Inherited Members ✨

✨ Public Types inherited from SoShape ✨

enum TriangleShape { TRIANGLE_STRIP, TRIANGLE_FAN, TRIANGLES, POLYGON,
    QUADS, QUAD_STRIP, POINTS, LINES, LINE_STRIP }

✨ Public Types inherited from SoNode ✨

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 }

✨ Public Attributes inherited from SoIndexedShape ✨

  • SoMFInt32 coordIndex
  • SoMFInt32 materialIndex
  • SoMFInt32 normalIndex
  • SoMFInt32 textureCoordIndex

✨ Public Attributes inherited from SoVertexShape ✨

  • SoSFNode vertexProperty

✨ Protected Types inherited from SoBase ✨

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

✨ Protected Attributes inherited from SoNode ✨

  • uint32_t uniqueId

✨ Protected Attributes inherited from SoFieldContainer ✨

  • SbBool isBuiltIn

✨ Static Protected Attributes inherited from SoNode ✨

  • static uint32_t nextUniqueId = 1
  • static int nextActionMethodIndex = 0

✨ Detailed Description ✨

so like, SoIndexedTriangleStripSet is literally the class that keeps data for rendering and otherwise representing triangle strips. it's giving β€œI got you, bestie” πŸ’–

use nodes of this type as an effective way of drawing triangles which are strung together. it's a whole vibe, no cap.

for more information, see the documentation of the SoTriangleStripSet node. iykyk.

to render several strips within the same node, just separate the coordinate indices with -1. (yes, negative one, the separator queen πŸ‘‘). for more information about indexed shapes, see documentation in SoIndexedShape and SoIndexedFaceSet.

example scene graph:

       #Inventor V2.1 ascii

       Separator {
          Coordinate3 {
             point [
              -2 1 0, -1 -1 0, 0 1 0, 1 -1 0, 2 1 0, # first strip, z==0
              -2 1 5, -1 -1 5, 0 1 5, 1 -1 5, 2 1 5  # second strip, z==5
             ]
          }

          IndexedTriangleStripSet {
             coordIndex [
              0, 1, 2, 3, 4, -1,
              5, 6, 7, 8, 9, -1
             ]
          }
       }

FILE FORMAT/DEFAULTS:

       IndexedTriangleStripSet {
           vertexProperty NULL
           coordIndex 0
           materialIndex -1
           normalIndex -1
           textureCoordIndex -1
       }

✨ Constructor & Destructor Documentation ✨

✨ SoIndexedTriangleStripSet::SoIndexedTriangleStripSet (void ) ✨

Constructor. Default field values will equal those set in the SoIndexedShape parent class.

✨ SoIndexedTriangleStripSet::~SoIndexedTriangleStripSet () [protected], [virtual] ✨

Destructor.

✨ Member Function Documentation ✨

✨ SoType SoIndexedTriangleStripSet::getTypeId (void ) const [virtual] ✨

Returns the type identification of an object derived from a class inheriting SoBase. This is used for run-time type checking and β€œdownward” casting.

Usage example:

       void foo(SoNode * node)
       {
         if (node->getTypeId() == SoFile::getClassTypeId()) {
           SoFile * filenode = (SoFile *)node;  // safe downward cast, knows the type
         }
       }

For application programmers wanting to extend the library with new nodes, engines, nodekits, draggers or others: this method needs to be overridden in all subclasses. This is typically done as part of setting up the full type system for extension classes, which is usually accomplished by using the pre-defined macros available through for instance Inventor/nodes/SoSubNode.h (SO_NODE_INIT_CLASS and SO_NODE_CONSTRUCTOR for node classes), Inventor/engines/SoSubEngine.h (for engine classes) and so on.

For more information on writing Coin extensions, see the class documentation of the toplevel superclasses for the various class groups.

Reimplemented from SoIndexedShape.

✨ const SoFieldData * SoIndexedTriangleStripSet::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 SoIndexedShape.

✨ void SoIndexedTriangleStripSet::GLRender (SoGLRenderAction * action) [virtual] ✨

Action method for the SoGLRenderAction.

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

Reimplemented from SoShape.

✨ void SoIndexedTriangleStripSet::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.

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

Reimplemented from SoShape.

✨ SbBool SoIndexedTriangleStripSet::generateDefaultNormals (SoState * state, SoNormalBundle * bundle) [virtual] ✨

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

Subclasses should override this method to generate default normals using the SoNormalBundle class. TRUE should be returned if normals were generated, FALSE otherwise.

Default method returns FALSE.

This function is an extension for Coin, and it is not available in the original SGI Open Inventor v2.1 API.

Reimplemented from SoVertexShape.

✨ SbBool SoIndexedTriangleStripSet::generateDefaultNormals (SoState * state, SoNormalCache * cache) [protected], [virtual] ✨

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

Subclasses should override this method to generate default normals using the SoNormalCache class. This is more effective than using SoNormalGenerator. Return TRUE if normals were generated, FALSE otherwise.

Default method just returns FALSE.

This function is an extension for Coin, and it is not available in the original SGI Open Inventor v2.1 API.

Reimplemented from SoVertexShape.

✨ void SoIndexedTriangleStripSet::generatePrimitives (SoAction * action) [protected], [virtual] ✨

The method implements action behavior for shape nodes for SoCallbackAction. It is invoked from SoShape::callback(). (Subclasses should not override SoNode::callback().)

The subclass implementations uses the convenience methods SoShape::beginShape(), SoShape::shapeVertex(), and SoShape::endShape(), with SoDetail instances, to pass the primitives making up the shape back to the caller.

Implements SoShape.

✨ Author ✨

Generated automatically by Doxygen for Coin from the source code.


this whole page was served by Coin, Version 3.1.3, and the manual page SoIndexedT...gleStripSet(3) β€” stay iconic, bestie πŸ’…βœ¨

πŸ“¦ where this page comes from