Home | History | Annotate | Download | only in light
      1 /*
      2  * Copyright (c) 2009-2010 jMonkeyEngine
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are
      7  * met:
      8  *
      9  * * Redistributions of source code must retain the above copyright
     10  *   notice, this list of conditions and the following disclaimer.
     11  *
     12  * * Redistributions in binary form must reproduce the above copyright
     13  *   notice, this list of conditions and the following disclaimer in the
     14  *   documentation and/or other materials provided with the distribution.
     15  *
     16  * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
     17  *   may be used to endorse or promote products derived from this software
     18  *   without specific prior written permission.
     19  *
     20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
     28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 package com.jme3.light;
     34 
     35 import com.jme3.export.*;
     36 import com.jme3.math.ColorRGBA;
     37 import com.jme3.scene.Spatial;
     38 import java.io.IOException;
     39 
     40 /**
     41  * Abstract class for representing a light source.
     42  * <p>
     43  * All light source types have a color.
     44  */
     45 public abstract class Light implements Savable, Cloneable {
     46 
     47     /**
     48      * Describes the light type.
     49      */
     50     public enum Type {
     51 
     52         /**
     53          * Directional light
     54          *
     55          * @see DirectionalLight
     56          */
     57         Directional(0),
     58 
     59         /**
     60          * Point light
     61          *
     62          * @see PointLight
     63          */
     64         Point(1),
     65 
     66         /**
     67          * Spot light.
     68          * <p>
     69          * Not supported by jMonkeyEngine
     70          */
     71         Spot(2),
     72 
     73         /**
     74          * Ambient light
     75          *
     76          * @see AmbientLight
     77          */
     78         Ambient(3);
     79 
     80         private int typeId;
     81 
     82         Type(int type){
     83             this.typeId = type;
     84         }
     85 
     86         /**
     87          * Returns an index for the light type
     88          * @return an index for the light type
     89          */
     90         public int getId(){
     91             return typeId;
     92         }
     93     }
     94 
     95     protected ColorRGBA color = new ColorRGBA(1f,1f,1f,1f);
     96 
     97     /**
     98      * Used in LightList for caching the distance
     99      * to the owner spatial. Should be reset after the sorting.
    100      */
    101     protected transient float lastDistance = -1;
    102 
    103     /**
    104      * If light is disabled, it will not have any
    105      */
    106     protected boolean enabled = true;
    107 
    108     /**
    109      * The light name.
    110      */
    111     protected String name;
    112 
    113     /**
    114      * Returns the color of the light.
    115      *
    116      * @return The color of the light.
    117      */
    118     public ColorRGBA getColor() {
    119         return color;
    120     }
    121 
    122     /**
    123      * This method sets the light name.
    124      *
    125      * @param name the light name
    126      */
    127     public void setName(String name) {
    128         this.name = name;
    129     }
    130 
    131     /**
    132      * Return the light name.
    133      *
    134      * @return the light name
    135      */
    136     public String getName() {
    137         return name;
    138     }
    139 
    140     /*
    141     public void setLastDistance(float lastDistance){
    142         this.lastDistance = lastDistance;
    143     }
    144 
    145     public float getLastDistance(){
    146         return lastDistance;
    147     }
    148     */
    149 
    150     /**
    151      * Sets the light color.
    152      *
    153      * @param color the light color.
    154      */
    155     public void setColor(ColorRGBA color){
    156         this.color.set(color);
    157     }
    158 
    159 
    160     /*
    161      * Returns true if the light is enabled
    162      *
    163      * @return true if the light is enabled
    164      *
    165      * @see Light#setEnabled(boolean)
    166      */
    167     /*
    168     public boolean isEnabled() {
    169         return enabled;
    170     }
    171     */
    172 
    173     @Override
    174     public Light clone(){
    175         try {
    176             return (Light) super.clone();
    177         } catch (CloneNotSupportedException ex) {
    178             throw new AssertionError();
    179         }
    180     }
    181 
    182     public void write(JmeExporter ex) throws IOException {
    183         OutputCapsule oc = ex.getCapsule(this);
    184         oc.write(color, "color", null);
    185         oc.write(enabled, "enabled", true);
    186         oc.write(name, "name", null);
    187     }
    188 
    189     public void read(JmeImporter im) throws IOException {
    190         InputCapsule ic = im.getCapsule(this);
    191         color = (ColorRGBA) ic.readSavable("color", null);
    192         enabled = ic.readBoolean("enabled", true);
    193         name = ic.readString("name", null);
    194     }
    195 
    196     /**
    197      * Used internally to compute the last distance value.
    198      */
    199     protected abstract void computeLastDistance(Spatial owner);
    200 
    201     /**
    202      * Returns the light type
    203      *
    204      * @return the light type
    205      *
    206      * @see Type
    207      */
    208     public abstract Type getType();
    209 
    210 }
    211