diff options
author | Harvey Harrison <[email protected]> | 2015-04-19 21:02:06 -0700 |
---|---|---|
committer | Harvey Harrison <[email protected]> | 2015-04-19 21:02:06 -0700 |
commit | 7a2e20caac9db6f789a7b3fab344b9758af45335 (patch) | |
tree | b5236ff2570178de356eab569225108948eb4d30 /src/javax/media/j3d/MaterialRetained.java | |
parent | f76ce302c4bb2a9f03bbee571ec5d05c29633023 (diff) |
j3dcore: flatten the directory structure a bit
Signed-off-by: Harvey Harrison <[email protected]>
Diffstat (limited to 'src/javax/media/j3d/MaterialRetained.java')
-rw-r--r-- | src/javax/media/j3d/MaterialRetained.java | 564 |
1 files changed, 564 insertions, 0 deletions
diff --git a/src/javax/media/j3d/MaterialRetained.java b/src/javax/media/j3d/MaterialRetained.java new file mode 100644 index 0000000..f900eee --- /dev/null +++ b/src/javax/media/j3d/MaterialRetained.java @@ -0,0 +1,564 @@ +/* + * Copyright 1997-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.ArrayList; + +import javax.vecmath.Color3f; + +/** + * The MaterialRetained object defines the appearance of an object under + * illumination. + */ +class MaterialRetained extends NodeComponentRetained { + // Initialize default values for all class variables + Color3f ambientColor = new Color3f(0.2f, 0.2f, 0.2f); + Color3f emissiveColor = new Color3f(0.0f, 0.0f, 0.0f); + Color3f diffuseColor = new Color3f(1.0f, 1.0f, 1.0f); + Color3f specularColor = new Color3f(1.0f, 1.0f, 1.0f); + float shininess = 64.0f; + int colorTarget = Material.DIFFUSE; + + // Lighting enable switch for this material object + boolean lightingEnable = true; + + // A list of pre-defined bits to indicate which component + // in this Material object changed. + static final int AMBIENT_COLOR_CHANGED = 0x01; + + static final int EMISSIVE_COLOR_CHANGED = 0x02; + + static final int DIFFUSE_COLOR_CHANGED = 0x04; + + static final int SPECULAR_COLOR_CHANGED = 0x08; + + static final int SHININESS_CHANGED = 0x10; + + static final int ENABLE_CHANGED = 0x20; + + static final int COLORTARGET_CHANGED = 0x40; + + /** + * Constructs and initializes a new material object using the specified + * parameters. + * @param ambientColor the material's ambient color + * @param emissiveColor the material's emissive color + * @param diffuseColor the material's diffuse color when illuminated by a + * light + * @param specularColor the material's specular color when illuminated + * to generate a highlight + * @param shininess the material's shininess in the + * range [1.0, 128.0] with 1.0 being not shiny and 128.0 being very shiny + */ + void createMaterial(Color3f aColor, + Color3f eColor, + Color3f dColor, + Color3f sColor, + float shine) + { + ambientColor.set(aColor); + emissiveColor.set(eColor); + diffuseColor.set(dColor); + specularColor.set(sColor); + shininess = shine; + } + + /** Initializes this material's ambient color + * This specifies how much ambient light is reflected by + * the surface. The ambient light color is the product of this + * color and the material diffuseColor. + * @param color the material's ambient color + */ + final void initAmbientColor(Color3f color) { + this.ambientColor.set(color); + } + + /** + * Sets this material's ambient color and sends a message notifying + * the interested structures of the change. + * This specifies how much ambient light is reflected by + * the surface. The ambient light color is the product of this + * color and the material diffuseColor. + * @param color the material's ambient color + */ + final void setAmbientColor(Color3f color) { + initAmbientColor(color); + sendMessage(AMBIENT_COLOR_CHANGED, new Color3f(color)); + } + + /** + * Sets this material's ambient color + * @param r the new ambient color's red component + * @param g the new ambient color's green component + * @param b the new ambient color's blue component + */ + final void initAmbientColor(float r, float g, float b) { + this.ambientColor.set(r, g, b); + } + + + /** + * Sets this material's ambient color and sends a message notifying + * the interested structures of the change. + * @param r the new ambient color's red component + * @param g the new ambient color's green component + * @param b the new ambient color's blue component + */ + final void setAmbientColor(float r, float g, float b) { + initAmbientColor(r, g, b); + sendMessage(AMBIENT_COLOR_CHANGED, new Color3f(r, g, b)); + } + + /** + * Retrieves this material's ambient color. + * @return the material's ambient color + */ + final void getAmbientColor(Color3f color) { + color.set(this.ambientColor); + } + + /** + * Sets this material's emissive color + * This is the color of light, if any, that the material emits. + * @param color the new emissive color + */ + final void initEmissiveColor(Color3f color) { + this.emissiveColor.set(color); + } + + /** + * Sets this material's emissive color and sends a message notifying + * the interested structures of the change. + * This is the color of light, if any, that the material emits. + * @param color the new emissive color + */ + final void setEmissiveColor(Color3f color) { + initEmissiveColor(color); + sendMessage(EMISSIVE_COLOR_CHANGED, new Color3f(color)); + } + + /** + * Sets this material's emissive color. + * This is the color of light, if any, that the material emits. + * @param r the new emissive color's red component + * @param g the new emissive color's green component + * @param b the new emissive color's blue component + */ + final void initEmissiveColor(float r, float g, float b) { + this.emissiveColor.set(r, g, b); + } + + /** + * Sets this material's emissive color and sends a message notifying + * the interested structures of the change. + * This is the color of light, if any, that the material emits. + * @param r the new emissive color's red component + * @param g the new emissive color's green component + * @param b the new emissive color's blue component + */ + final void setEmissiveColor(float r, float g, float b) { + initEmissiveColor(r, g, b); + sendMessage(EMISSIVE_COLOR_CHANGED, new Color3f(r, g, b)); + } + + /** + * Retrieves this material's emissive color and stores it in the + * argument provided. + * @param color the vector that will receive this material's emissive color + */ + final void getEmissiveColor(Color3f color) { + color.set(this.emissiveColor); + } + + /** + * Sets this material's diffuse color. + * This is the color of the material when illuminated by a light source. + * @param color the new diffuse color + */ + final void initDiffuseColor(Color3f color) { + this.diffuseColor.set(color); + } + + /** + * Sets this material's diffuse color and sends a message notifying + * the interested structures of the change. + * This is the color of the material when illuminated by a light source. + * @param color the new diffuse color + */ + final void setDiffuseColor(Color3f color) { + initDiffuseColor(color); + sendMessage(DIFFUSE_COLOR_CHANGED, new Color3f(color)); + } + + /** + * Sets this material's diffuse color. + * @param r the new diffuse color's red component + * @param g the new diffuse color's green component + * @param b the new diffuse color's blue component + */ + final void initDiffuseColor(float r, float g, float b) { + this.diffuseColor.set(r, g, b); + } + + /** + * Sets this material's diffuse color and sends a message notifying + * the interested structures of the change. + * @param r the new diffuse color's red component + * @param g the new diffuse color's green component + * @param b the new diffuse color's blue component + */ + final void setDiffuseColor(float r, float g, float b) { + initDiffuseColor(r, g, b); + sendMessage(DIFFUSE_COLOR_CHANGED, new Color3f(r, g, b)); + } + + /** + * Sets this material's diffuse color plus alpha. + * This is the color of the material when illuminated by a light source. + * @param r the new diffuse color's red component + * @param g the new diffuse color's green component + * @param b the new diffuse color's blue component + * @param a the alpha component used to set transparency + */ + final void initDiffuseColor(float r, float g, float b, float a) { + this.diffuseColor.set(r, g, b); + } + + /** + * Sets this material's diffuse color plus alpha and sends + * a message notifying the interested structures of the change. + * This is the color of the material when illuminated by a light source. + * @param r the new diffuse color's red component + * @param g the new diffuse color's green component + * @param b the new diffuse color's blue component + * @param a the alpha component used to set transparency + */ + final void setDiffuseColor(float r, float g, float b, float a) { + initDiffuseColor(r, g, b); + sendMessage(DIFFUSE_COLOR_CHANGED, new Color3f(r, g, b)); + } + + /** + * Retrieves this material's diffuse color. + * @param color the vector that will receive this material's diffuse color + */ + final void getDiffuseColor(Color3f color) { + color.set(this.diffuseColor); + } + + /** + * Sets this material's specular color. + * This is the specular highlight color of the material. + * @param color the new specular color + */ + final void initSpecularColor(Color3f color) { + this.specularColor.set(color); + } + + /** + * Sets this material's specular color and sends a message notifying + * the interested structures of the change. + * This is the specular highlight color of the material. + * @param color the new specular color + */ + final void setSpecularColor(Color3f color) { + initSpecularColor(color); + sendMessage(SPECULAR_COLOR_CHANGED, new Color3f(color)); + } + + /** + * Sets this material's specular color. + * This is the specular highlight color of the material. + * @param r the new specular color's red component + * @param g the new specular color's green component + * @param b the new specular color's blue component + */ + final void initSpecularColor(float r, float g, float b) { + this.specularColor.set(r, g, b); + } + + + /** + * Sets this material's specular color and sends a message notifying + * the interested structures of the change. + * This is the specular highlight color of the material. + * @param r the new specular color's red component + * @param g the new specular color's green component + * @param b the new specular color's blue component + */ + final void setSpecularColor(float r, float g, float b) { + initSpecularColor(r, g, b); + sendMessage(SPECULAR_COLOR_CHANGED, new Color3f(r, g, b)); + } + + /** + * Retrieves this material's specular color. + * @param color the vector that will receive this material's specular color + */ + final void getSpecularColor(Color3f color) { + color.set(this.specularColor); + } + + /** + * Sets this material's shininess. + * This specifies a material specular exponent, or shininess. + * It takes a floating point number in the range [1.0, 128.0] + * with 1.0 being not shiny and 128.0 being very shiny. + * @param shininess the material's shininess + */ + final void initShininess(float shininess) { + // Clamp shininess value + if (shininess < 1.0f) + this.shininess = 1.0f; + else if (shininess > 128.0f) + this.shininess = 128.0f; + else + this.shininess = shininess; + + } + + /** + * Sets this material's shininess and sends a message notifying + * the interested structures of the change. + * This specifies a material specular exponent, or shininess. + * It takes a floating point number in the range [1.0, 128.0] + * with 1.0 being not shiny and 128.0 being very shiny. + * @param shininess the material's shininess + */ + final void setShininess(float shininess) { + initShininess(shininess); + sendMessage(SHININESS_CHANGED, new Float(this.shininess)); + } + + /** + * Retrieves this material's shininess. + * @return the material's shininess + */ + final float getShininess() { + return this.shininess; + } + + /** + * Enables or disables lighting for this appearance component object. + * @param state true or false to enable or disable lighting + */ + void initLightingEnable(boolean state) { + lightingEnable = state; + } + + /** + * Enables or disables lighting for this appearance component object + * and sends a message notifying + * the interested structures of the change. + * @param state true or false to enable or disable lighting + */ + void setLightingEnable(boolean state) { + initLightingEnable(state); + sendMessage(ENABLE_CHANGED, + (state ? Boolean.TRUE: Boolean.FALSE)); + } + + /** + * Retrieves the state of the lighting enable flag. + * @return true if lighting is enabled, false if lighting is disabled + */ + boolean getLightingEnable() { + return lightingEnable; + } + + void initColorTarget(int colorTarget) { + this.colorTarget = colorTarget; + } + + final void setColorTarget(int colorTarget) { + initColorTarget(colorTarget); + sendMessage(COLORTARGET_CHANGED, new Integer(colorTarget)); + } + + final int getColorTarget() { + return colorTarget; + } + + @Override + synchronized void createMirrorObject() { + if (mirror == null) { + // Check the capability bits and let the mirror object + // point to itself if is not editable + if (isStatic()) { + mirror = this; + } else { + MaterialRetained mirrorMat = new MaterialRetained(); + mirrorMat.set(this); + mirrorMat.source = source; + mirror = mirrorMat; + } + } else { + ((MaterialRetained) mirror).set(this); + } + } + + + /** + * Updates the native context. + */ + void updateNative(Context ctx, + float red, float green, float blue, float alpha, + boolean enableLighting) { + Pipeline.getPipeline().updateMaterial(ctx, red, green, blue, alpha, + ambientColor.x, ambientColor.y, ambientColor.z, + emissiveColor.x, emissiveColor.y, emissiveColor.z, + diffuseColor.x, diffuseColor.y, diffuseColor.z, + specularColor.x, specularColor.y, specularColor.z, + shininess, colorTarget, enableLighting); + } + + + /** + * Creates a mirror object, point the mirror object to the retained + * object if the object is not editable + */ + @Override + synchronized void initMirrorObject() { + MaterialRetained mirrorMaterial = (MaterialRetained)mirror; + mirrorMaterial.set(this); + } + + /** + * Update the "component" field of the mirror object with the + * given "value" + */ + @Override + synchronized void updateMirrorObject(int component, Object value) { + MaterialRetained mirrorMaterial = (MaterialRetained)mirror; + if ((component & AMBIENT_COLOR_CHANGED) != 0) { + mirrorMaterial.ambientColor = (Color3f)value; + } + else if ((component & EMISSIVE_COLOR_CHANGED) != 0) { + mirrorMaterial.emissiveColor = (Color3f)value; + } + else if ((component & DIFFUSE_COLOR_CHANGED) != 0) { + mirrorMaterial.diffuseColor = (Color3f)value; + } + else if ((component & SPECULAR_COLOR_CHANGED) != 0) { + mirrorMaterial.specularColor = (Color3f)value; + } + else if ((component & SHININESS_CHANGED) != 0) { + mirrorMaterial.shininess = ((Float)value).floatValue(); + } + else if ((component & ENABLE_CHANGED) != 0) { + mirrorMaterial.lightingEnable = ((Boolean)value).booleanValue(); + } + else if ((component & COLORTARGET_CHANGED) != 0) { + mirrorMaterial.colorTarget = ((Integer)value).intValue(); + } + + } + + + boolean equivalent(MaterialRetained m) { + return ((m != null) && + lightingEnable == m.lightingEnable && + diffuseColor.equals(m.diffuseColor) && + emissiveColor.equals(m.emissiveColor) && + specularColor.equals(m.specularColor) && + ambientColor.equals(m.ambientColor) && + colorTarget == m.colorTarget && + shininess == m.shininess); + } + + + // This functions clones the retained side only and is used + // internally + @Override + protected Object clone() { + MaterialRetained mr = (MaterialRetained)super.clone(); + // color can't share the same reference + mr.ambientColor = new Color3f(ambientColor); + mr.emissiveColor = new Color3f(emissiveColor); + mr.diffuseColor = new Color3f(diffuseColor); + mr.specularColor = new Color3f(specularColor); + // other attributes are copy by clone() automatically + return mr; + } + + protected void set(MaterialRetained mat) { + super.set(mat); + + // duplicate any referenced data + ambientColor.set(mat.ambientColor); + emissiveColor.set(mat.emissiveColor); + diffuseColor.set(mat.diffuseColor); + specularColor.set(mat.specularColor); + shininess = mat.shininess; + lightingEnable = mat.lightingEnable; + colorTarget = mat.colorTarget; + } + + + final void sendMessage(int attrMask, Object attr) { + ArrayList<VirtualUniverse> univList = new ArrayList<VirtualUniverse>(); + ArrayList<ArrayList<GeometryAtom>> gaList = Shape3DRetained.getGeomAtomsList(mirror.users, univList); + // Send to rendering attribute structure, regardless of + // whether there are users or not (alternate appearance case ..) + J3dMessage createMessage = new J3dMessage(); + createMessage.threads = J3dThread.UPDATE_RENDERING_ATTRIBUTES; + createMessage.type = J3dMessage.MATERIAL_CHANGED; + createMessage.universe = null; + createMessage.args[0] = this; + createMessage.args[1]= new Integer(attrMask); + createMessage.args[2] = attr; + createMessage.args[3] = new Integer(changedFrequent); + VirtualUniverse.mc.processMessage(createMessage); + + int size = univList.size(); + for(int i=0; i<size; i++) { + createMessage = new J3dMessage(); + createMessage.threads = J3dThread.UPDATE_RENDER; + createMessage.type = J3dMessage.MATERIAL_CHANGED; + + createMessage.universe = univList.get(i); + createMessage.args[0] = this; + createMessage.args[1]= new Integer(attrMask); + createMessage.args[2] = attr; + + ArrayList<GeometryAtom> gL = gaList.get(i); + GeometryAtom[] gaArr = new GeometryAtom[gL.size()]; + gL.toArray(gaArr); + createMessage.args[3] = gaArr; + VirtualUniverse.mc.processMessage(createMessage); + } + + } + + @Override + void handleFrequencyChange(int bit) { + if (bit == Material.ALLOW_COMPONENT_WRITE) { + setFrequencyChangeMask(Material.ALLOW_COMPONENT_WRITE, 0x1); + } + } +} + |