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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
|
/*
* Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Sun designates this
* particular file as subject to the "Classpath" exception as provided
* by Sun in the LICENSE file that accompanied this code.
*
* This code 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 General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
* CA 95054 USA or visit www.sun.com if you need additional information or
* have any questions.
*
*/
package javax.media.j3d;
import java.util.Hashtable;
/**
* <p>The ShaderAppearance object defines programmable shading attributes
* that can be set as a component object of a Shape3D node. The
* ShaderAppearance rendering state adds the following attributes in
* addition to those defined by Appearance:</p>
*
* <ul>
* <li>Shader program - specifies the shader program...</li>
*
* <p></p>
* <li>Shader attribute set - specifies the shader parameters, both as
* explicit attributes and as implicit bindings to Java 3D
* state...</li>
* </ul>
*
* <p>The ShaderAppearance object modifies the definition of some of the
* attributes in Appearance:</p>
*
* <ul>
* <li>Coloring attributes - XXXXX</li>
*
* <p></p>
* <li>Line attributes - XXXXX</li>
*
* <p></p>
* <li>Point attributes - XXXXX</li>
*
* <p></p>
* <li>Polygon attributes - XXXXX</li>
*
* <p></p>
* <li>Rendering attributes - XXXXX</li>
*
* <p></p>
* <li>Transparency attributes - XXXXX</li>
*
* <p></p>
* <li>Material - XXXXX</li>
*
* <p></p>
* <li>Texture - XXXXX</li>
*
* <p></p>
* <li>Texture attributes - XXXXX</li>
*
* <p></p>
* <li>Texture coordinate generation - XXXXX</li>
*
* <p></p>
* <li>Texture unit state - XXXXX</li>
* </ul>
*
* @see ShaderProgram
* @see ShaderAttributeSet
*
* @since Java 3D 1.4
*/
public class ShaderAppearance extends Appearance {
/**
* Specifies that this ShaderAppearance object allows reading its
* ShaderProgram component information.
*/
public static final int
ALLOW_SHADER_PROGRAM_READ =
CapabilityBits.SHADER_APPEARANCE_ALLOW_SHADER_PROGRAM_READ;
/**
* Specifies that this ShaderAppearance object allows writing its
* ShaderProgram component information.
*/
public static final int
ALLOW_SHADER_PROGRAM_WRITE =
CapabilityBits.SHADER_APPEARANCE_ALLOW_SHADER_PROGRAM_WRITE;
/**
* Specifies that this ShaderAppearance object allows reading its
* ShaderAttributeSet component information.
*/
public static final int
ALLOW_SHADER_ATTRIBUTE_SET_READ =
CapabilityBits.SHADER_APPEARANCE_ALLOW_SHADER_ATTRIBUTE_SET_READ;
/**
* Specifies that this ShaderAppearance object allows writing its
* ShaderAttributeSet component information.
*/
public static final int
ALLOW_SHADER_ATTRIBUTE_SET_WRITE =
CapabilityBits.SHADER_APPEARANCE_ALLOW_SHADER_ATTRIBUTE_SET_WRITE;
// Array for setting default read capabilities
private static final int[] readCapabilities = {
ALLOW_SHADER_PROGRAM_READ,
ALLOW_SHADER_ATTRIBUTE_SET_READ
};
/**
* Constructs a ShaderAppearance component object using defaults for all
* state variables. All component object references are initialized
* to null.
*/
public ShaderAppearance() {
// Just use default values
// set default read capabilities
setDefaultReadCapabilities(readCapabilities);
}
/**
* Creates the retained mode ShaderAppearanceRetained object that this
* ShaderAppearance component object will point to.
*/
@Override
void createRetained() {
this.retained = new ShaderAppearanceRetained();
this.retained.setSource(this);
}
/**
* Sets the ShaderProgram object to the specified object. Setting it to
* null causes a default pass-through shader to be used ???
*
* @param shaderProgram object that specifies the desired shader program
* @exception CapabilityNotSetException if appropriate capability is
* not set and this object is part of live or compiled scene graph
*/
public void setShaderProgram(ShaderProgram shaderProgram) {
if (isLiveOrCompiled()) {
if(!this.getCapability(ALLOW_SHADER_PROGRAM_WRITE))
throw new CapabilityNotSetException(J3dI18N.getString("ShaderAppearance0"));
}
((ShaderAppearanceRetained)this.retained).setShaderProgram(shaderProgram);
}
/**
* Retrieves the current ShaderProgram object.
*
* @return the ShaderProgram object
* @exception CapabilityNotSetException if appropriate capability is
* not set and this object is part of live or compiled scene graph
*/
public ShaderProgram getShaderProgram() {
if (isLiveOrCompiled()) {
if(!this.getCapability(ALLOW_SHADER_PROGRAM_READ))
throw new CapabilityNotSetException(J3dI18N.getString("ShaderAppearance1"));
}
return ((ShaderAppearanceRetained)this.retained).getShaderProgram();
}
/**
* Sets the ShaderAttributeSet object to the specified object. Setting it to
* null is equivalent to specifying an empty set of attributes.
*
* @param shaderAttributeSet object that specifies the desired shader attributes
* @exception CapabilityNotSetException if appropriate capability is
* not set and this object is part of live or compiled scene graph
*/
public void setShaderAttributeSet(ShaderAttributeSet shaderAttributeSet) {
if (isLiveOrCompiled()) {
if(!this.getCapability(ALLOW_SHADER_ATTRIBUTE_SET_WRITE))
throw new CapabilityNotSetException(J3dI18N.getString("ShaderAppearance2"));
}
((ShaderAppearanceRetained)this.retained).setShaderAttributeSet(shaderAttributeSet);
}
/**
* Retrieves the current ShaderAttributeSet object.
*
* @return the ShaderAttributeSet object
* @exception CapabilityNotSetException if appropriate capability is
* not set and this object is part of live or compiled scene graph
*/
public ShaderAttributeSet getShaderAttributeSet() {
if (isLiveOrCompiled()) {
if(!this.getCapability(ALLOW_SHADER_ATTRIBUTE_SET_READ))
throw new CapabilityNotSetException(J3dI18N.getString("ShaderAppearance3"));
}
return ((ShaderAppearanceRetained)this.retained).getShaderAttributeSet();
}
/**
* @deprecated replaced with cloneNodeComponent(boolean forceDuplicate)
*/
@Override
public NodeComponent cloneNodeComponent() {
ShaderAppearance a = new ShaderAppearance();
a.duplicateNodeComponent(this);
return a;
}
/**
* NOTE: Applications should <i>not</i> call this method directly.
* It should only be called by the cloneNode method.
*
* @deprecated replaced with duplicateNodeComponent(
* NodeComponent originalNodeComponent, boolean forceDuplicate)
*/
@Override
public void duplicateNodeComponent(NodeComponent originalNodeComponent) {
checkDuplicateNodeComponent(originalNodeComponent);
}
/**
* Copies all ShaderAppearance information from
* <code>originalNodeComponent</code> into
* the current node. This method is called from the
* <code>cloneNode</code> method which is, in turn, called by the
* <code>cloneTree</code> method.<P>
*
* @param originalNodeComponent the original node to duplicate.
* @param forceDuplicate when set to <code>true</code>, causes the
* <code>duplicateOnCloneTree</code> flag to be ignored. When
* <code>false</code>, the value of each node's
* <code>duplicateOnCloneTree</code> variable determines whether
* NodeComponent data is duplicated or copied.
*
* @exception RestrictedAccessException if this object is part of a live
* or compiled scenegraph.
*
* @see Node#cloneTree
* @see NodeComponent#setDuplicateOnCloneTree
*/
@Override
void duplicateAttributes(NodeComponent originalNodeComponent,
boolean forceDuplicate) {
super.duplicateAttributes(originalNodeComponent, forceDuplicate);
Hashtable hashtable = originalNodeComponent.nodeHashtable;
ShaderAppearanceRetained app =
(ShaderAppearanceRetained) originalNodeComponent.retained;
ShaderAppearanceRetained rt = (ShaderAppearanceRetained) retained;
rt.setShaderProgram((ShaderProgram) getNodeComponent(app.getShaderProgram(),
forceDuplicate,
hashtable));
}
/**
* This function is called from getNodeComponent() to see if any of
* the sub-NodeComponents duplicateOnCloneTree flag is true.
* If it is the case, current NodeComponent needs to
* duplicate also even though current duplicateOnCloneTree flag is false.
* This should be overwrite by NodeComponent which contains sub-NodeComponent.
*/
@Override
boolean duplicateChild() {
if (super.duplicateChild())
return true;
if (getDuplicateOnCloneTree())
return true;
ShaderAppearanceRetained rt = (ShaderAppearanceRetained) retained;
NodeComponent nc;
nc = rt.getShaderProgram();
if ((nc != null) && nc.getDuplicateOnCloneTree())
return true;
return false;
}
}
|