SoVRMLIndexedFaceSet(3)
π 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 ¢er)
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'svirtual, so it knows the assignment.float getComplexityValue (SoAction *action)β takes anSoAction *calledaction, hands you back afloat.void beginSolidShape (SoGLRenderAction *action)β starts the solid shape era. Takes theSoGLRenderAction *.void endSolidShape (SoGLRenderAction *action)β and this is how that era ends. Sameaction, same energy.void GLRenderBoundingBox (SoGLRenderAction *action)β bounding box, GL render, you know the drill.SbBool shouldPrimitiveCount (SoGetPrimitiveCountAction *action)β returns anSbBool, takes theSoGetPrimitiveCountAction *. 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 aconst 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), pluspp. ReturnsSoDetail *, and it'svirtualso π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 singlev. Main character energy, honestly.void invokeTriangleCallbacks (SoAction *const action, const SoPrimitiveVertex *const v1, const SoPrimitiveVertex *const v2, const SoPrimitiveVertex *const v3)β note the*consteverywhere. They're committed. We love commitment.void invokeLineSegmentCallbacks (SoAction *const action, const SoPrimitiveVertex *const v1, const SoPrimitiveVertex *const v2)β two vertices, all theconsts.void invokePointCallbacks (SoAction *const action, const SoPrimitiveVertex *const v)β justv. Iconic, minimal.void beginShape (SoAction *const action, const TriangleShape shapetype, SoDetail *const detail=NULL)β and yes, the default isdetail=NULL, exactly like that.TriangleShapeis the type ofshapetype.void shapeVertex (const SoPrimitiveVertex *const v)β one vertex,consttwice 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 extraconst float rbeforenormal. R for extra.SbBool startVertexArray (SoGLRenderAction *action, const SoCoordinateElement *coords, const SbVec3f *pervertexnormals, const SbBool texpervertex, const SbBool colorpervertex)β starting the vertex array. ReturnsSbBoolbecause 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 wholeSbBools in there. Ate. π₯
πΈ Protected Member Functions inherited from SoNode
SoNode (void)β constructor, but make it node.virtual ~SoNode ()β destructor, alsovirtual. Consistency is a love language.virtual SbBool readInstance (SoInput *in, unsigned short flags)β reads the instance, takes anSoInput *inandunsigned short flags. ReturnsSbBool, and yep, it'svirtual.
π Protected Member Functions inherited from SoFieldContainer
SoFieldContainer (void)β constructor β¨virtual ~SoFieldContainer ()β destructor,virtualagain, 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 trailingconst. It's not going to change for you.SbBool writeHeader (SoOutput *out, SbBool isgroup, SbBool isengine) constβ writes the header, takesout,isgroup,isengine, and staysconstthe whole time.void writeFooter (SoOutput *out) constβ the header's other half. Alsoconst.virtual const char * getFileFormatName (void) constβ returnsconst char *, it'svirtual, and it'sconst. Three for three.
β Static Protected Member Functions
static const SoFieldData ** getFieldDataPtr (void)β that's a pointer to a pointer toconst 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 anint index.static int getNextActionMethodIndex (void)β gets it. Returnsint. 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)β takesconst SoType &nodetypeandconst uint32_t bitmask. Very typed. Very serious.
π
Static Protected Member Functions inherited from SoBase
static uint32_t getCurrentWriteCounter (void)β returns auint32_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β anSbBoolnamedisBuiltIn. Asking the real questions.
π«Ά Static Protected Attributes inherited from SoNode
static uint32_t nextUniqueId = 1β it starts at1, not0. Noted.static int nextActionMethodIndex = 0β and this one starts at0. 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
colorPerVertexisFALSE, colours are applied to each face, as follows:- If the
colorIndexfield is not empty, then one colour is used for each face of theIndexedFaceSet. There shall be at least as many indices in thecolorIndexfield as there are faces in theIndexedFaceSet. If the greatest index in thecolorIndexfield isN, then there shall beN+1colours in theColornode. ThecolorIndexfield shall not contain any negative entries. - If the
colorIndexfield is empty, then the colours in theColornode are applied to each face of theIndexedFaceSetin order. There shall be at least as many colours in theColornode as there are faces.
- If the
- If
colorPerVertexisTRUE, colours are applied to each vertex, as follows:- If the
colorIndexfield is not empty, then colours are applied to each vertex of theIndexedFaceSetin exactly the same manner that thecoordIndexfield is used to choose coordinates for each vertex from theCoordinatenode. ThecolorIndexfield shall contain at least as many indices as thecoordIndexfield, and shall contain end-of-face markers (-1) in exactly the same places as thecoordIndexfield. If the greatest index in thecolorIndexfield isN, then there shall beN+1colours in theColornode. - If the
colorIndexfield is empty, then thecoordIndexfield is used to choose colours from theColornode. If the greatest index in thecoordIndexfield isN, then there shall beN+1colours in theColornode.
- If the
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
- fedora 43: Coin3-devel 3.1.3-40.fc43 Β· GPL-2.0-only
- fedora 43: Coin3-devel 3.1.3-40.fc43 Β· GPL-2.0-only
- fedora 44: Coin3-devel 3.1.3-42.fc44 Β· GPL-2.0-only
- fedora 44: Coin3-devel 3.1.3-42.fc44 Β· GPL-2.0-only
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms