SoVRMLIndexedFaceSet(3)

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

πŸ’– NAME πŸ’–

okay so bestie, SoVRMLIndexedFaceSet is the class you reach for when you need to represent a generic 3D shape. that's it, that's the whole vibe β€” it's the generic-shape icon of the VRML node world. no cap. πŸ‘‘


πŸ¦‹ SYNOPSIS πŸ¦‹

#include <Inventor/VRMLnodes/SoVRMLIndexedFaceSet.h>

Inherits SoVRMLIndexedShape.

so it doesn't just appear out of nowhere β€” it's got SoVRMLIndexedShape as its parent, and everything below is the family tree it drags along with it. buckle up, it's giving extended family reunion. 🫢


✨ Public Member Functions ✨

these are the ones that are hers, the main character functions:

virtual SoType getTypeId (void) const
SoVRMLIndexedFaceSet (void)
virtual void GLRender (SoGLRenderAction *action)
virtual void getPrimitiveCount (SoGetPrimitiveCountAction *action)
virtual SbBool generateDefaultNormals (SoState *s, SoNormalBundle *nb)
virtual SbBool generateDefaultNormals (SoState *state, SoNormalCache *nc)

a constructor, a type-id getter, some render/primitive-count action energy, and two whole overloads of generateDefaultNormals β€” one taking an SoNormalBundle *, one taking an SoNormalCache *. she contains multitudes. πŸ’…


🌸 Public Member Functions inherited from SoVRMLVertexShape 🌸

virtual void doAction (SoAction *action)
virtual void getBoundingBox (SoGetBoundingBoxAction *action)
virtual void callback (SoCallbackAction *action)
virtual void pick (SoPickAction *action)

🌈 Public Member Functions inherited from SoVRMLGeometry 🌈

virtual void search (SoSearchAction *action)
virtual void copyContents (const SoFieldContainer *from, SbBool copyConn)

⭐ Public Member Functions inherited from SoShape ⭐

virtual SbBool affectsState (void) const
virtual void rayPick (SoRayPickAction *action)
const SoBoundingBoxCache * getBoundingBoxCache (void) const

πŸ¦‹ Public Member Functions inherited from SoNode πŸ¦‹

this list is long bestie, but we do not skip. not one line. πŸ™ˆ

void setOverride (const SbBool state)
SbBool isOverride (void) const
void setNodeType (const NodeType type)
NodeType getNodeType (void) const
virtual SoNode * copy (SbBool copyconnections=FALSE) const
virtual void GLRenderBelowPath (SoGLRenderAction *action)
virtual void GLRenderInPath (SoGLRenderAction *action)
virtual void GLRenderOffPath (SoGLRenderAction *action)
virtual void getMatrix (SoGetMatrixAction *action)
virtual void handleEvent (SoHandleEventAction *action)
virtual void write (SoWriteAction *action)
virtual void audioRender (SoAudioRenderAction *action)
virtual void grabEventsSetup (void)
virtual void grabEventsCleanup (void)
virtual void startNotify (void)
uint32_t getNodeId (void) const
virtual void writeInstance (SoOutput *out)
virtual SoNode * addToCopyDict (void) const
virtual SoFieldContainer * copyThroughConnection (void) const

see what i mean? iconic behavior, honestly. πŸŽ€


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

void setToDefaults (void)
SbBool hasDefaultValues (void) const
SbBool fieldsAreEqual (const SoFieldContainer *container) const
void copyFieldValues (const SoFieldContainer *container, SbBool copyconnections=FALSE)
SbBool set (const char *const fielddata)
void get (SbString &fielddata)
virtual int getFields (SoFieldList &l) const
virtual int getAllFields (SoFieldList &l) const
virtual SoField * getField (const SbName &name) const
virtual SoField * getEventIn (const SbName &name) const
virtual SoField * getEventOut (const SbName &name) const
SbBool getFieldName (const SoField *const field, SbName &name) const
SbBool enableNotify (const SbBool flag)
SbBool isNotifyEnabled (void) const
SbBool set (const char *fielddata, SoInput *input)
void get (SbString &fielddata, SoOutput *out)
virtual SbBool validateNewFieldValue (SoField *field, void *newval)
virtual void addWriteReference (SoOutput *out, SbBool isfromfield=FALSE)
SbBool getIsBuiltIn (void) const
virtual void getFieldsMemorySize (size_t &managed, size_t &unmanaged) const
void setUserData (void *userdata) const
void * getUserData (void) const

