File: SoTextureCoordinateBundle.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 (169 lines) | stat: -rw-r--r-- 6,847 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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/*
 *
 *  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 SoTextureCoordinateBundle class.
 |
 |   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_TEXTURE_COORDINATE_BUNDLE
#define  _SO_TEXTURE_COORDINATE_BUNDLE

#include <Inventor/bundles/SoBundle.h>
#include <Inventor/elements/SoGLTextureCoordinateElement.h>
#include <Inventor/misc/SoState.h>

//////////////////////////////////////////////////////////////////////////////
//
//  Class: SoTextureCoordinateBundle
//
//  Bundle that allows shapes to deal with texture coordinates more
//  easily. This class provides a fairly simple interface to texture
//  coordinate handling, including default texture coordinate
//  generation. This can be used during either rendering or primitive
//  generation.
//
//  This class can be used during either rendering or primitive
//  generation. For primitive generation, there are two cases,
//  distinguished by the flag returned by isFunction(). If this
//  flag is TRUE, the texture coordinates are to be generated using
//  the get(point, normal) method, which uses a software texture
//  coordinate function. (This process is also used for texture
//  coordinates that are generated by default when necessary - in this
//  case, the function does a linear map across two sides of the
//  bounding box of the shape.) If the isFunction() flag is FALSE, the
//  coordinates are accessed directly from the element using the
//  get(index) method.
//
//  For GL rendering, there is an additional case. If
//  needCoordinates() returns FALSE, no texture coordinates need to be
//  sent at all, and the bundle does not have to be used for anything
//  else. Otherwise, send(index) should be used.
//
//////////////////////////////////////////////////////////////////////////////

SoEXTENDER class SoTextureCoordinateBundle : public SoBundle {

  public:
    // Constructor - takes the action the bundle is used for and a
    // flag to indicate whether the bundle is being used for
    // rendering. If this is TRUE, the bundle can be used to send
    // texture coordinates to GL. If it is FALSE, the setUpDefault
    // flag (default TRUE) indicates whether to set up a texture
    // coordinate function if the binding is DEFAULT. Shapes can pass
    // FALSE here if they are picking and want to delay computation of
    // the texture coordinates until an intersection is found.
    SoTextureCoordinateBundle(SoAction *action, SbBool forRendering,
			      SbBool setUpDefault = TRUE);

    // Destructor
    ~SoTextureCoordinateBundle();

    // Returns TRUE if texture coordinates are needed at all
    SbBool		needCoordinates() const	{ return needCoords; }

    // return value to determine which get() to use.
    SbBool		isFunction() const	{ return isFunc; }

    // Returns texture coordinate computed by function during
    // primitive generation or rendering
    SbVec4f 		get(const SbVec3f &point, const SbVec3f &normal) const
	{ return texCoordElt->get(point, normal); }

    // Returns indexed texture coordinate during primitive generation
    // or rendering
    SbVec4f	 	get(int index) const
	{ if (tCoords) return(SbVec4f(tCoords[index][0],tCoords[index][1],
			0.0, 1.0)); 
		else return texCoordElt->get4(index); }

    // Sends indexed texture coordinate to GL during rendering
    void		send(int index) const	{ GLTexCoordElt->send(index); }

  private:
    // TextureCoordinate elements:
    const SoTextureCoordinateElement	*texCoordElt;
    const SoGLTextureCoordinateElement	*GLTexCoordElt;

    SbBool		needCoords;	// Texture coordinates are needed
    SbBool		isFunc;		// Coordinates generated by function
    SbBool		isRendering;	// Bundle being used for rendering
    SbBool		setFunction;	// We set default coord func in state

    // These indicate the dimensions used for S and T for default
    // texture coordinate generation
    int			coordS, coordT;
    // These hold the vectors used for default texture coordinate generation
    SbVec4f		sVector, tVector;
    // This holds the texture coords from a vertexProperty node:
    const SbVec2f *	tCoords;

    // Sets up bundle for primitive generation or rendering
    void		setUpForPrimGen(SoAction *action,
					SbBool setUpDefault);
    void		setUpForGLRender(SoAction *action);

    // Sets up for default texture coordinate generation
    void		setUpDefaultCoordSpace(SoAction *action);

    // Callback registered with SoTextureCoordinateElement for
    // computing texture coordinate from point and normal - used for
    // default coordinate generation. The userData arg will be "this".
    static const SbVec4f &generateCoord(void *userData,
					const SbVec3f &point,
					const SbVec3f &normal);
    
    // Callback registered with SoGLTextureCoordinateElement for
    // setting up GL texture generation for default coordinates. The
    // userData arg will be "this".
    static void		setUpTexGen(void *userData);
};

#endif /* _SO_TEXTURE_COORDINATE_BUNDLE */