SoVRMLTextureCoordinate(3)

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

โœจ SoVRMLTextureCoordinate โœจ

okay bestie, welcome to the SoVRMLTextureCoordinate(3) page from Coin ๐Ÿ’– this is part 1 of 2 so don't go anywhere, there's more coming. she's the class that binds texture coordinates to vertex-based geometry, and honestly? iconic behaviour. matchmaking vertices to textures like it's her whole job ๐Ÿฆ‹


๐Ÿ’– NAME ๐Ÿ’–

SoVRMLTextureCoordinate โ€” binds texture coordinates to vertex-based geometry. literally the wingwoman of your VRML geometry, no cap ๐Ÿ’…

๐ŸŽ€ SYNOPSIS ๐ŸŽ€

#include <Inventor/VRMLnodes/SoVRMLTextureCoordinate.h>

Inherits SoNode. periodt ๐ŸŒธ


๐ŸŒˆ Public Member Functions ๐ŸŒˆ

  • virtual SoType getTypeId (void) const โ€” hands you back the SoType for this class, the classic "who am I" check ๐Ÿชž
  • SoVRMLTextureCoordinate (void) โ€” the constructor, she's right there ready to build you a fresh one โœจ
  • virtual void doAction (SoAction *action) โ€” the general "do the thing with this SoAction" entry point ๐Ÿ”ฅ
  • virtual void callback (SoCallbackAction *action) โ€” runs the callback action, she's on it ๐Ÿ’ซ
  • virtual void GLRender (SoGLRenderAction *action) โ€” the render pass, this is where she shows up for SoGLRenderAction ๐Ÿ‘‘
  • virtual void pick (SoPickAction *action) โ€” handles picking with SoPickAction, for when you need to know what's under the cursor ๐ŸŽฏ
  • virtual void getPrimitiveCount (SoGetPrimitiveCountAction *action) โ€” answers the SoGetPrimitiveCountAction roll call ๐Ÿ”ข

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

  • void setOverride (const SbBool state) โ€” sets the override state ๐Ÿ’œ
  • SbBool isOverride (void) const โ€” asks whether override is on ๐Ÿ™‹
  • void setNodeType (const NodeType type) โ€” sets the node type ๐Ÿท๏ธ
  • NodeType getNodeType (void) const โ€” reads back the node type ๐Ÿ”
  • virtual SoNode * copy (SbBool copyconnections=FALSE) const โ€” copies the node, with copyconnections defaulting to FALSE ๐Ÿ“‹
  • virtual SbBool affectsState (void) const โ€” whether this node messes with state ๐Ÿซง
  • virtual void GLRenderBelowPath (SoGLRenderAction *action) โ€” render, below-path flavour ๐ŸŒŠ
  • virtual void GLRenderInPath (SoGLRenderAction *action) โ€” render, in-path flavour ๐Ÿ›ค๏ธ
  • virtual void GLRenderOffPath (SoGLRenderAction *action) โ€” render, off-path flavour ๐Ÿšซ
  • virtual void getBoundingBox (SoGetBoundingBoxAction *action) โ€” bounding box time ๐Ÿ“ฆ
  • virtual void getMatrix (SoGetMatrixAction *action) โ€” matrix time ๐Ÿงฎ
  • virtual void handleEvent (SoHandleEventAction *action) โ€” event handling ๐ŸŽช
  • virtual void rayPick (SoRayPickAction *action) โ€” ray picking ๐Ÿ•น๏ธ
  • virtual void search (SoSearchAction *action) โ€” search ๐Ÿ”Ž
  • virtual void write (SoWriteAction *action) โ€” write โœ๏ธ
  • virtual void audioRender (SoAudioRenderAction *action) โ€” audio render ๐Ÿ”Š
  • virtual void grabEventsSetup (void) โ€” sets up event grabbing ๐Ÿซด
  • virtual void grabEventsCleanup (void) โ€” cleans up event grabbing ๐Ÿงน
  • virtual void startNotify (void) โ€” kicks off notification ๐Ÿ“ฃ
  • virtual void notify (SoNotList *l) โ€” notifies ๐Ÿ›Ž๏ธ
  • SbUniqueId getNodeId (void) const โ€” the node's unique id ๐Ÿ†”
  • virtual SoChildList * getChildren (void) const โ€” the children list ๐Ÿ‘ถ
  • virtual void writeInstance (SoOutput *out) โ€” writes the instance ๐Ÿ“ค
  • virtual SoNode * addToCopyDict (void) const โ€” adds to the copy dictionary ๐Ÿ—‚๏ธ
  • virtual void copyContents (const SoFieldContainer *from, SbBool copyconnections) โ€” copies contents over, copyconnections and all ๐Ÿ“ฅ
  • virtual SoFieldContainer * copyThroughConnection (void) const โ€” copies through a connection ๐Ÿ”—

