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 */
32package com.jme3.terrain.geomipmap;
33
34import com.jme3.export.InputCapsule;
35import com.jme3.export.JmeExporter;
36import com.jme3.export.JmeImporter;
37import com.jme3.export.OutputCapsule;
38import com.jme3.renderer.RenderManager;
39import com.jme3.renderer.ViewPort;
40import com.jme3.scene.Spatial;
41import com.jme3.scene.control.AbstractControl;
42import com.jme3.scene.control.Control;
43import java.io.IOException;
44
45
46/**
47 * Handles the normal vector updates when the terrain changes heights.
48 * @author bowens
49 */
50public class NormalRecalcControl extends AbstractControl {
51
52    private TerrainQuad terrain;
53
54    public NormalRecalcControl(){}
55
56    public NormalRecalcControl(TerrainQuad terrain) {
57        this.terrain = terrain;
58    }
59
60    @Override
61    protected void controlUpdate(float tpf) {
62        terrain.updateNormals();
63    }
64
65    @Override
66    protected void controlRender(RenderManager rm, ViewPort vp) {
67
68    }
69
70    public Control cloneForSpatial(Spatial spatial) {
71        NormalRecalcControl control = new NormalRecalcControl(terrain);
72        control.setSpatial(spatial);
73        control.setEnabled(true);
74        return control;
75    }
76
77    @Override
78    public void setSpatial(Spatial spatial) {
79        super.setSpatial(spatial);
80        if (spatial instanceof TerrainQuad)
81            this.terrain = (TerrainQuad)spatial;
82    }
83
84    public TerrainQuad getTerrain() {
85        return terrain;
86    }
87
88    public void setTerrain(TerrainQuad terrain) {
89        this.terrain = terrain;
90    }
91
92    @Override
93    public void write(JmeExporter ex) throws IOException {
94        super.write(ex);
95        OutputCapsule oc = ex.getCapsule(this);
96        oc.write(terrain, "terrain", null);
97    }
98
99    @Override
100    public void read(JmeImporter im) throws IOException {
101        super.read(im);
102        InputCapsule ic = im.getCapsule(this);
103        terrain = (TerrainQuad) ic.readSavable("terrain", null);
104    }
105
106}
107