πŸ“ Public Member Functions inherited from SoBase πŸ“

void ref (void) const
void unref (void) const
void unrefNoDelete (void) const
int32_t getRefCount (void) const
void touch (void)
SbBool isOfType (SoType type) const
virtual SbName getName (void) const
virtual void setName (const SbName &newname)
void addAuditor (void *const auditor, const SoNotRec::Type type)
void removeAuditor (void *const auditor, const SoNotRec::Type type)
const SoAuditorList & getAuditors (void) const
SbBool shouldWrite (void)
void assertAlive (void) const

the ref/unref girlies are in the building. πŸ‘‘


🧚 Static Public Member Functions 🧚

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

πŸ’« Static Public Member Functions inherited from SoVRMLIndexedShape πŸ’«

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

✨ Static Public Member Functions inherited from SoVRMLVertexShape ✨

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

🌸 Static Public Member Functions inherited from SoVRMLGeometry 🌸

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)
static float getDecimatedComplexity (SoState *state, float complexity)

⭐ Static Public Member Functions inherited from SoNode ⭐

static uint32_t getCompatibilityTypes (const SoType &nodetype)
static SoType getClassTypeId (void)
static SoNode * getByName (const SbName &name)
static int getByName (const SbName &name, SoNodeList &l)
static void initClass (void)
static void initClasses (void)
static uint32_t getNextNodeId (void)
static int getActionMethodIndex (const SoType type)
static void getBoundingBoxS (SoAction *action, SoNode *node)
static void GLRenderS (SoAction *action, SoNode *node)
static void callbackS (SoAction *action, SoNode *node)
static void getMatrixS (SoAction *action, SoNode *node)
static void handleEventS (SoAction *action, SoNode *node)
static void pickS (SoAction *action, SoNode *node)
static void rayPickS (SoAction *action, SoNode *node)
static void searchS (SoAction *action, SoNode *node)
static void writeS (SoAction *action, SoNode *node)
static void audioRenderS (SoAction *action, SoNode *node)
static void getPrimitiveCountS (SoAction *action, SoNode *node)

all those little …S static wrappers? yeah, they're all here. no skips. πŸ’…


πŸ¦‹ Static Public Member Functions inherited from SoFieldContainer πŸ¦‹

static void initClass (void)
static SoType getClassTypeId (void)
static void cleanupClass (void)
static void initCopyDict (void)
static void addCopy (const SoFieldContainer *orig, const SoFieldContainer *copy)
static SoFieldContainer * checkCopy (const SoFieldContainer *orig)
static SoFieldContainer * findCopy (const SoFieldContainer *orig, const SbBool copyconnections)
static void copyDone (void)

πŸ’œ 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)
static void removeName (SoBase *const base, const char *const name)
static void incrementCurrentWriteCounter (void)
static void decrementCurrentWriteCounter (void)
static SoBase * getNamedBase (const SbName &name, SoType type)
static int getNamedBases (const SbName &name, SoBaseList &baselist, SoType type)
static SbBool read (SoInput *input, SoBase *&base, SoType expectedtype)
static void setInstancePrefix (const SbString &c)
static void setTraceRefs (SbBool trace)
static SbBool getTraceRefs (void)
static SbBool connectRoute (SoInput *input, const SbName &fromnodename, const SbName &fromfieldname, const SbName &tonodename, const SbName &tofieldname)
static SbBool readRoute (SoInput *input)

πŸŽ€ Public Attributes πŸŽ€

these are the fields that are actually hers, the ones you'll be setting and vibing with:

SoSFBool ccw
SoSFBool solid
SoSFBool convex
SoSFFloat creaseAngle

🌟 Public Attributes inherited from SoVRMLIndexedShape 🌟

SoMFInt32 coordIndex
SoMFInt32 colorIndex
SoMFInt32 normalIndex
SoMFInt32 texCoordIndex

πŸ“ Public Attributes inherited from SoVRMLVertexShape πŸ“

SoSFNode coord
SoSFNode texCoord
SoSFNode normal
SoSFNode color
SoSFBool colorPerVertex
SoSFBool normalPerVertex

🧚 Protected Member Functions 🧚

the ones that are kinda private but in a publicly documented way, yk? iykyk:

virtual const SoFieldData * getFieldData (void) const
virtual ~SoVRMLIndexedFaceSet ()
virtual void generatePrimitives (SoAction *action)

πŸ’« Protected Member Functions inherited from SoVRMLIndexedShape πŸ’«

SoVRMLIndexedShape (void)
virtual ~SoVRMLIndexedShape ()
virtual void computeBBox (SoAction *action, SbBox3f &box, SbVec3f &center)
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)

look at that getVertexData signature. it's long. she's committed. 😭


🌸 Protected Member Functions inherited from SoVRMLVertexShape 🌸

SoVRMLVertexShape (void)
virtual ~SoVRMLVertexShape ()
virtual SbBool shouldGLRender (SoGLRenderAction *action)
void setNormalCache (SoState *s, int numNormals, SbVec3f *normals)
SoNormalCache * getNormalCache (void) const
SoNormalCache * generateAndReadLockNormalCache (SoState *const state)
void getVertexData (SoState *state, const SoCoordinateElement *&coords, const SbVec3f *&normals, const SbBool neednormals)
void readLockNormalCache (void)
void readUnlockNormalCache (void)

🌈 Protected Member Functions inherited from SoVRMLGeometry 🌈

SoVRMLGeometry (void)
virtual ~SoVRMLGeometry ()
void setupShapeHints (SoState *state, const SbBool ccw, const SbBool solid)
virtual SoChildList * getChildren (void) const

and bestie… that's just the start πŸ‘€ more coming, don't go anywhere.

🫢 Protected Member Functions inherited from SoShape