๐ŸŒŸ Public Member Functions inherited from SoFieldContainer ๐ŸŒŸ

  • void setToDefaults (void) โ€” back to defaults, reset era ๐Ÿงผ
  • SbBool hasDefaultValues (void) const โ€” are we at default values? ๐Ÿค”
  • SbBool fieldsAreEqual (const SoFieldContainer *container) const โ€” field-by-field comparison with container โš–๏ธ
  • void copyFieldValues (const SoFieldContainer *container, SbBool copyconnections=FALSE) โ€” copies field values from container, copyconnections defaults to FALSE ๐Ÿ“Ž
  • SbBool set (const char *const fielddata) โ€” sets from a fielddata string ๐Ÿงต
  • void get (SbString &fielddata) โ€” reads out into fielddata ๐Ÿ“–
  • virtual int getFields (SoFieldList &l) const โ€” grabs the fields into l ๐Ÿ—ƒ๏ธ
  • virtual int getAllFields (SoFieldList &l) const โ€” grabs all the fields into l, yes all of them ๐Ÿ’ฏ
  • virtual SoField * getField (const SbName &name) const โ€” looks up a field by name ๐Ÿท๏ธ
  • virtual SoField * getEventIn (const SbName &name) const โ€” looks up an event-in by name ๐Ÿ“จ
  • virtual SoField * getEventOut (const SbName &name) const โ€” looks up an event-out by name ๐Ÿ“ฎ
  • SbBool getFieldName (const SoField *const field, SbName &name) const โ€” gets the name of field into name ๐Ÿ”–
  • SbBool enableNotify (const SbBool flag) โ€” toggles notification with flag ๐Ÿ””
  • SbBool isNotifyEnabled (void) const โ€” is notification enabled? ๐Ÿง
  • SbBool set (const char *fielddata, SoInput *input) โ€” sets from fielddata using an SoInput ๐Ÿ“ฅ
  • void get (SbString &fielddata, SoOutput *out) โ€” reads out into fielddata using an SoOutput ๐Ÿ“ค
  • virtual SbBool validateNewFieldValue (SoField *field, void *newval) โ€” validates a new value for field โœ…
  • virtual void addWriteReference (SoOutput *out, SbBool isfromfield=FALSE) โ€” adds a write reference, isfromfield defaults to FALSE ๐Ÿ–‡๏ธ
  • SbBool getIsBuiltIn (void) const โ€” is it built in? ๐Ÿ 
  • virtual void getFieldsMemorySize (size_t &managed, size_t &unmanaged) const โ€” reports memory size into managed and unmanaged ๐Ÿง 
  • void setUserData (void *userdata) const โ€” stashes your userdata ๐ŸŽ’
  • void * getUserData (void) const โ€” gets your userdata back ๐ŸŽ

๐ŸŒŸ Public Member Functions inherited from SoBase ๐ŸŒŸ

  • void ref (void) const โ€” refs her up, refcount goes brrr โฌ†๏ธ
  • void unref (void) const โ€” unrefs, and may delete ๐Ÿ—‘๏ธ
  • void unrefNoDelete (void) const โ€” unrefs but doesn't delete, the polite version ๐Ÿ™…
  • int32_t getRefCount (void) const โ€” how many refs we got ๐Ÿ”ข
  • void touch (void) โ€” touch her, wake the notification chain up โšก
  • SbBool isOfType (SoType type) const โ€” Returns TRUE if the type of this object is either of the same type or inherited from type. ๐Ÿ‘‘
  • virtual SbName getName (void) const โ€” the name ๐Ÿท๏ธ
  • virtual void setName (const SbName &newname) โ€” sets the name to newname โœ๏ธ
  • 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 โ€” the auditor list ๐Ÿ“œ
  • SbBool shouldWrite (void) โ€” should she write? ๐Ÿคท
  • void assertAlive (void) const โ€” asserts she's alive, dramatic but necessary ๐Ÿ’€

