001: /*
002: * $RCSfile: CgShaderProgram.java,v $
003: *
004: * Copyright 2004-2008 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
006: *
007: * This code is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU General Public License version 2 only, as
009: * published by the Free Software Foundation. Sun designates this
010: * particular file as subject to the "Classpath" exception as provided
011: * by Sun in the LICENSE file that accompanied this code.
012: *
013: * This code is distributed in the hope that it will be useful, but WITHOUT
014: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
015: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
016: * version 2 for more details (a copy is included in the LICENSE file that
017: * accompanied this code).
018: *
019: * You should have received a copy of the GNU General Public License version
020: * 2 along with this work; if not, write to the Free Software Foundation,
021: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
022: *
023: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
024: * CA 95054 USA or visit www.sun.com if you need additional information or
025: * have any questions.
026: *
027: * $Revision: 1.5 $
028: * $Date: 2008/02/28 20:17:20 $
029: * $State: Exp $
030: */
031:
032: package javax.media.j3d;
033:
034: /**
035: * The CgShaderProgram object is a concrete implementation of a
036: * ShaderProgram node component for NVIDIA's Cg shader language.
037: *
038: * @see SourceCodeShader
039: *
040: * @since Java 3D 1.4
041: */
042:
043: public class CgShaderProgram extends ShaderProgram {
044:
045: /**
046: * Constructs a Cg shader program node component.
047: *
048: * <br>
049: * TODO: ADD MORE DOCUMENTATION HERE.
050: */
051: public CgShaderProgram() {
052: }
053:
054: // Implement abstract setVertexAttrNames method (inherit javadoc from parent class)
055: public void setVertexAttrNames(String[] vertexAttrNames) {
056: checkForLiveOrCompiled();
057:
058: if (vertexAttrNames != null) {
059: for (int i = 0; i < vertexAttrNames.length; i++) {
060: if (vertexAttrNames[i] == null) {
061: throw new NullPointerException();
062: }
063: }
064: }
065:
066: ((CgShaderProgramRetained) this .retained)
067: .setVertexAttrNames(vertexAttrNames);
068: }
069:
070: // Implement abstract getVertexAttrNames method (inherit javadoc from parent class)
071: public String[] getVertexAttrNames() {
072:
073: if (isLiveOrCompiled()) {
074: if (!this .getCapability(ALLOW_NAMES_READ)) {
075: throw new CapabilityNotSetException(J3dI18N
076: .getString("CgShaderProgram0"));
077: }
078: }
079:
080: return ((CgShaderProgramRetained) this .retained)
081: .getVertexAttrNames();
082: }
083:
084: // Implement abstract setShaderAttrNames method (inherit javadoc from parent class)
085: public void setShaderAttrNames(String[] shaderAttrNames) {
086: checkForLiveOrCompiled();
087:
088: if (shaderAttrNames != null) {
089: for (int i = 0; i < shaderAttrNames.length; i++) {
090: if (shaderAttrNames[i] == null) {
091: throw new NullPointerException();
092: }
093: }
094: }
095:
096: ((CgShaderProgramRetained) this .retained)
097: .setShaderAttrNames(shaderAttrNames);
098: }
099:
100: // Implement abstract getShaderAttrNames method (inherit javadoc from parent class)
101: public String[] getShaderAttrNames() {
102:
103: if (isLiveOrCompiled()) {
104: if (!this .getCapability(ALLOW_NAMES_READ)) {
105: throw new CapabilityNotSetException(J3dI18N
106: .getString("CgShaderProgram0"));
107: }
108: }
109:
110: return ((CgShaderProgramRetained) this .retained)
111: .getShaderAttrNames();
112: }
113:
114: /**
115: * Copies the specified array of shaders into this shader
116: * program. This method makes a shallow copy of the array. The
117: * array of shaders may be null or empty (0 length), but the
118: * elements of the array must be non-null. The shading language of
119: * each shader in the array must be
120: * <code>SHADING_LANGUAGE_CG</code>. Each shader in the array must
121: * be a SourceCodeShader. There must be no more than one vertex shader
122: * and one fragment shader in the array.
123: *
124: * @param shaders array of Shader objects to be copied into this
125: * ShaderProgram
126: *
127: * @exception CapabilityNotSetException if appropriate capability is
128: * not set and this object is part of live or compiled scene graph
129: *
130: * @exception IllegalArgumentException if the shading language of
131: * any shader in the shaders array is <em>not</em>
132: * <code>SHADING_LANGUAGE_CG</code>.
133: *
134: * @exception IllegalArgumentException if there are more than one
135: * vertex shader or more than one fragment shader in the shaders
136: * array.
137: *
138: * @exception ClassCastException if any shader in the shaders
139: * array is <em>not</em> a SourceCodeShader.
140: */
141: public void setShaders(Shader[] shaders) {
142: checkForLiveOrCompiled();
143:
144: if (shaders != null) {
145: // Check shaders for valid shading language, class type, etc.
146: for (int i = 0; i < shaders.length; i++) {
147: boolean hasVertexShader = false;
148: boolean hasFragmentShader = false;
149:
150: // Check shading language
151: if (shaders[i].getShadingLanguage() != Shader.SHADING_LANGUAGE_CG) {
152: throw new IllegalArgumentException(J3dI18N
153: .getString("CgShaderProgram2"));
154: }
155:
156: // Check for more than one vertex shader or fragment shader
157: if (shaders[i].getShaderType() == Shader.SHADER_TYPE_VERTEX) {
158: if (hasVertexShader) {
159: throw new IllegalArgumentException(J3dI18N
160: .getString("CgShaderProgram3"));
161: }
162: hasVertexShader = true;
163: } else { // Shader.SHADER_TYPE_FRAGMENT
164: if (hasFragmentShader) {
165: throw new IllegalArgumentException(J3dI18N
166: .getString("CgShaderProgram4"));
167: }
168: hasFragmentShader = true;
169: }
170:
171: // Try to cast shader to SourceCodeShader; it will throw
172: // ClassCastException if it isn't.
173: SourceCodeShader shad = (SourceCodeShader) shaders[i];
174: }
175: }
176:
177: ((CgShaderProgramRetained) this .retained).setShaders(shaders);
178: }
179:
180: // Implement abstract getShaders method (inherit javadoc from parent class)
181: public Shader[] getShaders() {
182: if (isLiveOrCompiled()) {
183: if (!this .getCapability(ALLOW_SHADERS_READ)) {
184: throw new CapabilityNotSetException(J3dI18N
185: .getString("CgShaderProgram1"));
186: }
187: }
188:
189: return ((CgShaderProgramRetained) this .retained).getShaders();
190: }
191:
192: /**
193: * Creates a retained mode CgShaderProgramRetained object that this
194: * CgShaderProgram component object will point to.
195: */
196: void createRetained() {
197: this .retained = new CgShaderProgramRetained();
198: this.retained.setSource(this);
199: }
200:
201: }
|