Okay so bestie, these are the little helpers SoShape passes down to you. You didn't have to write them, you just get to have them, like a bestie who always has a hair tie:

  • SoShape (void) β€” the constructor, doing constructor things πŸ’…
  • virtual ~SoShape () β€” the destructor. It's virtual, so it knows the assignment.
  • float getComplexityValue (SoAction *action) β€” takes an SoAction * called action, hands you back a float.
  • void beginSolidShape (SoGLRenderAction *action) β€” starts the solid shape era. Takes the SoGLRenderAction *.
  • void endSolidShape (SoGLRenderAction *action) β€” and this is how that era ends. Same action, same energy.
  • void GLRenderBoundingBox (SoGLRenderAction *action) β€” bounding box, GL render, you know the drill.
  • SbBool shouldPrimitiveCount (SoGetPrimitiveCountAction *action) β€” returns an SbBool, takes the SoGetPrimitiveCountAction *. Asking the question of the century.
  • SbBool shouldRayPick (SoRayPickAction *const action) β€” same vibe, different action: SoRayPickAction *const.
  • void computeObjectSpaceRay (SoRayPickAction *const action) β€” object space ray, computed, no notes.
  • void computeObjectSpaceRay (SoRayPickAction *const action, const SbMatrix &matrix) β€” okay so this is the overloaded one, and it also takes a const SbMatrix &matrix. Two of them. Twins. 🫢
  • virtual SoDetail * createTriangleDetail (SoRayPickAction *action, const SoPrimitiveVertex *v1, const SoPrimitiveVertex *v2, const SoPrimitiveVertex *v3, SoPickedPoint *pp) β€” three vertices walk into a bar (v1, v2, v3), plus pp. Returns SoDetail *, and it's virtual so πŸ‘€
  • virtual SoDetail * createLineSegmentDetail (SoRayPickAction *action, const SoPrimitiveVertex *v1, const SoPrimitiveVertex *v2, SoPickedPoint *pp) β€” same but a line segment, so just two vertices. v1, v2, pp. Slay.
  • virtual SoDetail * createPointDetail (SoRayPickAction *action, const SoPrimitiveVertex *v, SoPickedPoint *pp) β€” one single v. Main character energy, honestly.
  • void invokeTriangleCallbacks (SoAction *const action, const SoPrimitiveVertex *const v1, const SoPrimitiveVertex *const v2, const SoPrimitiveVertex *const v3) β€” note the *const everywhere. They're committed. We love commitment.
  • void invokeLineSegmentCallbacks (SoAction *const action, const SoPrimitiveVertex *const v1, const SoPrimitiveVertex *const v2) β€” two vertices, all the consts.
  • void invokePointCallbacks (SoAction *const action, const SoPrimitiveVertex *const v) β€” just v. Iconic, minimal.
  • void beginShape (SoAction *const action, const TriangleShape shapetype, SoDetail *const detail=NULL) β€” and yes, the default is detail=NULL, exactly like that. TriangleShape is the type of shapetype.
  • void shapeVertex (const SoPrimitiveVertex *const v) β€” one vertex, const twice over, as it deserves.
  • void endShape (void) β€” the end. Periodt.
  • void generateVertex (SoPrimitiveVertex *const pv, const SbVec3f &point, const SbBool useTexFunc, const SoTextureCoordinateElement *const tce, const float s, const float t, const SbVec3f &normal) β€” this one is long long. pv, point, useTexFunc, tce, s, t, normal. That's the whole squad.
  • 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) β€” the overload! Same as above but with an extra const float r before normal. R for extra.
  • SbBool startVertexArray (SoGLRenderAction *action, const SoCoordinateElement *coords, const SbVec3f *pervertexnormals, const SbBool texpervertex, const SbBool colorpervertex) β€” starting the vertex array. Returns SbBool because it's got opinions.
  • void finishVertexArray (SoGLRenderAction *action, const SbBool vbo, const SbBool normpervertex, const SbBool texpervertex, const SbBool colorpervertex) β€” finishing what the other one started. Four whole SbBools in there. Ate. πŸ”₯

🌸 Protected Member Functions inherited from SoNode

  • SoNode (void) β€” constructor, but make it node.
  • virtual ~SoNode () β€” destructor, also virtual. Consistency is a love language.
  • virtual SbBool readInstance (SoInput *in, unsigned short flags) β€” reads the instance, takes an SoInput *in and unsigned short flags. Returns SbBool, and yep, it's virtual.

πŸŽ€ Protected Member Functions inherited from SoFieldContainer

  • SoFieldContainer (void) β€” constructor ✨
  • virtual ~SoFieldContainer () β€” destructor, virtual again, we stay consistent.

πŸ¦‹ Protected Member Functions inherited from SoBase

  • SoBase (void) β€” the base-est constructor.
  • virtual ~SoBase () β€” its destructor.
  • virtual void destroy (void) β€” destroy, void, virtual. Dramatic and correct.
  • SbBool hasMultipleWriteRefs (void) const β€” note the trailing const. It's not going to change for you.
  • SbBool writeHeader (SoOutput *out, SbBool isgroup, SbBool isengine) const β€” writes the header, takes out, isgroup, isengine, and stays const the whole time.
  • void writeFooter (SoOutput *out) const β€” the header's other half. Also const.
  • virtual const char * getFileFormatName (void) const β€” returns const char *, it's virtual, and it's const. Three for three.

⭐ Static Protected Member Functions

  • static const SoFieldData ** getFieldDataPtr (void) β€” that's a pointer to a pointer to const SoFieldData. Yes, really. No cap.

🌈 Static Protected Member Functions inherited from SoVRMLIndexedShape

  • static const SoFieldData ** getFieldDataPtr (void) β€” same signature, different ancestor. Family trait.