๐Ÿ’ซ Static Public Member Functions ๐Ÿ’ซ

  • static SoType getClassTypeId (void) โ€” the static SoType for this class ๐Ÿ†”
  • static void initClass (void) โ€” sets up the class, the whole "hey Coin type system, we exist" moment โœจ

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

  • static uint32_t getCompatibilityTypes (const SoType &nodetype) โ€” compatibility types for nodetype ๐Ÿงฉ
  • static SoType getClassTypeId (void) โ€” the class SoType ๐Ÿ†”
  • 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) โ€” inits all the classes, plural, she's doing overtime ๐Ÿญ
  • static SbUniqueId getNextNodeId (void) โ€” the next node id, coming right up ๐Ÿ”ข
  • static int getActionMethodIndex (const SoType type) โ€” the action method index for type ๐Ÿ“‡
  • static void getBoundingBoxS (SoAction *action, SoNode *node) โ€” static bounding box helper ๐Ÿ“ฆ
  • static void GLRenderS (SoAction *action, SoNode *node) โ€” static GL render helper ๐ŸŽจ
  • static void callbackS (SoAction *action, SoNode *node) โ€” static callback helper ๐Ÿ“ž
  • static void getMatrixS (SoAction *action, SoNode *node) โ€” static matrix helper ๐Ÿงฎ
  • static void handleEventS (SoAction *action, SoNode *node) โ€” static event helper ๐ŸŽช
  • static void pickS (SoAction *action, SoNode *node) โ€” static pick helper ๐ŸŽฏ
  • static void rayPickS (SoAction *action, SoNode *node) โ€” static ray pick helper ๐Ÿ•น๏ธ
  • static void searchS (SoAction *action, SoNode *node) โ€” static search helper ๐Ÿ”
  • static void writeS (SoAction *action, SoNode *node) โ€” static write helper โœ๏ธ
  • static void audioRenderS (SoAction *action, SoNode *node) โ€” static audio render helper ๐Ÿ”Š
  • static void getPrimitiveCountS (SoAction *action, SoNode *node) โ€” static primitive count helper ๐Ÿ”ข

๐ŸŒŸ 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 duty ๐Ÿงฝ
  • static void initCopyDict (void) โ€” sets up the copy dictionary ๐Ÿ—‚๏ธ
  • static void addCopy (const SoFieldContainer *orig, const SoFieldContainer *copy) โ€” registers copy as the copy of orig ๐Ÿ“‘
  • static SoFieldContainer * checkCopy (const SoFieldContainer *orig) โ€” checks the copy for orig ๐Ÿ”Ž
  • static SoFieldContainer * findCopy (const SoFieldContainer *orig, const SbBool copyconnections) โ€” finds the copy of orig, with copyconnections in the mix ๐Ÿงญ
  • static void copyDone (void) โ€” copying is 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) โ€” adds name for base ๐Ÿท๏ธ
  • static void removeName (SoBase *const base, const char *const name) โ€” removes name from base โŒ
  • static void incrementCurrentWriteCounter (void) โ€” bump the write counter โฌ†๏ธ
  • static void decrementCurrentWriteCounter (void) โ€” drop the write counter โฌ‡๏ธ
  • static SoBase * getNamedBase (const SbName &name, SoType type) โ€” get the base named name of type ๐Ÿ”
  • static int getNamedBases (const SbName &name, SoBaseList &baselist, SoType type) โ€” get all the bases named name of type into baselist ๐Ÿ“š
  • static SbBool read (SoInput *input, SoBase *&base, SoType expectedtype) โ€” reads into base, expecting expectedtype ๐Ÿ“–
  • static void setInstancePrefix (const SbString &c) โ€” sets the instance prefix to c ๐Ÿ”ค
  • static void setTraceRefs (SbBool trace) โ€” toggles ref tracing with trace ๐Ÿ›
  • static SbBool getTraceRefs (void) โ€” reads the ref-tracing setting ๐Ÿ›
  • static SbBool connectRoute (SoInput *input, const SbName &fromnodename, const SbName &fromfieldname, const SbName &tonodename, const SbName &tofieldname) โ€” wires a route from fromnodename.fromfieldname to tonodename.tofieldname ๐Ÿ”Œ
  • static SbBool readRoute (SoInput *input) โ€” reads a route ๐Ÿ“ฅ

