/**
* Name: ASCII File to DEM Representation
* Author: Arnaud Grignard
* Description: Model to show how to import a ASCII File to make a DEM Representation and apply a Texture on it. In this 
* 	model, three experiments are presented : DEM to show the grid elevation using the ASCII File as data for the height of the 
* 	cells, and showing different 3D displays. GridDEMComplete shows more displays with the three of the previous experiment, the grid 
* 	of the cells in a 2D Display, with the Elevation but without triangulation, and the grid with text values to show the content of the 
* 	ASCII used by the cells. GraphicDEMComplete shows the use of the z_factor to amplify or reduces the difference between the z values 
* 	of a Dem geometry.
* Tags:  load_file, gis, 3d, dem
*/
model gridloading

global {
	file grid_data <- file("../includes/DEM-Vulcano/vulcano_50.asc");
	file dem_file parameter: 'DEM' <- file('../includes/DEM-Vulcano/DEM.png');
	image_file europe <- image_file("../images/mnt/europe.jpg");
	file texture parameter: 'Texture' <- file('../includes/DEM-Vulcano/Texture.jpg');
	geometry shape <- envelope(200);

	init {
		ask cell {
			float r;
			float g;
			float b;
			if (grid_value < 20) {
				r <- 76 + (26 * (grid_value - 7) / 13);
				g <- 153 - (51 * (grid_value - 7) / 13);
				b <- 0.0;
			} else {
				r <- 102 + (122 * (grid_value - 20) / 19);
				g <- 51 + (173 * (grid_value - 20) / 19);
				b <- 224 * (grid_value - 20) / 19;
			}

			self.color <- rgb(r, g, b);
		}

	}

}

grid cell file: grid_data;

experiment Comparison type: gui {
	output {
		layout #split;

		//Display the grid triangulated in 3D with the cell altitude corresponding to its grid_value and the color cells (if defined otherwise in black)
 display "Grid with triangles"
		type: opengl {
			grid cell elevation: true triangulation: true;
		}

		//Display the grid triangulated in 3D with the cell altitude corresponding to its grid_value and the color of cells as a gray value corresponding to grid_value / maxZ *255

		display "Grid with triangles and grayscale" type: opengl {
			grid cell elevation: true grayscale: true triangulation: true;
		}

		//Display the textured grid in 3D with the cell altitude corresponding to its grid_value.				
 display "Grid with triangles and texture" type: opengl {
			grid cell texture: texture triangulation: true elevation: true;
		}

		//Display the field triangulated in 3D with the cell altitude corresponding to its value and the color defined (otherwise in default color)
 display
		"Field with triangles, green color" type: opengl {
			mesh grid_data triangulation: true color: #green;
		}

		//Display the field triangulated in 3D with the cell altitude corresponding to its value and the color of cells as a gray value corresponding to grid_value / maxZ *255
 display
		"Field with triangles and grayscale" type: opengl {
			mesh grid_data grayscale: true triangulation: true;
		}

		//Display the textured field in 3D with the cell altitude corresponding to its value.				
 display "Field scaled by 2, with triangles and texture" type: opengl {
			mesh grid_data texture: texture triangulation: true scale: 2.0;
		}

	}

}

experiment "Grids" type: gui {
	output {
		layout #split toolbars: false;

		//Display the grid on a plan with cell color (if defined otherwise in black)
 display grid type: opengl { //Same as in java2D
 grid cell border: #black;
		}

		//Display the grid in 3D with the cell altitude corresponding to its grid_value and the color cells (if defined otherwise in black)
 display gridWithElevation type: opengl {
			grid cell elevation: true;
		}

		//Display the grid triangulated in 3D with the cell altitude corresponding to its grid_value and the color cells (if defined otherwise in black)
 display
		gridWithElevationTriangulated type: opengl {
			grid cell elevation: true triangulation: true;
		}

		//Display the grid in 3D with the cell altitude corresponding to its grid_value and the color of cells as a gray value corresponding to grid_value / maxZ *255
 display
		gridGrayScaled type: opengl {
			grid cell elevation: true grayscale: true;
		}
		//Display the grid triangulated in 3D with the cell altitude corresponding to its grid_value and the color of cells as a gray value corresponding to grid_value / maxZ *255

		display gridGrayScaledTriangulated type: opengl {
			grid cell elevation: true grayscale: true triangulation: true;
		}

		//Display the textured grid in 3D with the cell altitude corresponding to its grid_value.				
 display gridTextured type: opengl {
			grid cell texture: texture text: false triangulation: false elevation: true;
		}

		//Display the textured triangulated grid in 3D with the cell altitude corresponding to its grid_value.
 display gridTexturedTriangulated type: opengl {
			grid cell texture: texture text: false triangulation: true elevation: true;
		}

		display gridWithText type: opengl {
			grid cell text: true elevation: true wireframe: true refresh: false;
		}

	}

}

experiment "Meshes" type: gui {
	output {
		layout #split toolbars: false;
		display "Large file, rectangles, wireframe and scaled" type: opengl axes: false {
			camera "default" location: {100.0, 269.7056, 169.7056} target: {100.0, 100.0, 0.0};
			mesh europe wireframe: true border: #green refresh: false size: {1, 1, 0.2};
		}

		display "Large file, triangles, wireframe and scaled" type: opengl axes: false {
			camera "default" location: {100.0, 269.7056, 169.7056} target: {100.0, 100.0, 0.0};
			mesh europe grayscale: true triangulation: true smooth: true refresh: false size: {1, 1, 0.2};
		}

		display "Large file, triangles, smooth, wireframe and scaled" type: opengl axes: false {
			camera "default" location: {100.0, 269.7056, 169.7056} target: {100.0, 100.0, 0.0};
			mesh europe wireframe: true triangulation: true border: #green refresh: false size: {1, 1, 0.2} smooth: true;
		}

		display "Triangles, grayscale, lines, colored and scaled" type: opengl axes: false {
			camera "default" location: {100.0, 269.7056, 169.7056} target: {100.0, 100.0, 0.0};
			mesh grid_data size: {1, 1, 0.75} triangulation: true border: #yellow color: #violet;
		}

		display "Triangles, textured, no scale" type: opengl axes: false {
			camera "default" location: {100.0, 269.7056, 169.7056} target: {100.0, 100.0, 0.0};
			mesh grid_data texture: texture triangulation: true;
		}

		display "Triangles, textured and scaled" type: opengl axes: false {
			camera "default" location: {100.0, 269.7056, 169.7056} target: {100.0, 100.0, 0.0};
			mesh grid_data texture: texture triangulation: true scale: 0.75;
		}

		display "Triangles, textured, smooth and scaled" type: opengl axes: false {
			camera "default" location: {100.0, 269.7056, 169.7056} target: {100.0, 100.0, 0.0};
			mesh grid_data texture: texture smooth: true triangulation: true size: {1, 1, 0.75};
		}

		display "Triangles, textured, scaled, with labels" type: opengl axes: false {
			camera "default" location: {100.0, 269.7056, 169.7056} target: {100.0, 100.0, 0.0};
			mesh grid_data texture: texture triangulation: true size: {1, 1, 0.5} text: true;
		}

		display "Large file, trianges, grayscale, scaled" type: opengl axes: false {
			camera 'default' location: {104.7273,233.3361,685.4581} target: {100.135,-29.7603,0.0};
			mesh dem_file grayscale: true triangulation: true scale: 2.0;
		}

	}

}