πŸ’œ Static Protected Member Functions inherited from SoVRMLVertexShape

  • static const SoFieldData ** getFieldDataPtr (void) β€” bestie it's still the same one, just one more level up the tree.

🫧 Static Protected Member Functions inherited from SoVRMLGeometry

  • static const SoFieldData ** getFieldDataPtr (void) β€” yep. Same. 😭

πŸ“ Static Protected Member Functions inherited from SoShape

  • static const SoFieldData ** getFieldDataPtr (void) β€” we're still going. Same signature. It's a whole lineage.

🧚 Static Protected Member Functions inherited from SoNode

  • static const SoFieldData ** getFieldDataPtr (void) β€” okay the last one of these, promise.
  • static void setNextActionMethodIndex (int index) β€” sets it. Takes an int index.
  • static int getNextActionMethodIndex (void) β€” gets it. Returns int. The setter and the getter, a duo.
  • static void incNextActionMethodIndex (void) β€” increments it. No args, all vibes.
  • static void setCompatibilityTypes (const SoType &nodetype, const uint32_t bitmask) β€” takes const SoType &nodetype and const uint32_t bitmask. Very typed. Very serious.

πŸ‘‘

Static Protected Member Functions inherited from SoBase

  • static uint32_t getCurrentWriteCounter (void) β€” returns a uint32_t.
  • static void staticDataLock (void) β€” lock it up πŸ”’
  • static void staticDataUnlock (void) β€” and unlock it. Balance.

πŸ’– Additional Inherited Members

Extra stuff you inherit that isn't a function. Still yours. Still real.

πŸ‘‘ Public Types inherited from SoVRMLVertexShape

The binding enum, in full, and I'm not trimming a single value:

enum Binding { OVERALL = SoMaterialBindingElement::OVERALL, PER_PART =
    SoMaterialBindingElement::PER_PART, PER_PART_INDEXED =
    SoMaterialBindingElement::PER_PART_INDEXED, PER_FACE =
    SoMaterialBindingElement::PER_FACE, PER_FACE_INDEXED =
    SoMaterialBindingElement::PER_FACE_INDEXED, PER_VERTEX =
    SoMaterialBindingElement::PER_VERTEX, PER_VERTEX_INDEXED =
    SoMaterialBindingElement::PER_VERTEX_INDEXED }

Seven values. Every single one mapped to its SoMaterialBindingElement:: counterpart. That's the whole menu, bestie. πŸ’…

✨ Public Types inherited from SoShape

Nine shapes, nine moods:

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

TRIANGLE_STRIP, TRIANGLE_FAN, TRIANGLES, POLYGON, QUADS, QUAD_STRIP, POINTS, LINES, LINE_STRIP. Pick your fighter.

🌟 Public Types inherited from SoNode

The node type flags. There are a lot of them and every single one has a hex value:

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 }

Powers of two all the way down, 0x0000 through 0x10000, plus EXTENSION = 0x0200 sitting in there doing its thing. Bit flags, but make it fashion.

πŸŽ€ Protected Types inherited from SoBase

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

Two flags. IS_ENGINE is 0x01, IS_GROUP is 0x02. Short, sweet, protected.

🌸 Protected Attributes inherited from SoNode

  • uint32_t uniqueId β€” one attribute, one type, one very on-the-nose name.

πŸ’œ Protected Attributes inherited from SoFieldContainer

  • SbBool isBuiltIn β€” an SbBool named isBuiltIn. Asking the real questions.

🫢 Static Protected Attributes inherited from SoNode

  • static uint32_t nextUniqueId = 1 β€” it starts at 1, not 0. Noted.
  • static int nextActionMethodIndex = 0 β€” and this one starts at 0. They're different, bestie, don't mix them up.

πŸ’– DETAILED DESCRIPTION πŸ’–

The SoVRMLIndexedFaceSet class is your girl for representing a generic 3D shape. Periodt. ✨