๐Ÿ“ Public Attributes ๐Ÿ“

  • SoMFVec2f point โ€” the multi-field of 2D vectors holding the points. she's the main character here, honestly ๐Ÿ‘‘

๐Ÿงš Protected Member Functions ๐Ÿงš

  • virtual const SoFieldData * getFieldData (void) const โ€” the field data ๐Ÿ—ƒ๏ธ
  • virtual ~SoVRMLTextureCoordinate () โ€” the destructor, protected, so don't just delete her directly ๐Ÿ™ˆ

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

  • SoNode (void) โ€” the SoNode constructor ๐Ÿ—๏ธ
  • virtual ~SoNode () โ€” the SoNode destructor โšฐ๏ธ
  • virtual SbBool readInstance (SoInput *in, unsigned short flags) โ€” reads an instance from in with flags ๐Ÿ“ฅ

๐ŸŒŸ Protected Member Functions inherited from SoFieldContainer ๐ŸŒŸ

  • SoFieldContainer (void) โ€” the SoFieldContainer constructor ๐Ÿ—๏ธ
  • virtual ~SoFieldContainer () โ€” the SoFieldContainer destructor โšฐ๏ธ

๐ŸŒŸ Protected Member Functions inherited from SoBase ๐ŸŒŸ

  • SoBase (void) โ€” the SoBase constructor ๐Ÿ—๏ธ
  • virtual ~SoBase () โ€” the SoBase destructor โšฐ๏ธ
  • virtual void destroy (void) โ€” destroys her ๐Ÿ’ฅ
  • SbBool hasMultipleWriteRefs (void) const โ€” got multiple write refs? ๐Ÿ–‡๏ธ
  • SbBool writeHeader (SoOutput *out, SbBool isgroup, SbBool isengine) const โ€” writes the header with isgroup and isengine ๐Ÿท๏ธ
  • void writeFooter (SoOutput *out) const โ€” writes the footer ๐Ÿ”ป
  • virtual const char * getFileFormatName (void) const โ€” the file format name ๐Ÿ“„
  • virtual SoNotRec createNotRec (void) โ€” creates a notification record ๐Ÿ“

๐Ÿฆ‹ Static Protected Member Functions ๐Ÿฆ‹

  • static const SoFieldData ** getFieldDataPtr (void) โ€” the field data pointer ๐Ÿ—ƒ๏ธ

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

  • static const SoFieldData ** getFieldDataPtr (void) โ€” the field data pointer ๐Ÿ—ƒ๏ธ
  • static void setNextActionMethodIndex (int index) โ€” sets the next action method index to index ๐Ÿ“‡
  • static int getNextActionMethodIndex (void) โ€” reads the next action method index ๐Ÿ“‡
  • static void incNextActionMethodIndex (void) โ€” bumps the next action method index โฌ†๏ธ
  • static void setCompatibilityTypes (const SoType &nodetype, const uint32_t bitmask) โ€” sets compatibility types for nodetype with bitmask ๐Ÿงฉ

๐ŸŒŸ Static Protected Member Functions inherited from SoBase ๐ŸŒŸ

  • static uint32_t getCurrentWriteCounter (void) โ€” reads the current write counter ๐Ÿ”ข
  • static void staticDataLock (void) โ€” locks the static data ๐Ÿ”’
  • static void staticDataUnlock (void) โ€” unlocks the static data ๐Ÿ”“

๐Ÿ’œ Additional Inherited Members ๐Ÿ’œ

๐ŸŒŸ 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, COIN_4_0 = 0x20000 } โ€” the whole node-type roster, every flag present and accounted for ๐ŸŒˆ

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

  • enum BaseFlags { IS_ENGINE = 0x01, IS_GROUP = 0x02 } โ€” the base flags ๐Ÿšฉ

๐ŸŒŸ Protected Attributes inherited from SoNode ๐ŸŒŸ

  • SbUniqueId uniqueId โ€” the unique id ๐Ÿ†”

๐ŸŒŸ Protected Attributes inherited from SoFieldContainer ๐ŸŒŸ

  • SbBool isBuiltIn โ€” the built-in flag ๐Ÿ 

