File: SoCache.h

package info (click to toggle)
inventor 2.1.5-10%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 35,712 kB
  • sloc: ansic: 33,864; lisp: 7,361; cpp: 3,874; yacc: 369; sh: 360; perl: 234; awk: 141; makefile: 80; csh: 35; sed: 11
file content (137 lines) | stat: -rw-r--r-- 4,734 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
 *
 *  Copyright (C) 2000 Silicon Graphics, Inc.  All Rights Reserved. 
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  Further, this software is distributed without any warranty that it is
 *  free of the rightful claim of any third person regarding infringement
 *  or the like.  Any license provided herein, whether implied or
 *  otherwise, applies only to this software file.  Patent licenses, if
 *  any, provided herein do not apply to combinations of this program with
 *  other software, or any other product whatsoever.
 * 
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
 *  Mountain View, CA  94043, or:
 * 
 *  http://www.sgi.com 
 * 
 *  For further information regarding this notice, see: 
 * 
 *  http://oss.sgi.com/projects/GenInfo/NoticeExplan/
 *
 */

//  -*- C++ -*-

/*
 * Copyright (C) 1990,91   Silicon Graphics, Inc.
 *
 _______________________________________________________________________
 ______________  S I L I C O N   G R A P H I C S   I N C .  ____________
 |
 |   $Revision: 1.1.1.1 $
 |
 |   Description:
 |	This file defines the abstract SoCache class, the base class
 |	for all caches in Inventor.
 |
 |   Author(s)		: Paul S. Strauss
 |
 ______________  S I L I C O N   G R A P H I C S   I N C .  ____________
 _______________________________________________________________________
 */

#ifndef  _SO_CACHE
#define  _SO_CACHE

////////////////////////////////////////////////////////////////////////
//
//  Class SoCache:
//
//  This is the base class for all types of caches. Each cache
//  maintains the following information:
//
//      A reference count, used to allow sharing of cache instances.
//      ref() and unref() methods increment and decrement the count.
//
//      An elements-used list. This is a list of elements used in the
//      cache that are set outside it. A cache is invalidated if any
//      of these elements has changed since the cache was created.
//      There is also an elements-flag array so we can quickly tell if
//      an element type has already been added to the elements-used
//      list.
//
////////////////////////////////////////////////////////////////////////

#include <Inventor/SoLists.h>

class SoElement;
class SoState;

SoEXTENDER class SoCache {

  public:

    // Constructor. Takes the state in effect when the cache is used;
    // it is assumed that the state is pushed before the cache is
    // created. 
    SoCache(SoState *state);

    // Reference/unreference
    void		ref();
    void		unref(SoState *state = NULL);

    // Adds an element to elements-used list if not already there
    void		addElement(const SoElement *elt);

    // Adds a dependency of this instance on another cache instance.
    // The default method takes care of adding dependencies from the
    // child cache.
    virtual void	addCacheDependency(const SoState *state,
					   SoCache *cache);

    // Returns TRUE if cache is valid with respect to the given state
    virtual SbBool	isValid(const SoState *state) const;

    // Assuming isValid() returns FALSE, this will return the first
    // element that is invalid (auto-caching uses this in its
    // heuristic).  Returns NULL if the cache is not invalid because
    // of an element or if the cache is valid.
    const SoElement *	getInvalidElement(const SoState *state) const;

    // Make this cache invalid
    void		invalidate();

  protected:
    // Subclasses can use this to clean up just before they are
    // deleted.  Render caches use this to free display lists.  Note
    // that the state will be NULL if the cache is no deleted during
    // the application of an action.
    virtual void	destroy(SoState *state);

    // Destructor
    virtual ~SoCache();

  private:
    SbPList		elementsUsed;		// Elements used in cache
    unsigned char	*elementsUsedFlags;	// Which elements on list

    int			refCount;		// Reference count
    int			invalidated;		// True if invalidate called
    int			depth;			// Depth of state
};

#endif /* _SO_CACHE */