/*
* Simbad - Robot Simulator
* Copyright (C) 2004 Louis Hugues
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
-----------------------------------------------------------------------------
* $Author: sioulseuguh $
* $Date: 2005/04/25 17:54:59 $
* $Revision: 1.12 $
* $Source: /cvsroot/simbad/src/simbad/sim/EnvironmentDescription.java,v $
*/
package simbad.sim;
import javax.vecmath.Color3f;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;
import java.util.ArrayList;
/**
* This class is intend to describe easily a the world and its components.
* It is only used during the building process of the World and the Simulator.
* The user may specific colors and rendering attributes and add object which should be settled
* in the World (Arch,Box, Wall ..)
* It also adds the agent(s) which should be simulated.
*
* @author Louis Hugues
*/
public class EnvironmentDescription {
ArrayList<Object> objects;
public Color3f white, black, red, green, blue, ligthgray, gray, darkgray;
// configurable values
public Color3f ambientLightColor;
public boolean light1IsOn;
public Color3f light1Color;
public Vector3d light1Position;
public Color3f light2Color;
public boolean light2IsOn;
public Vector3d light2Position;
public Color3f wallColor;
public Color3f archColor;
public Color3f boxColor;
public Color3f floorColor;
public Color3f backgroundColor;
public int worldViewPoint;
public boolean hasAxis;
public int normalsStyle;
public final static int NORMALS_SIMPLE = 1;
public final static int NORMALS_REALISTIC = 2;
/** if true the simulator uses physical laws. */
public boolean usePhysics;
/** The size of the square containing the world */
public float worldSize;
public EnvironmentDescription() {
worldSize = 20;
objects = new ArrayList<Object>();
white = new Color3f(1, 1, 1);
black = new Color3f(0, 0, 0);
green = new Color3f(0, 1, 0);
red = new Color3f(1, 0, 0);
blue = new Color3f(0, 0, 1);
ligthgray = new Color3f(0.8f, 0.8f, 0.8f);
gray = new Color3f(0.8f, 0.8f, 0.8f);
darkgray = new Color3f(0.2f, 0.2f, 0.2f);
light1Position =new Vector3d(0,worldSize/4,worldSize);
light2Position = new Vector3d(worldSize,worldSize/4,0);
defaultSettings();
}
void defaultSettings() {
light1IsOn = true;
light2IsOn = false;
ambientLightColor = white;
light1Color = white;
light2Color = white;
wallColor = blue;
archColor = green;
boxColor = red;
floorColor = ligthgray;
backgroundColor = ligthgray;
hasAxis = true;
normalsStyle = NORMALS_SIMPLE;
worldViewPoint = World.VIEW_FROM_EAST;
usePhysics = false;
}
/** Add a object (Agent or BlockWorldObject). */
public void add(Object object){
objects.add(object);
}
public void light1SetPosition(double x,double y,double z){
light1Position.set(x,y,z);
}
public void light2SetPosition(double x,double y,double z){
light2Position.set(x,y,z);
}
/** Use physics in simulation. */
public void setUsePhysics(boolean use){
usePhysics = use;
}
/** Shows or hide the X,Y and Z axis.*/
public void showAxis(boolean show){
hasAxis = show;
}
/** Sets the size of the world.
*
* @param size in meters.
*/
public void setWorldSize(float size){ worldSize = size;}
public void addMap(String[] map){
int sx = map[0].length();
int sy = map.length;
int cx = sx/2;
int cy= sy/2;
for(int y =0; y < sy;y++){
for(int x =0; x < map[y].length();x++){
if (map[y].charAt(x)=='#'){
add(new Box(new Vector3d(x-cx,0,y-cy),new Vector3f(1,1,1),this));
}
} }
}
}