๐ŸŒŸ Static Protected Attributes inherited from SoNode ๐ŸŒŸ

  • static SbUniqueId nextUniqueId = 1 โ€” next unique id starts at 1 โœจ
  • static int nextActionMethodIndex = 0 โ€” next action method index starts at 0 โœจ

๐Ÿ’Œ that's the end of part 1, bestie โ€” stay tuned, there's more ๐Ÿ’–

โœจ DETAILED DESCRIPTION โœจ

The SoVRMLTextureCoordinate class binds texture coordinates to vertex-based geometry. bestie that's literally its whole job and it does it flawlessly ๐Ÿ’…

The detailed class documentation is taken verbatim from the VRML97 standard (ISO/IEC 14772-1:1997). It is copyright The Web3D Consortium, and is used by permission of the Consortium:

TextureCoordinate {
  exposedField MFVec2f point  []      # (-inf, inf)
}

The TextureCoordinate node specifies a set of 2D texture coordinates used by vertex-based geometry nodes (e.g., SoVRMLIndexedFaceSet and SoVRMLElevationGrid) to map textures to vertices. Textures are two dimensional colour functions that, given an (s, t) coordinate, return a colour value colour(s, t). Texture map values (SoVRMLImageTexture, SoVRMLMovieTexture, and SoVRMLPixelTexture) range from [0.0, 1.0] along the S-axis and T-axis. However, TextureCoordinate values, specified by the point field, may be in the range (-inf,inf). Texture coordinates identify a location (and thus a colour value) in the texture map. The horizontal coordinate s is specified first, followed by the vertical coordinate t.

If the texture map is repeated in a given direction (S-axis or T-axis), a texture coordinate C (s or t) is mapped into a texture map that has N pixels in the given direction as follows:

Texture map location = (C - floor(C)) ร— N

If the texture map is not repeated, the texture coordinates are clamped to the 0.0 to 1.0 range as follows:

Texture map location = N, if C > 1.0,
                     = 0.0, if C < 0.0,
                     = C ร— N, if 0.0 <= C <= 1.0.

Details on repeating textures are specific to texture map node types described in SoVRMLImageTexture, SoVRMLMovieTexture, and SoVRMLPixelTexture.


๐ŸŽ€ CONSTRUCTOR & DESTRUCTOR DOCUMENTATION ๐ŸŽ€

SoVRMLTextureCoordinate::SoVRMLTextureCoordinate (void )

Constructor. it's giving new-beginning energy โœจ

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

Destructor. bye bestie ๐Ÿฆ‹


๐Ÿ’– MEMBER FUNCTION DOCUMENTATION ๐Ÿ’–

SoType SoVRMLTextureCoordinate::getClassTypeId (void ) [static]

This static method returns the SoType object associated with objects of this class.

SoType SoVRMLTextureCoordinate::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.

Implements SoBase.

const SoFieldData ** SoVRMLTextureCoordinate::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. iykyk ๐Ÿ™ˆ

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

const SoFieldData * SoVRMLTextureCoordinate::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 SoFieldContainer.

void SoVRMLTextureCoordinate::initClass (void ) [static]

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

This function performs the typical operation of a node for any action.

Reimplemented from SoNode.

void SoVRMLTextureCoordinate::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.

Reimplemented from SoNode.

void SoVRMLTextureCoordinate::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.

Reimplemented from SoNode.

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

Action method for SoPickAction.

Does common processing for SoPickAction action instances.

Reimplemented from SoNode.

void SoVRMLTextureCoordinate::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 calculate their primitive count also override this method to change the relevant state variables.

Reimplemented from SoNode.


๐ŸŒˆ MEMBER DATA DOCUMENTATION ๐ŸŒˆ

SoMFVec2f SoVRMLTextureCoordinate::point

The texture coordinates. Empty by default.


๐Ÿ‘‘ AUTHOR ๐Ÿ‘‘

Generated automatically by Doxygen for Coin from the source code.


okay that's the whole page, bestie, you made it to the end ๐Ÿซถ this was Coin Version 4.0.10, dated Thu Jun 25 2026 00:00:00 โ€” so yeah, SoVRMLTextureCoordinate(3) is officially a wrap. go map some textures, you absolute icon ๐Ÿ’…โœจ

๐Ÿ“ฆ where this page comes from