Okay so real talk, bestie: the detailed class documentation here is taken verbatim from the VRML97 standard (ISO/IEC 14772-1:1997). It's copyright The Web3D Consortium, and it's used by permission of the Consortium. Respect the elders. 🫢

IndexedFaceSet {
  eventIn       MFInt32 set_colorIndex
  eventIn       MFInt32 set_coordIndex
  eventIn       MFInt32 set_normalIndex
  eventIn       MFInt32 set_texCoordIndex
  exposedField  SFNode  color             NULL
  exposedField  SFNode  coord             NULL
  exposedField  SFNode  normal            NULL
  exposedField  SFNode  texCoord          NULL
  field         SFBool  ccw               TRUE
  field         MFInt32 colorIndex        []        # [-1,)
  field         SFBool  colorPerVertex    TRUE
  field         SFBool  convex            TRUE
  field         MFInt32 coordIndex        []        # [-1,)
  field         SFFloat creaseAngle       0         # [0,)
  field         MFInt32 normalIndex       []        # [-1,)
  field         SFBool  normalPerVertex   TRUE
  field         SFBool  solid             TRUE
  field         MFInt32 texCoordIndex     []        # [-1,)
}

So like, the IndexedFaceSet node represents a 3D shape that gets built by constructing faces (polygons, babe πŸ’…) from the vertices listed in the coord field. The coord field holds a Coordinate node, and that's what defines the 3D vertices that the coordIndex field points at. IndexedFaceSet uses the indices inside its coordIndex field to specify the polygonal faces by indexing into the coordinates in the Coordinate node. An index of "-1" means okay this face is done, next one starts now βœ‹. The last face may be (but does not have to be) followed by a "-1" index. If the greatest index in the coordIndex field is N, then the Coordinate node shall contain N+1 coordinates (indexed as 0 to N). And every single face of the IndexedFaceSet shall have:

  • at least three non-coincident vertices;
  • vertices that define a planar polygon;
  • vertices that define a non-self-intersecting polygon.

Otherwise? The results are undefined. 😭 No cap, don't do that.

The IndexedFaceSet node is specified in the local coordinate system and it gets affected by the transformations of its ancestors. Family trauma but make it geometry. 🧚

Descriptions of the coord, normal, and texCoord fields live in the SoVRMLCoordinate, SoVRMLNormal, and SoVRMLTextureCoordinate nodes, respectively. Go read those, iykyk. πŸ‘‘

Details on lighting equations and the interaction between the color field, normal field, textures, materials, and geometries are provided in 4.14, Lighting model.


🌸 THE color FIELD 🌸

If the color field is not NULL, it shall contain a Color node whose colours get applied to the vertices or faces of the IndexedFaceSet like this:

  • If colorPerVertex is FALSE, colours are applied to each face, as follows:
    • If the colorIndex field is not empty, then one colour is used for each face of the IndexedFaceSet. There shall be at least as many indices in the colorIndex field as there are faces in the IndexedFaceSet. If the greatest index in the colorIndex field is N, then there shall be N+1 colours in the Color node. The colorIndex field shall not contain any negative entries.
    • If the colorIndex field is empty, then the colours in the Color node are applied to each face of the IndexedFaceSet in order. There shall be at least as many colours in the Color node as there are faces.
  • If colorPerVertex is TRUE, colours are applied to each vertex, as follows:
    • If the colorIndex field is not empty, then colours are applied to each vertex of the IndexedFaceSet in exactly the same manner that the coordIndex field is used to choose coordinates for each vertex from the Coordinate node. The colorIndex field shall contain at least as many indices as the coordIndex field, and shall contain end-of-face markers (-1) in exactly the same places as the coordIndex field. If the greatest index in the colorIndex field is N, then there shall be N+1 colours in the Color node.
    • If the colorIndex field is empty, then the coordIndex field is used to choose colours from the Color node. If the greatest index in the coordIndex field is N, then there shall be N+1 colours in the Color node.

