import java.awt.Color;
import java.awt.Component;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;

import javax.swing.JFrame;

import visad.BaseColorControl;
import visad.DataReferenceImpl;
import visad.Display;
import visad.FlatField;
import visad.FunctionType;
import visad.GraphicsModeControl;
import visad.Linear2DSet;
import visad.RealTupleType;
import visad.RealType;
import visad.ScalarMap;
import visad.ConstantMap;
import visad.java3d.DisplayImplJ3D;
import visad.java3d.DisplayRendererJ3D;
import visad.bom.ImageRendererJ3D;

public class VisadTestDumpGhansham4 {

	 // color table length.
    private static final int COLOR_TABLE_LENGTH = 20;
    
	public static void main(String[] args) {

		try {
			double xMin = 100;
			double xMax = 1000;
			double yMin = 0;
			double yMax = 30;
			int xRes = 1000;
			int yRes = 1000;
			//Use this property to set Texture ByReference Rendering for images
			System.setProperty(visad.ShadowType.PROP_IMAGE_BY_REF, "true");
			//Optional:Just try to uncomment this. If your graphics card supports NPOT
			//textures. You may save up a lot of memory.
			// System.setProperty(visad.java3d.DisplayImplJ3D.PROP_TEXTURE_NPOT, "true");

			float[][] zValues = new float[1][xRes * yRes];

			File f = new File("datasetdump");
			FileInputStream fs = new FileInputStream(f);
			DataInputStream ds = new DataInputStream(fs);
			for (int i = 0; i < zValues[0].length; i++) {
				zValues[0][i] = (float)ds.readDouble();
			}
			ds.close();

			RealType xType = RealType.getRealType("x");
			RealType yType = RealType.getRealType("y");
			RealType zType = RealType.getRealType("z");
			RealTupleType domainTuple = new RealTupleType(xType, yType);
			FunctionType func = new FunctionType(domainTuple, zType);

			ScalarMap xMap = new ScalarMap(xType, Display.XAxis);
			ScalarMap yMap = new ScalarMap(yType, Display.YAxis);
			ScalarMap zMap = new ScalarMap(zType, Display.ZAxis);
			ScalarMap colorMap = new ScalarMap(zType, Display.RGB);
			
			DisplayImplJ3D display = new DisplayImplJ3D("display");

			display.addMap(xMap);
			display.addMap(yMap);
			display.addMap(zMap);
			display.addMap(colorMap);

			// Set the color scale
			final float[][] table = new float[3][COLOR_TABLE_LENGTH];
	        table[0][0] = 1.0f;
	        table[1][0] = 1.0f;
	        for (int i = 0; i < COLOR_TABLE_LENGTH; i++) {
	            table[2][i] = 1.0f;
	        }
			((BaseColorControl) colorMap.getControl()).setTable(table);

			xMap.setRange(xMin, xMax);

			Linear2DSet domainSet = new Linear2DSet(domainTuple, xMin, xMax,
					xRes, yMin, yMax, yRes);

			FlatField flatField = new FlatField(func, domainSet);
			flatField.setSamples(zValues, false);
			DataReferenceImpl dataReference = new DataReferenceImpl("data");
			dataReference.setData(flatField);
			//Adding constant Map:Dont use value less than 1
			ConstantMap cmap[] = {new ConstantMap(1.0f, Display.CurvedSize)};
			
			//Use ImageRendererJ3D than using Default Renderer
			display.addReferences(new ImageRendererJ3D(), dataReference, cmap);
			// display.addReference(dataReference);

			DisplayRendererJ3D dRenderer = (DisplayRendererJ3D) display
					.getDisplayRenderer();
			dRenderer.setForegroundColor(Color.black);
			dRenderer.setBackgroundColor(Color.white);
			dRenderer.setBoxOn(true);

			GraphicsModeControl graphicsModeControl = display .getGraphicsModeControl();
			graphicsModeControl.setScaleEnable(true);
			// graphicsModeControl.setTextureEnable(false);

			JFrame newFrame = new JFrame();
			Component component = display.getComponent();
			newFrame.getContentPane().add(component);
			newFrame.pack();
			newFrame.setVisible(true);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
