001: /*
002: * $RCSfile: GLSLShaderProgram.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:21 $
029: * $State: Exp $
030: */
031:
032: package javax.media.j3d;
033:
034: /**
035: * The GLSLShaderProgram object is a concrete implementation of a
036: * ShaderProgram node component for the OpenGL GLSL shading language.
037: *
038: * @see SourceCodeShader
039: *
040: * @since Java 3D 1.4
041: */
042:
043: public class GLSLShaderProgram extends ShaderProgram {
044:
045: /**
046: * Constructs a GLSL shader program node component.
047: *
048: * <br>
049: * TODO: ADD MORE DOCUMENTATION HERE.
050: */
051: public GLSLShaderProgram() {
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: ((GLSLShaderProgramRetained) 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("GLSLShaderProgram0"));
077: }
078: }
079:
080: return ((GLSLShaderProgramRetained) this .retained)
081: .getVertexAttrNames();
082:
083: }
084:
085: // Implement abstract setShaderAttrNames method (inherit javadoc from parent class)
086: public void setShaderAttrNames(String[] shaderAttrNames) {
087: checkForLiveOrCompiled();
088:
089: if (shaderAttrNames != null) {
090: for (int i = 0; i < shaderAttrNames.length; i++) {
091: if (shaderAttrNames[i] == null) {
092: throw new NullPointerException();
093: }
094: }
095: }
096:
097: ((GLSLShaderProgramRetained) this .retained)
098: .setShaderAttrNames(shaderAttrNames);
099: }
100:
101: // Implement abstract getShaderAttrNames method (inherit javadoc from parent class)
102: public String[] getShaderAttrNames() {
103:
104: if (isLiveOrCompiled()) {
105: if (!this .getCapability(ALLOW_NAMES_READ)) {
106: throw new CapabilityNotSetException(J3dI18N
107: .getString("GLSLShaderProgram0"));
108: }
109: }
110:
111: return ((GLSLShaderProgramRetained) this .retained)
112: .getShaderAttrNames();
113:
114: }
115:
116: /**
117: * Copies the specified array of shaders into this shader
118: * program. This method makes a shallow copy of the array. The
119: * array of shaders may be null or empty (0 length), but the
120: * elements of the array must be non-null. The shading language of
121: * each shader in the array must be
122: * <code>SHADING_LANGUAGE_GLSL</code>. Each shader in the array must
123: * be a SourceCodeShader.
124: *
125: * @param shaders array of Shader objects to be copied into this
126: * ShaderProgram
127: *
128: * @exception CapabilityNotSetException if appropriate capability is
129: * not set and this object is part of live or compiled scene graph
130: *
131: * @exception IllegalArgumentException if the shading language of
132: * any shader in the shaders array is <em>not</em>
133: * <code>SHADING_LANGUAGE_GLSL</code>.
134: *
135: * @exception ClassCastException if any shader in the shaders
136: * array is <em>not</em> a SourceCodeShader.
137: *
138: * @exception NullPointerException if any element in the
139: * shaders array is null.
140: */
141: public void setShaders(Shader[] shaders) {
142: checkForLiveOrCompiled();
143:
144: if (shaders != null) {
145: // Check shaders for valid shading language and class type
146: for (int i = 0; i < shaders.length; i++) {
147: if (shaders[i].getShadingLanguage() != Shader.SHADING_LANGUAGE_GLSL) {
148: throw new IllegalArgumentException(J3dI18N
149: .getString("GLSLShaderProgram2"));
150: }
151:
152: // Try to cast shader to SourceCodeShader; it will throw
153: // ClassCastException if it isn't.
154: SourceCodeShader shad = (SourceCodeShader) shaders[i];
155: }
156:
157: }
158:
159: ((GLSLShaderProgramRetained) this .retained).setShaders(shaders);
160: }
161:
162: // Implement abstract getShaders method (inherit javadoc from parent class)
163: public Shader[] getShaders() {
164:
165: if (isLiveOrCompiled()) {
166: if (!this .getCapability(ALLOW_SHADERS_READ)) {
167: throw new CapabilityNotSetException(J3dI18N
168: .getString("GLSLShaderProgram1"));
169: }
170: }
171:
172: return ((GLSLShaderProgramRetained) this .retained).getShaders();
173: }
174:
175: /**
176: * Creates a retained mode GLSLShaderProgramRetained object that this
177: * GLSLShaderProgram component object will point to.
178: */
179: void createRetained() {
180: this .retained = new GLSLShaderProgramRetained();
181: this.retained.setSource(this);
182: }
183:
184: }
|