If the color field is NULL, the geometry shall be rendered normally using the Material and texture defined in the Appearance node (see 4.14, Lighting model, for details http://www.web3d.org/x3d/specifications/vrml/ISO-IEC-14772-VRML97/part1/concepts.html#4.6.5).


πŸ¦‹ THE normal FIELD πŸ¦‹

If the normal field is not NULL, it shall contain a Normal node whose normals get applied to the vertices or faces of the IndexedFaceSet in a manner exactly equivalent to what we just described above for applying colours to vertices/faces β€” where normalPerVertex corresponds to colorPerVertex and normalIndex corresponds to colorIndex. Matchy matchy. ✨

If the normal field is NULL, the browser shall automatically generate normals, using creaseAngle to determine if and how normals are smoothed across shared vertices (see 4.6.3.5, Crease angle field).


πŸ’œ THE texCoord FIELD πŸ’œ

If the texCoord field is not NULL, it shall contain a TextureCoordinate node. The texture coordinates in that node are applied to the vertices of the IndexedFaceSet as follows: if the texCoordIndex field is not empty, then it's used to choose texture coordinates for each vertex of the IndexedFaceSet in exactly the same manner that the coordIndex field is used to choose coordinates for each vertex from the Coordinate node. The texCoordIndex field shall contain at least as many indices as the coordIndex field, and shall contain end-of-face markers (-1) in exactly the same places as the coordIndex field. If the greatest index in the texCoordIndex field is N, then there shall be N+1 texture coordinates in the TextureCoordinate node.

If the texCoordIndex field is empty, then the coordIndex array is used to choose texture coordinates from the TextureCoordinate node. If the greatest index in the coordIndex field is N, then there shall be N+1 texture coordinates in the TextureCoordinate node.

If the texCoord field is NULL, a default texture coordinate mapping is calculated using the local coordinate system bounding box of the shape. The longest dimension of the bounding box defines the S coordinates, and the next longest defines the T coordinates. If two or all three dimensions of the bounding box are equal, ties shall be broken by choosing the X, Y, or Z dimension in that order of preference. The value of the S coordinate ranges from 0 to 1, from one end of the bounding box to the other. The T coordinate ranges between 0 and the ratio of the second greatest dimension of the bounding box to the greatest dimension. Figure 6.10 illustrates the default texture coordinates for a simple box shaped IndexedFaceSet with an X dimension twice as large as the Z dimension and four times as large as the Y dimension. Figure 6.11 illustrates the original texture image used on the IndexedFaceSet used in Figure 6.10.

Figure 6.10
Figure 6.11

Subclause 4.6.3, Shapes and geometry (http://www.web3d.org/x3d/specifications/vrml/ISO-IEC-14772-VRML97/part1/concepts.html#4.6.5), provides a description of the ccw, solid, convex, and creaseAngle fields.


πŸŽ€ Constructor & Destructor Documentation πŸŽ€

πŸ’… SoVRMLIndexedFaceSet::SoVRMLIndexedFaceSet (void )

Constructor. It's giving birth. πŸ‘‘

πŸ’… SoVRMLIndexedFaceSet::~SoVRMLIndexedFaceSet () [protected], [virtual]

Destructor. It's giving closure. πŸ¦‹

✨ MEMBER FUNCTION DOCUMENTATION ✨

πŸ¦‹ SoType SoVRMLIndexedFaceSet::getTypeId (void ) const β€” [virtual]

okay so this one hands you back the type identification of any object that descends from SoBase πŸ’… it's literally what makes run-time type checking and "downward" casting possible. iykyk.

Usage example, bestie β€” copy it exactly, don't freestyle:

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

so if you're an application programmer who wants to extend the library with new nodes, engines, nodekits, draggers or whatever else β€” this method needs to be overridden in all subclasses, no skipping πŸ™ˆ. usually you do that as part of setting up the whole type system for your extension classes, and honestly that's normally handled by the pre-defined macros you get from, like, Inventor/nodes/SoSubNode.h (that's SO_NODE_INIT_CLASS and SO_NODE_CONSTRUCTOR for node classes), Inventor/engines/SoSubEngine.h (for engine classes) and so on. macros ate, fr fr.

want more on writing Coin extensions? go read the class documentation of the toplevel superclasses for the various class groups πŸ‘‘

Reimplemented from SoVRMLIndexedShape.


🌸 const SoFieldData * SoVRMLIndexedFaceSet::getFieldData (void ) const β€” [protected], [virtual]

gives you a pointer to the class-wide field data storage object for this instance πŸŽ€ and if there are no fields present? it returns NULL. that's it, that's the whole vibe.

Reimplemented from SoVRMLIndexedShape.


πŸ”₯ void SoVRMLIndexedFaceSet::GLRender (SoGLRenderAction * action) β€” [virtual]

this is the action method for the SoGLRenderAction ✨ it gets called during rendering traversals. any node that influences the rendering state in literally any way, or that wants to throw geometry primitives at OpenGL, overrides this method. main character energy only πŸ’…

Reimplemented from SoVRMLVertexShape.


⭐ void SoVRMLIndexedFaceSet::getPrimitiveCount (SoGetPrimitiveCountAction * action) β€” [virtual]

action method for the SoGetPrimitiveCountAction 🫢 it calculates the number of triangle, line segment and point primitives for the node and adds these to the counters of the action. math girlies rise 🧚

and heads up: nodes that influence how geometry nodes calculate their primitive count also override this method to change the relevant state variables πŸ‘‘

Reimplemented from SoShape.


πŸ’œ SbBool SoVRMLIndexedFaceSet::generateDefaultNormals (SoState * s, SoNormalBundle * nb) β€” [virtual]

ngl, this API member is considered internal to the library, because it's not likely to be of interest to the application programmer. so like… not your problem bestie πŸ’€

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

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. important!!

Reimplemented from SoVRMLVertexShape.


🌈 SbBool SoVRMLIndexedFaceSet::generateDefaultNormals (SoState * s, SoNormalCache * nc) β€” [virtual]

same energy, different class ✨ this API member is considered internal to the library too, so again β€” not likely to be of interest to the application programmer, don't stress πŸŽ€

subclasses should override this method to generate default normals using the SoNormalCache class. and ok this one is more effective than using SoNormalGenerator, slay. return TRUE if normals were generated, FALSE otherwise.

default method just returns FALSE. lowkey iconic of it.

this function is an extension for Coin, and it is not available in the original SGI Open Inventor v2.1 API. same disclaimer, same energy πŸ¦‹

Reimplemented from SoVRMLVertexShape.


πŸ“ void SoVRMLIndexedFaceSet::generatePrimitives (SoAction * action) β€” [protected], [virtual]

this method implements action behavior for shape nodes for SoCallbackAction πŸ’– it gets invoked from SoShape::callback(). and listen β€” subclasses should not override SoNode::callback(). put that in your notes πŸ“

the subclass implementations use 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. chef's kiss, no notes.

Implements SoShape.


πŸŽ€ MEMBER DATA DOCUMENTATION πŸŽ€

SoSFBool SoVRMLIndexedFaceSet::ccw

specifies if vertex ordering is counterclockwise ✨ default value is TRUE.

SoSFBool SoVRMLIndexedFaceSet::solid

can be used to enable backface culling πŸ’… default value is TRUE.

SoSFBool SoVRMLIndexedFaceSet::convex

specifies if all polygons are convex 🌸 default value is TRUE.

SoSFFloat SoVRMLIndexedFaceSet::creaseAngle

specifies the crease angle for the generated normals πŸ¦‹ default value is 0.0.


πŸ‘‘ AUTHOR πŸ‘‘

generated automatically by Doxygen for Coin from the source code. so like, the robots wrote it, not me πŸ™ˆ


okay bestie that's the whole page, we made it πŸ’– every last function, every last default value, all of it. this lil manual page is Coin, Version 3.1.3, for SoVRMLIndexedFaceSet(3) β€” and yes i'm putting that in the sign-off because the footer deserves its moment too πŸ’…βœ¨ periodt.

πŸ“¦ where this page comes from