Open Inventor Release 2024.1.0
 
Loading...
Searching...
No Matches
SoGLRenderAction.h
Go to the documentation of this file.
1/*=======================================================================
2 * Copyright 1991-1996, Silicon Graphics, Inc.
3 * ALL RIGHTS RESERVED
4 *
5 * UNPUBLISHED -- Rights reserved under the copyright laws of the United
6 * States. Use of a copyright notice is precautionary only and does not
7 * imply publication or disclosure.
8 *
9 * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND:
10 * Use, duplication or disclosure by the Government is subject to restrictions
11 * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights
12 * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or
13 * in similar or successor clauses in the FAR, or the DOD or NASA FAR
14 * Supplement. Contractor/manufacturer is Silicon Graphics, Inc.,
15 * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311.
16 *
17 * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY
18 * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION,
19 * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY
20 * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON
21 * GRAPHICS, INC.
22**=======================================================================*/
23/*=======================================================================
24** Author : Paul S. Strauss (MMM yyyy)
25**=======================================================================*/
26/*=======================================================================
27 *** THE CONTENT OF THIS WORK IS PROPRIETARY TO FEI S.A.S, (FEI S.A.S.), ***
28 *** AND IS DISTRIBUTED UNDER A LICENSE AGREEMENT. ***
29 *** ***
30 *** REPRODUCTION, DISCLOSURE, OR USE, IN WHOLE OR IN PART, OTHER THAN AS ***
31 *** SPECIFIED IN THE LICENSE ARE NOT TO BE UNDERTAKEN EXCEPT WITH PRIOR ***
32 *** WRITTEN AUTHORIZATION OF FEI S.A.S. ***
33 *** ***
34 *** RESTRICTED RIGHTS LEGEND ***
35 *** USE, DUPLICATION, OR DISCLOSURE BY THE GOVERNMENT OF THE CONTENT OF THIS ***
36 *** WORK OR RELATED DOCUMENTATION IS SUBJECT TO RESTRICTIONS AS SET FORTH IN ***
37 *** SUBPARAGRAPH (C)(1) OF THE COMMERCIAL COMPUTER SOFTWARE RESTRICTED RIGHT ***
38 *** CLAUSE AT FAR 52.227-19 OR SUBPARAGRAPH (C)(1)(II) OF THE RIGHTS IN ***
39 *** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 52.227-7013. ***
40 *** ***
41 *** COPYRIGHT (C) 1996-2024 BY FEI S.A.S, ***
42 *** BORDEAUX, FRANCE ***
43 *** ALL RIGHTS RESERVED ***
44**=======================================================================*/
45/*=======================================================================
46** Modified by : VSG (MMM YYYY)
47**=======================================================================*/
48
49#ifndef _SO_GL_RENDER_ACTION_
50#define _SO_GL_RENDER_ACTION_
51
59
60#ifdef _MSC_VER
61#pragma warning( push )
62#pragma warning(disable:4251)
63#endif
64
65class SbBox3f;
67class SoGLDepthPeeling;
68class SoCache;
69class SoCamera;
70class SoSeparator;
71class SoGLRenderActionSync;
72class SoGLRenderActionImpl;
73
74
79typedef void SoGLRenderPassCB(void *userData);
80
82//
83// Class: SoGLRenderAction
84//
85// GL rendering action.
86//
88
190
192
193 public:
194
229 {
230SoDEPRECATED
233
243
259
266
303
304 };
305
369
376
381
386
390 DELAY
391 };
392
398 typedef AbortCode SoGLRenderAbortCB(void *userData);
399
420
425 SoGLRenderAction(const SbViewportRegion &viewportRegion);
426
427#ifndef HIDDEN_FROM_DOC
428 // Destructor
429 virtual ~SoGLRenderAction();
430#endif // HIDDEN_FROM_DOC
431
435 void setViewportRegion(const SbViewportRegion &newRegion);
436
440 const SbViewportRegion &getViewportRegion() const { return vpRegion; }
441
446 void setLogicalViewportRegion(const SbViewportRegion &newLogicalRegion);
447
452
461 void setUpdateArea(const SbVec2f &origin, const SbVec2f &size);
462
466 void getUpdateArea(SbVec2f &origin, SbVec2f &size) const;
467
476 void setAbortCallback(SoGLRenderAbortCB *func, void *userData)
477 { abortCB = func; abortData = userData; }
478
513
519 { return m_transpType; }
520
530 void setFastEditSavePolicy(FastEditSavePolicy policy, SbBool fastEditDelayedObjects = FALSE);
531
536 { return m_fastEditPolicy; }
537SoDEPRECATED
548 void setSmoothing(SbBool smooth);
549SoDEPRECATED
554 SbBool isSmoothing() const { return doSmooth; }
555
571 void setNumPasses(int num);
572
576 int getNumPasses() const { return numPasses; }
577
582 void setPassUpdate(SbBool flag) { passUpdate = flag; }
583
591 SbBool isPassUpdate() const { return passUpdate; }
592
598 void setPassCallback(SoGLRenderPassCB *func, void *userData)
599 { passCB = func; passData = userData; }
600
609 void setCacheContext(uint32_t context);
610
614 uint32_t getCacheContext() const;
615
620 static uint32_t generateCacheContext();
621
625 static bool isUsedCacheContext( uint32_t context );
626
653 { m_sortedLayersNumPasses = num; }
654
655
662 { return m_sortedLayersNumPasses ; }
663
670
687 void setAlphaTest( SbBool flag );
688
693 { return m_alphaTest; }
694
695
710
714 virtual void invalidateState();
715
722 float percentage = 1.0);
723
728
733 float getDecimationPercentage() { return decPercent; };
734
751
756
764 uint32_t getFrameCounter() const { return m_frameCounter; }
765
770 void resetFrameCounter( uint32_t count = 0 ) { m_frameCounter = count; }
771
773 virtual void apply(SoNode* node);
774
776 virtual void apply(SoPath* path);
777
779 virtual void apply(const SoPathList& pathList, SbBool obeysRules = FALSE);
780
794
801
802private:
804 inline bool isDoingDepthPeeling() const { return m_isDoingDepthPeeling; }
805
809 int getDepthPeelingPass();
810
815 void enableDepthPeeling3D(bool flag) const;
816
817 SoGLDepthPeeling* getDepthPeelingInterface() const;
818
819 // Returns current rendering pass number
820 int getCurPass() const { return curPass; }
821
822 // Returns TRUE if render action should abort - checks user callback
823 SbBool abortNow()
824 { return (hasTerminated() || (abortCB != NULL && checkAbort())); }
825
826 // Returns TRUE if render action handles processing of a
827 // transparent object (if it is to be sorted and rendered later).
828 // If this returns FALSE, the object should just go ahead and
829 // render itself.
830 // The optional argument isTransparent ensures that the object being
831 // rendered will be taken as transparent, regardless of transparency
832 // in the state. If it is false, the state is checked for transparency.
833 virtual SbBool handleTransparency(SbBool isTransparent = FALSE, SbBool isLinesOrPoints = FALSE);
834
836 virtual void setUpState();
837
842 void setDelayedObjDepthWrite( SbBool flag ) { m_delayedObjDepthWrite = flag; }
843
848 SbBool getDelayedObjDepthWrite() const { return m_delayedObjDepthWrite; }
849
856 virtual bool preDelayedTraversal();
857
864 virtual void postDelayedTraversal();
865
871 void setCache( SoCache* cache );
872
874 SoCache* getCache() const;
875
876 private:
877 static void initClass();
878 static void exitClass();
879
881 inline bool isFloatingPointFramebuffer() const { return m_floatingPointFramebuffer; }
882 inline void setFloatingPointFramebuffer(bool flag) { m_floatingPointFramebuffer = flag; }
883
884 // Returns TRUE if rendering is being delayed because of transparency sorting or delaying
885 SbBool isDelaying() const { return delayObjs; }
886
887 // Returns true if the current state contains any transparency
888 bool stateContainsTransparency() const;
889
890 // Used in SoLocateHighlight in order to clear the transparent path cache
891 void removeAllDelayedPath();
892
893 bool isTraversalPassTransparent() const;
894
895 bool handleFastEdit(SoSeparator* sep);
896
897 int getCullTestResults() { return cullBits; }
898 void setCullTestResults(int b) { cullBits = b; }
899
900 SbBool isLogicalRegionSet() const;
901
902 void setTiledViewportRegion(const SbVec4f& region, int info = 0);
903
908 void setMaxDepthOffset(float maxDepthOffset);
909
910/* FAST EDIT METHODS*/
911 // set the buffer type.
912 void setDoubleBuffer(SbBool db);
913 // The main scene must be redrawn.
914 void setForceRender();
915 // Set viewing mode (from viewer).
916 void setViewing(SbBool viewing);
917 // Is there any delayed object to render ?
918 SbBool hasDelayedNodesToRender() const;
919 // initialize the start of a stereo pass.
920 void setFirstStereoPass(SbBool first);
921
922 SoPathList transpPaths; // Keep for compatibility. should be removed in OIV 9.2
923
924 void setRenderingFromOffscreen(SbBool renderFromOffscreen)
925 { m_renderingFromOffscreen = renderFromOffscreen; }
926
927 SbBool getRenderingFromOffscreen() const
928 { return m_renderingFromOffscreen; }
929
930 //Return true after an apply if there were transparent objects
931 //(used in SoLocateHighlight in order to redraw the whole scene only in this case)
932 SbBool hasDrawnTransparentObjs() const
933 { return m_hasDrawnTransparentObjs; }
934
935 // Set the fullscene antialiasing element
936 void setFullSceneAntialiasingElement( SbBool enable, int filterMask );
937
939 enum RenderMode {
943 ALL_OBJECTS,
947 OPAQUE_OBJECTS,
951 DELAYED_OBJECTS
952 };
953
954 //
955 // Allow to restrict which object will be render during the next ::render call.
956 // After the ::render call, this mode is reset to its default value.
957 // Note : this is used by ScaleViz Depth compositing to manage delayed object.
958 void setRestrictObjectRenderingMode( const RenderMode mode = ALL_OBJECTS )
959 { m_restrictObjectRendering = mode; };
960
961 int getRestrictObjectRenderingMode() const
962 { return m_restrictObjectRendering; };
963
964 SoGLRenderActionSync* getSynchronizer() const;
965 void setSynchronizer( SoGLRenderActionSync* );
966
967 virtual void updateParametersFrom( SoGLRenderAction* );
968 SoGLRenderPassCB* getPassCallback( void*& data )
969 {
970 data = passData;
971 return passCB;
972 }
973
974 SoGLRenderActionImpl* getImpl();
975
976 // Used to temporary change the depth peeling interface, used
977 // for depth only. Returns the value in use before the call.
978 SoGLDepthPeeling* setDepthPeelingInterface(SoGLDepthPeeling*);
979
980 bool isFastEditManipulating();
981
982 SoPathList delayedPaths; // Keep for compatibility. should be removed in OIV 9.2
983
989 bool isLazyEvaluating() const { return m_lazyEvaluating; }
990 void setLazyEvaluating(bool value) { m_lazyEvaluating = value; }
991
992 void copyParametersFrom( SoGLRenderAction* action );
993
994 SoViewport* getViewportNode() const
995 {
996 return m_viewport.ptr();
997 }
998
999 // These flags determine which things have to be sent to GL when
1000 // the action is applied. They indicate what's changed since the
1001 // last time the action was applied.
1002 enum flags {
1003 TRANSPARENCY_TYPE = 0x01,
1004 SMOOTHING = 0x02,
1005 ALPHA_TEST = 0x04,
1006 FASTEDIT_SAVE_POLICY = 0x08,
1007 SCENE_GRAPH = 0x10,
1008 ANTIALIASING = 0x20,
1009 ALL = 0x3F // Initial value
1010 };
1011
1012private:
1013 // Initiates action on graph
1014 virtual void beginTraversal(SoNode *node);
1015
1016SoINTERNAL private:
1017 // used internally to temporary change the fastEditPolicy without reseting any caches
1018 void setFastEditSavePolicyInternal(FastEditSavePolicy policy)
1019 { m_fastEditPolicy = policy; }
1020
1021 // used internally to temporary change the transparencyType without reseting any caches
1022 void setTransparencyTypeInternal(TransparencyType type)
1023 { m_transpType = type; }
1024
1025 uint32_t getWhatChanged() const
1026 {
1027 return whatChanged;
1028 }
1029
1030private:
1031
1033 template<typename ApplyType> void commonApply(ApplyType applyObject, SbBool obeysRules);
1034
1036 template<typename ApplyType> void applyTo(ApplyType applyObject, SbBool obeysRules);
1037
1038 SoGLRenderActionSync* m_synchronizer;
1039
1040 FastEditSavePolicy m_fastEditPolicy; // Transparency quality type
1041 TransparencyType m_transpType; // Transparency quality type
1042
1046 void removeInvalidPaths();
1047
1049 bool m_isDoingDepthPeeling;
1050
1051 SbBool m_hasDrawnTransparentObjs;
1052 SbBool m_isViewing;
1053 SoNode* m_appliedNode;
1054 SbBool m_isFirstApply;
1055 SbBool m_firstStereoPass;
1056 int m_lastStereoMode;
1057
1058 int m_useCacheOpt;
1059 int m_useCompactPaths;
1060
1061 SbViewportRegion vpRegion; // Current viewport region
1062
1063 // super viewport node that manage viewport, modify viewport and logical viewport
1064 SoRef<SoViewport> m_viewport;
1065
1069 SoRef<SoNode> m_maxDepthOffset;
1070
1071 SbVec2f updateOrigin; // Origin of update area
1072 SbVec2f updateSize; // Size of update area
1073
1074
1075 // Variables for render abort:
1076 SoGLRenderAbortCB *abortCB; // Callback to test abort
1077 void *abortData; // User data for abort callback
1078
1079 // Variables for transparency, smoothing, and multi-pass rendering:
1080 SbBool doSmooth; // Doing smoothing ?
1081 int numPasses; // Number of rendering passes
1082 int curPass; // Current pass
1083 SbBool passUpdate; // Whether to update after each pass
1084 SoGLRenderPassCB *passCB; // Callback between passes
1085 void *passData; // User data for pass callback
1086
1087 // For SORTED_OBJECT transparency:
1088 SbBool delayObjs; // TRUE if transp objects are to be delayed until after opaque ones
1089
1090 SbBool remoteRendering;// Remote rendering?
1091
1092 // BA 2/98 - added decimation variables
1093 SoDecimationTypeElement::Type decType; // Decimation type
1094 float decPercent; // Decimation percentage
1095
1096 uint32_t whatChanged;
1097
1098 // Enables or disables GL blending
1099 void enableBlending(SbBool enable);
1100
1101 // Enables or disables GL smoothing
1102 void enableSmoothing(SbBool enable);
1103
1104 // Returns TRUE if render action should abort based on callback
1105 SbBool checkAbort();
1106
1107 // Keep track of which planes we need to view-volume cull test
1108 // against:
1109 int cullBits;
1110
1111 SbBool m_delayedObjDepthWrite;
1112
1113 // Indicates if the next render is asked for Offscreen
1114 SbBool m_renderingFromOffscreen;
1115
1116 SbBool m_alphaTest;
1117
1118 // Count frames rendered with this action (for debugging)
1119 uint32_t m_frameCounter;
1120
1121 // indicate if action is currently called to evaluate lazy eval or for classical traversal.
1122 // See isLazyEvaluating() doc for details.
1123 bool m_lazyEvaluating;
1124
1125 //================== Begin sorted layers rendering ========================
1126
1127 int m_sortedLayersNumPasses ;
1128
1129 // Realizes a sorted layers rendering using depth peeling technics.
1130 void renderSortedLayers(SoNode *node) ;
1131 void initDepthPeeling(SoNode *node);
1132
1133 // Rendering callback for sorted layers rendering.
1134 static void renderSortedLayersCB(void *userData, SoGLDepthPeeling *mgr) ;
1135
1136 SoGLDepthPeeling *m_glDepthPeeling ;
1137
1138 static void cameraPostCB( SoCamera *camera, SoGLRenderAction* renderAction );
1139 bool m_ignoreCameraPostCB;
1140 //================== End Sorted layers rendering ========================
1141
1142
1143 InvalidateCacheMode m_invalidateAllCaches;
1144 RenderMode m_restrictObjectRendering;
1145
1146 bool m_floatingPointFramebuffer;
1147
1148 //================ FSAA element management ============================
1149 SbBool m_fsaaEnable;
1150 int m_fsaaFilterMask;
1151
1152 SoGLRenderActionImpl* m_impl;
1153};
1154
1155
1156// INLINE METHODS
1157inline SoGLRenderActionSync* SoGLRenderAction::getSynchronizer() const
1158{
1159 return m_synchronizer;
1160}
1161
1162inline SoGLRenderActionImpl* SoGLRenderAction::getImpl()
1163{
1164 return m_impl;
1165}
1166
1167#ifdef _MSC_VER
1168#pragma warning( pop )
1169#endif
1170#endif /* _SO_GL_RENDER_ACTION_ */
1171
#define SoINTERNAL
#define FALSE
Possible value of SbBool.
Definition SbBase.h:75
void SoGLRenderPassCB(void *userData)
Callback functions used between rendering passes should be of this type.
virtual void enable(QWidget *w, XtEventHandler f, XtPointer data, void *unused=NULL)
#define SO_ACTION_HEADER(className)
Definition SoSubAction.h:69
3D box class.
Definition SbBox.h:649
2D vector class.
Definition SbVec.h:76
4D vector class.
Definition SbVec.h:2214
Class for representing a viewport.
Abstract base class for all actions.
Definition SoAction.h:132
SbBool hasTerminated() const
Returns TRUE if the traversal has reached a termination condition.
Definition SoAction.h:430
Abstract base class for camera nodes.
Definition SoCamera.h:188
Type
These are the available decimation types.
Renders a scene graph using Open Inventor's Render Engine.
AbortCode
Possible return codes from a render abort callback.
@ DELAY
Delay rendering of this node until the second pass.
@ ABORT
Stop traversing the rest of the graph.
@ PRUNE
Do not traverse this node or its children, but continue.
@ CONTINUE
Continue traversal as usual.
FastEditSavePolicy
Fast edit traversal types.
@ DISABLE
Fast editing is disabled.
@ WHEN_NEEDED
The fast edit feature is available.
@ EACH_FRAME
The fast edit feature is available.
float getDecimationPercentage()
Gets decimation percentage, the value should be a number between 0.0 and 1.0.
void setAlphaTest(SbBool flag)
Enable or disable the OpenGL alpha test for rendering.
int getSortedLayersNumPasses() const
Returns the number of rendering passes used when transparency type is SORTED_PIXEL.
AutoCacheMode
Two bits are stored.
InvalidateCacheMode
Invalidate cache mode.
@ OFF
(Default) Render caches are handled normally.
@ ONCE
Render caches are invalidated for each SoSeparator node before its children are traversed.
@ ALWAYS
Render caches are invalidated for each SoSeparator node before its children are traversed.
virtual void invalidateState()
Invalidate the state, forcing it to be recreated at the next apply.
const SbViewportRegion & getLogicalViewportRegion() const
Returns current logical viewport region.
static uint32_t generateCacheContext()
Generates and returns a new cache context id.
TransparencyType getTransparencyType() const
Returns transparency quality level to use when rendering.
virtual void apply(SoNode *node)
Initiates an action on the graph defined by a node.
SoDEPRECATED void setSmoothing(SbBool smooth)
Sets smoothing flag.
void setDecimationValue(SoDecimationTypeElement::Type type, float percentage=1.0)
Sets decimation percentage, the value should be a number between 0.0 and 1.0 Useful for reducing the ...
void setTransparencyType(TransparencyType type)
Sets global transparency algorithm to use when rendering.
SbBool isAlphaTest() const
Returns whether the OpenGL alpha test is enabled for rendering.
void setSortedLayersNumPasses(int num)
Sets the number of rendering passes used when transparency type is SORTED_PIXEL.
void setFastEditSavePolicy(FastEditSavePolicy policy, SbBool fastEditDelayedObjects=FALSE)
Sets fast editing save policy to use when rendering.
AbortCode SoGLRenderAbortCB(void *userData)
Callback functions for render abort should be of this type.
void setPassUpdate(SbBool flag)
Sets a flag indicating whether intermediate results are displayed after each antialiasing pass for pr...
void setAbortCallback(SoGLRenderAbortCB *func, void *userData)
Sets callback to call during rendering to test for an abort condition.
void setCacheContext(uint32_t context)
Sets the OpenGL cache context.
SoGLRenderAction(const SbViewportRegion &viewportRegion)
Constructor.
virtual void apply(const SoPathList &pathList, SbBool obeysRules=FALSE)
Initiates an action on the graph defined by a list of paths.
SoDEPRECATED SbBool isSmoothing() const
Returns smoothing flag.
void shouldAutoCache(AutoCacheMode mode)
Called by nodes to say that they should/shouldn't be auto-cached (pass TRUE if should,...
SbBool getRenderingIsRemote() const
Returns TRUE if remote rendering is being done.
void setLogicalViewportRegion(const SbViewportRegion &newLogicalRegion)
Sets current logical viewport region to use for rendering.
const SbViewportRegion & getViewportRegion() const
Returns viewport region to use for rendering.
void resetFrameCounter(uint32_t count=0)
Reset the frame counter.
TransparencyType
Transparency rendering algorithm.
@ OPAQUE_FIRST
Same as NO_SORT, but the rendering of opaque objects is performed before the rendering of semi-transp...
@ SORTED_PIXEL
Same as OPAQUE_FIRST, but uses a fragment-level depth sorting technique during the rendering of semi-...
@ NO_SORT
The simplest transparency mode.
@ SORTED_OBJECT
Same as OPAQUE_FIRST, but sorts semi-transparent objects by distances of bounding boxes from camera.
virtual void apply(SoPath *path)
Initiates an action on the graph defined by a path.
SoDecimationTypeElement::Type getDecimationType()
Gets decimation type.
uint32_t getCacheContext() const
Returns the OpenGL cache context id for this action.
uint32_t getFrameCounter() const
Returns the current frame counter.
void setPassCallback(SoGLRenderPassCB *func, void *userData)
Sets a callback function to invoke between passes when antialiasing.
static bool isUsedCacheContext(uint32_t context)
Returns TRUE if the specified cache context id is currently used by any SoGLRenderAction.
static SbBool isSortedLayersSupported(SoState *state=NULL)
Indicates if SORTED_PIXEL transparency is supported by your graphics board on the current context.
void setRenderingIsRemote(SbBool flag)
Sets whether or not "remote" rendering is done.
FastEditSavePolicy getFastEditSavePolicy() const
Returns fast editing save policy used when rendering.
SbBool isPassUpdate() const
Returns a flag indicating whether intermediate results are displayed after each antialiasing pass for...
InvalidateCacheMode getInvalidateCacheMode()
Returns the current cache invalidation mode.
void getUpdateArea(SbVec2f &origin, SbVec2f &size) const
Returns the current update area.
void setViewportRegion(const SbViewportRegion &newRegion)
Changes viewport region to use for rendering.
int getNumPasses() const
Gets number of rendering passes for multipass rendering.
void setNumPasses(int num)
Sets number of rendering passes for multipass antialiasing.
void setInvalidateCacheMode(InvalidateCacheMode icm)
Enables or disables the invalidation of render caches.
void setUpdateArea(const SbVec2f &origin, const SbVec2f &size)
Sets the current update area, which is the rectangular area of the viewport region that will actually...
Computes bounding box of a scene.
Abstract base class for all database nodes.
Definition SoNode.h:145
Path that points to a list of hierarchical nodes.
Definition SoPath.h:187
Maintains a list of pointers to paths.
Definition SoPathList.h:81
Smart pointer for any class inheriting SoRefCounter.
Definition SoRef.h:90
T * ptr() const
Cast to C pointer.
Definition SoRef.h:167
Group node that saves and restores traversal state.
Traversal state.
Definition SoState.h:74
<a href="IconLegend.html"><img src="extTGS.gif" alt="VSG extension" border="0"></a> Viewport paramet...
Definition SoViewport.h:103
int SbBool
Boolean type.
Definition SbBase.h:87
size_t size() const