⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 material.java

📁 world wind java sdk 源码
💻 JAVA
字号:
/*Copyright (C) 2001, 2006 United States Governmentas represented by the Administrator of theNational Aeronautics and Space Administration.All Rights Reserved.*/package gov.nasa.worldwind.render;import gov.nasa.worldwind.util.Logging;import gov.nasa.worldwind.util.RestorableSupport;import javax.media.opengl.GL;import java.awt.*;/** * @author tag * @version $Id: Material.java 10060 2009-04-09 17:43:54Z dcollins $ */public class Material{    private final Color ambient;    private final Color diffuse;    private final Color specular;    private final Color emission;    private final double shininess;    public static final Material WHITE          = new Material(Color.WHITE);    public static final Material LIGHT_GRAY     = new Material(Color.LIGHT_GRAY);    public static final Material GRAY           = new Material(Color.GRAY);    public static final Material DARK_GRAY      = new Material(Color.DARK_GRAY);    public static final Material BLACK          = new Material(Color.BLACK);    public static final Material RED            = new Material(Color.RED);    public static final Material PINK           = new Material(Color.PINK);    public static final Material ORANGE         = new Material(Color.ORANGE);    public static final Material YELLOW         = new Material(Color.YELLOW);    public static final Material GREEN          = new Material(Color.GREEN);    public static final Material MAGENTA        = new Material(Color.MAGENTA);    public static final Material CYAN           = new Material(Color.CYAN);    public static final Material BLUE           = new Material(Color.BLUE);        public Material(Color specular, Color diffuse, Color ambient, Color emission, float shininess)    {        if (specular == null || diffuse == null || ambient == null || emission == null)        {            String msg = Logging.getMessage("nullValue.ColorIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        this.ambient = ambient;        this.diffuse = diffuse;        this.specular = specular;        this.emission = emission;        this.shininess = shininess;    }    public Material(Color color, float shininess)    {        if (color == null)        {            String msg = Logging.getMessage("nullValue.ColorIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        this.ambient = this.makeDarker(color);        this.diffuse = color;        this.specular = new Color(255, 255, 255, color.getAlpha());        this.emission = new Color(0, 0, 0, color.getAlpha());        this.shininess = shininess;    }    public Material(Color color)    {        if (color == null)        {            String msg = Logging.getMessage("nullValue.ColorIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        this.ambient = this.makeDarker(color);        this.diffuse = color;        this.specular = new Color(255, 255, 255, color.getAlpha());        this.emission = new Color(0, 0, 0, color.getAlpha());        this.shininess = 80.0f;    }    public final Color getAmbient()    {        return this.ambient;    }    public final Color getDiffuse()    {        return this.diffuse;    }    public final Color getSpecular()    {        return this.specular;    }    public final Color getEmission()    {        return this.emission;    }    public final double getShininess()    {        return this.shininess;    }    public void apply(GL gl, int face)    {        if (gl == null)        {            String msg = Logging.getMessage("nullValue.GLIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        glMaterial(gl, face, GL.GL_AMBIENT, this.ambient);        glMaterial(gl, face, GL.GL_DIFFUSE, this.diffuse);        glMaterial(gl, face, GL.GL_SPECULAR, this.specular);        glMaterial(gl, face, GL.GL_EMISSION, this.emission);        gl.glMaterialf(face, GL.GL_SHININESS, (float) this.shininess);    }    public void apply(GL gl, int face, float alpha)    {        if (gl == null)        {            String msg = Logging.getMessage("nullValue.GLIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        // The alpha value at a vertex is taken only from the diffuse material's alpha channel. Therefore we specify        // alpha for the diffuse value, and alpha=0 for ambient, specular and emission values.        glMaterial(gl, face, GL.GL_AMBIENT, this.ambient, 0.0f);        glMaterial(gl, face, GL.GL_DIFFUSE, this.diffuse, alpha);        glMaterial(gl, face, GL.GL_SPECULAR, this.specular, 0.0f);        glMaterial(gl, face, GL.GL_EMISSION, this.emission, 0.0f);        gl.glMaterialf(face, GL.GL_SHININESS, (float) this.shininess);    }    protected void glMaterial(GL gl, int face, int name, Color color)    {        if (gl == null)        {            String msg = Logging.getMessage("nullValue.GLIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        if (color == null)        {            String msg = Logging.getMessage("nullValue.ColorIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        float[] compArray = new float[4];        color.getRGBComponents(compArray);        gl.glMaterialfv(face, name, compArray, 0);    }    protected void glMaterial(GL gl, int face, int name, Color color, float alpha)    {        if (gl == null)        {            String msg = Logging.getMessage("nullValue.GLIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        if (color == null)        {            String msg = Logging.getMessage("nullValue.ColorIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }                float[] compArray = new float[4];        color.getRGBComponents(compArray);        compArray[3] = alpha;        gl.glMaterialfv(face, name, compArray, 0);    }    //protected void glMaterialPremult(GL gl, int face, int name, Color color)    //{    //    float[] compArray = new float[4];    //    color.getRGBComponents(compArray);    //    compArray[0] = compArray[0] * compArray[3];    //    compArray[1] = compArray[1] * compArray[3];    //    compArray[2] = compArray[2] * compArray[3];    //    gl.glMaterialfv(face, name, compArray, 0);    //}    //protected void glMaterialfvPremult(GL gl, int face, int name, Color color, float alpha)    //{    //    float[] compArray = new float[4];    //    color.getRGBColorComponents(compArray);    //    compArray[0] = compArray[0] * alpha;    //    compArray[1] = compArray[1] * alpha;    //    compArray[2] = compArray[2] * alpha;    //    compArray[3] = alpha;    //    gl.glMaterialfv(face, name, compArray, 0);    //}    protected Color makeDarker(Color color)    {        if (color == null)        {            String msg = Logging.getMessage("nullValue.ColorIsNull");            Logging.logger().severe(msg);            throw new IllegalArgumentException(msg);        }        float factor = 0.3f;        int r = color.getRed();        int g = color.getGreen();        int b = color.getBlue();        int a = color.getAlpha();        return new Color(            Math.max(0, (int) (r * factor)),            Math.max(0, (int) (g * factor)),            Math.max(0, (int) (b * factor)),            a);    }    public void getRestorableState(RestorableSupport rs, RestorableSupport.StateObject so)    {        String encodedColor = RestorableSupport.encodeColor(this.ambient);        if (encodedColor != null)            rs.addStateValueAsString(so, "ambient", encodedColor);        encodedColor = RestorableSupport.encodeColor(this.diffuse);        if (encodedColor != null)            rs.addStateValueAsString(so, "diffuse", encodedColor);        encodedColor = RestorableSupport.encodeColor(this.specular);        if (encodedColor != null)            rs.addStateValueAsString(so, "specular", encodedColor);        encodedColor = RestorableSupport.encodeColor(this.emission);        if (encodedColor != null)            rs.addStateValueAsString(so, "emission", encodedColor);        rs.addStateValueAsDouble(so, "shininess", this.shininess);    }    public Material restoreState(RestorableSupport rs, RestorableSupport.StateObject so)    {        double shininess = this.getShininess();        Double d = rs.getStateValueAsDouble(so, "shininess");        if (d != null)            shininess = d;        String as = rs.getStateValueAsString(so, "ambient");        Color ambient = RestorableSupport.decodeColor(as);        if (ambient == null)            ambient = this.getAmbient();        String ds = rs.getStateValueAsString(so, "diffuse");        Color diffuse = RestorableSupport.decodeColor(ds);        if (diffuse == null)            diffuse = this.getDiffuse();        String ss = rs.getStateValueAsString(so, "specular");        Color specular = RestorableSupport.decodeColor(ss);        if (specular == null)            specular = this.getSpecular();        String es = rs.getStateValueAsString(so, "emission");        Color emission = RestorableSupport.decodeColor(es);        if (emission == null)            emission = this.getEmission();        return new Material(specular, diffuse, ambient, emission, (float) shininess);    }    public boolean equals(Object o)    {        if (this == o)            return true;        if (o == null || this.getClass() != o.getClass())            return false;        Material that = (Material) o;        if (Double.compare(this.shininess, that.shininess) != 0)            return false;        if (this.ambient != null ? !this.ambient.equals(that.ambient) : that.ambient != null)            return false;        if (this.diffuse != null ? !this.diffuse.equals(that.diffuse) : that.diffuse != null)            return false;        if (this.specular != null ? !this.specular.equals(that.specular) : that.specular != null)            return false;        //noinspection RedundantIfStatement        if (this.emission != null ? !this.emission.equals(that.emission) : that.emission != null)            return false;        return true;    }    public int hashCode()    {        int result;        long temp = (this.shininess != +0.0d) ? Double.doubleToLongBits(this.shininess) : 0L;        result = (int) (temp ^ (temp >>> 32));        result = 31 * result + (this.ambient != null ? this.ambient.hashCode() : 0);        result = 31 * result + (this.diffuse != null ? this.diffuse.hashCode() : 0);        result = 31 * result + (this.specular != null ? this.specular.hashCode() : 0);        result = 31 * result + (this.emission != null ? this.emission.hashCode() : 0);        return result;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -