Added ShaderBasedProjectedImageMeshTool, its sub-classes and UI support.
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/bundle.properties b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/bundle.properties
index ee38f9c..e0734b7 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/bundle.properties
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/bundle.properties
@@ -394,3 +394,14 @@
 _UI_VariableBasedShaderBasedMeshTool_relativePosition_feature = Relative Position
 _UI_VariableBasedShaderBasedMeshTool_relativeRotationMatrix_feature = Relative Rotation Matrix
 _UI_VariableBasedShaderBasedMeshToolPoseAdapter_variableBasedShaderBasedMeshTool_feature = Variable Based Shader Based Mesh Tool
+_UI_ShaderBasedMeshToolType_IMAGE_literal = Image
+_UI_ShaderBasedProjectedImageMeshTool_type = Shader Based Projected Image Mesh Tool
+_UI_ShaderBasedProjectedImageMeshTool_xDimension_feature = XDimension
+_UI_ShaderBasedProjectedImageMeshTool_yDimension_feature = YDimension
+_UI_ShaderBasedProjectedImageMeshTool_image_feature = Image
+_UI_ImageBasedShaderBasedMeshTool_type = Image Based Shader Based Mesh Tool
+_UI_ImageBasedShaderBasedMeshTool_image_feature = Image
+_UI_VariableShaderBasedProjectedImageMeshTool_type = Variable Shader Based Projected Image Mesh Tool
+_UI_ShaderBasedProjectedImageMeshTool_transparentColor_feature = Transparent Color
+_UI_VariableBasedShaderBasedMeshTool_updatePosition_feature = Update Position
+_UI_VariableBasedShaderBasedMeshTool_updateOrientation_feature = Update Orientation
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateAggregateContentNode_aggregateContent_ShaderBasedProjectedImageMeshTool.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateAggregateContentNode_aggregateContent_ShaderBasedProjectedImageMeshTool.gif
new file mode 100644
index 0000000..d82f226
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateAggregateContentNode_aggregateContent_ShaderBasedProjectedImageMeshTool.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateAggregateContentNode_aggregateContent_VariableShaderBasedProjectedImageMeshTool.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateAggregateContentNode_aggregateContent_VariableShaderBasedProjectedImageMeshTool.gif
new file mode 100644
index 0000000..9dc67ff
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateAggregateContentNode_aggregateContent_VariableShaderBasedProjectedImageMeshTool.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateCartesianTriangularMeshMapLayer_shaderBasedMeshTools_ShaderBasedProjectedImageMeshTool.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateCartesianTriangularMeshMapLayer_shaderBasedMeshTools_ShaderBasedProjectedImageMeshTool.gif
new file mode 100644
index 0000000..051fac7
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateCartesianTriangularMeshMapLayer_shaderBasedMeshTools_ShaderBasedProjectedImageMeshTool.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateCartesianTriangularMeshMapLayer_shaderBasedMeshTools_VariableShaderBasedProjectedImageMeshTool.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateCartesianTriangularMeshMapLayer_shaderBasedMeshTools_VariableShaderBasedProjectedImageMeshTool.gif
new file mode 100644
index 0000000..dcfe752
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateCartesianTriangularMeshMapLayer_shaderBasedMeshTools_VariableShaderBasedProjectedImageMeshTool.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateContentNode_content_ShaderBasedProjectedImageMeshTool.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateContentNode_content_ShaderBasedProjectedImageMeshTool.gif
new file mode 100644
index 0000000..e4f5f22
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateContentNode_content_ShaderBasedProjectedImageMeshTool.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateContentNode_content_VariableShaderBasedProjectedImageMeshTool.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateContentNode_content_VariableShaderBasedProjectedImageMeshTool.gif
new file mode 100644
index 0000000..5a705ee
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateContentNode_content_VariableShaderBasedProjectedImageMeshTool.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateImageBasedShaderBasedMeshTool_image_EImage.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateImageBasedShaderBasedMeshTool_image_EImage.gif
new file mode 100644
index 0000000..3730559
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateImageBasedShaderBasedMeshTool_image_EImage.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateImageBasedShaderBasedMeshTool_image_URLEImage.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateImageBasedShaderBasedMeshTool_image_URLEImage.gif
new file mode 100644
index 0000000..0c81e8e
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateImageBasedShaderBasedMeshTool_image_URLEImage.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateShaderBasedProjectedImageMeshTool_image_EImage.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateShaderBasedProjectedImageMeshTool_image_EImage.gif
new file mode 100644
index 0000000..58e9c25
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateShaderBasedProjectedImageMeshTool_image_EImage.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateShaderBasedProjectedImageMeshTool_image_URLEImage.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateShaderBasedProjectedImageMeshTool_image_URLEImage.gif
new file mode 100644
index 0000000..236f643
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/ctool16/CreateShaderBasedProjectedImageMeshTool_image_URLEImage.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/obj16/ShaderBasedProjectedImageMeshTool.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/obj16/ShaderBasedProjectedImageMeshTool.gif
new file mode 100644
index 0000000..cb1755a
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/obj16/ShaderBasedProjectedImageMeshTool.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/obj16/VariableShaderBasedProjectedImageMeshTool.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/obj16/VariableShaderBasedProjectedImageMeshTool.gif
new file mode 100644
index 0000000..e4b530e
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/icons/full/obj16/VariableShaderBasedProjectedImageMeshTool.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen-custom/org/eclipse/apogy/core/environment/surface/provider/ShaderBasedProjectedImageMeshToolCustomItemProvider.java b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen-custom/org/eclipse/apogy/core/environment/surface/provider/ShaderBasedProjectedImageMeshToolCustomItemProvider.java
new file mode 100644
index 0000000..17ecb1b
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen-custom/org/eclipse/apogy/core/environment/surface/provider/ShaderBasedProjectedImageMeshToolCustomItemProvider.java
@@ -0,0 +1,32 @@
+package org.eclipse.apogy.core.environment.surface.provider;
+
+import org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool;
+import org.eclipse.emf.common.notify.AdapterFactory;
+
+public class ShaderBasedProjectedImageMeshToolCustomItemProvider extends ShaderBasedProjectedImageMeshToolItemProvider {
+
+	public ShaderBasedProjectedImageMeshToolCustomItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);		
+	}
+
+	@Override
+	public String getText(Object object) 
+	{
+		ShaderBasedProjectedImageMeshTool tool = (ShaderBasedProjectedImageMeshTool) object;
+				
+		String label = "";
+		
+		if(tool.getName() == null || tool.getName().length() == 0)
+		{
+			label += getString("_UI_ShaderBasedProjectedImageMeshTool_type");
+		}
+		else
+		{
+			label += tool.getName();
+		}
+				
+		label += " (" + super.getSuffix(tool) + ")";
+	
+		return label;
+	}
+}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen-custom/org/eclipse/apogy/core/environment/surface/provider/VariableShaderBasedProjectedImageMeshToolCustomItemProvider.java b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen-custom/org/eclipse/apogy/core/environment/surface/provider/VariableShaderBasedProjectedImageMeshToolCustomItemProvider.java
new file mode 100644
index 0000000..f636e09
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen-custom/org/eclipse/apogy/core/environment/surface/provider/VariableShaderBasedProjectedImageMeshToolCustomItemProvider.java
@@ -0,0 +1,34 @@
+package org.eclipse.apogy.core.environment.surface.provider;
+
+import org.eclipse.apogy.core.environment.surface.VariableShaderBasedProjectedImageMeshTool;
+import org.eclipse.emf.common.notify.AdapterFactory;
+
+public class VariableShaderBasedProjectedImageMeshToolCustomItemProvider
+		extends VariableShaderBasedProjectedImageMeshToolItemProvider {
+
+	public VariableShaderBasedProjectedImageMeshToolCustomItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);		
+	}
+	
+	@Override
+	public String getText(Object object) 
+	{
+		VariableShaderBasedProjectedImageMeshTool tool = (VariableShaderBasedProjectedImageMeshTool) object;		
+		
+		String label = "";
+		
+		if(tool.getName() == null || tool.getName().length() == 0)
+		{
+			label += getString("_UI_VariableShaderBasedProjectedImageMeshTool_type");
+		}
+		else
+		{
+			label += tool.getName();
+		}
+		
+		label += " (" + super.getSuffix(tool) + ")";
+		
+		return label;
+	}
+
+}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/ApogySurfaceEnvironmentItemProviderAdapterFactory.java b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/ApogySurfaceEnvironmentItemProviderAdapterFactory.java
index 4574019..2da1a2f 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/ApogySurfaceEnvironmentItemProviderAdapterFactory.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/ApogySurfaceEnvironmentItemProviderAdapterFactory.java
@@ -504,6 +504,52 @@
 	}
 
 	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ShaderBasedProjectedImageMeshToolItemProvider shaderBasedProjectedImageMeshToolItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createShaderBasedProjectedImageMeshToolAdapter() {
+		if (shaderBasedProjectedImageMeshToolItemProvider == null) {
+			shaderBasedProjectedImageMeshToolItemProvider = new ShaderBasedProjectedImageMeshToolCustomItemProvider(this);
+		}
+
+		return shaderBasedProjectedImageMeshToolItemProvider;
+	}
+
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.apogy.core.environment.surface.VariableShaderBasedProjectedImageMeshTool} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VariableShaderBasedProjectedImageMeshToolItemProvider variableShaderBasedProjectedImageMeshToolItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.apogy.core.environment.surface.VariableShaderBasedProjectedImageMeshTool}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createVariableShaderBasedProjectedImageMeshToolAdapter() {
+		if (variableShaderBasedProjectedImageMeshToolItemProvider == null) {
+			variableShaderBasedProjectedImageMeshToolItemProvider = new VariableShaderBasedProjectedImageMeshToolCustomItemProvider(this);
+		}
+
+		return variableShaderBasedProjectedImageMeshToolItemProvider;
+	}
+
+	/**
 	 * This keeps track of the one adapter used for all {@link org.eclipse.apogy.core.environment.surface.CartesianTriangularMeshSlopeImageMapLayer} instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1066,6 +1112,8 @@
 		if (variablePoseBullseyeToolItemProvider != null) variablePoseBullseyeToolItemProvider.dispose();
 		if (shaderBasedAngularDisplayMeshToolItemProvider != null) shaderBasedAngularDisplayMeshToolItemProvider.dispose();
 		if (variableAngularDisplayMeshToolItemProvider != null) variableAngularDisplayMeshToolItemProvider.dispose();
+		if (shaderBasedProjectedImageMeshToolItemProvider != null) shaderBasedProjectedImageMeshToolItemProvider.dispose();
+		if (variableShaderBasedProjectedImageMeshToolItemProvider != null) variableShaderBasedProjectedImageMeshToolItemProvider.dispose();
 		if (cartesianTriangularMeshSlopeImageMapLayerItemProvider != null) cartesianTriangularMeshSlopeImageMapLayerItemProvider.dispose();
 		if (cartesianTriangularMeshDiscreteSlopeImageMapLayerItemProvider != null) cartesianTriangularMeshDiscreteSlopeImageMapLayerItemProvider.dispose();
 		if (cartesianTriangularMeshHeightImageMapLayerItemProvider != null) cartesianTriangularMeshHeightImageMapLayerItemProvider.dispose();
@@ -1221,6 +1269,16 @@
 				newChildDescriptors.add
 					(createChildParameter
 						(ApogyCommonTopologyPackage.Literals.CONTENT_NODE__CONTENT,
+						 ApogySurfaceEnvironmentFactory.eINSTANCE.createShaderBasedProjectedImageMeshTool()));
+
+				newChildDescriptors.add
+					(createChildParameter
+						(ApogyCommonTopologyPackage.Literals.CONTENT_NODE__CONTENT,
+						 ApogySurfaceEnvironmentFactory.eINSTANCE.createVariableShaderBasedProjectedImageMeshTool()));
+
+				newChildDescriptors.add
+					(createChildParameter
+						(ApogyCommonTopologyPackage.Literals.CONTENT_NODE__CONTENT,
 						 ApogySurfaceEnvironmentFactory.eINSTANCE.createCartesianTriangularMeshSlopeImageMapLayer()));
 
 				newChildDescriptors.add
@@ -1406,6 +1464,16 @@
 				newChildDescriptors.add
 					(createChildParameter
 						(ApogyCommonTopologyPackage.Literals.AGGREGATE_CONTENT_NODE__AGGREGATE_CONTENT,
+						 ApogySurfaceEnvironmentFactory.eINSTANCE.createShaderBasedProjectedImageMeshTool()));
+
+				newChildDescriptors.add
+					(createChildParameter
+						(ApogyCommonTopologyPackage.Literals.AGGREGATE_CONTENT_NODE__AGGREGATE_CONTENT,
+						 ApogySurfaceEnvironmentFactory.eINSTANCE.createVariableShaderBasedProjectedImageMeshTool()));
+
+				newChildDescriptors.add
+					(createChildParameter
+						(ApogyCommonTopologyPackage.Literals.AGGREGATE_CONTENT_NODE__AGGREGATE_CONTENT,
 						 ApogySurfaceEnvironmentFactory.eINSTANCE.createCartesianTriangularMeshSlopeImageMapLayer()));
 
 				newChildDescriptors.add
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/CartesianTriangularMeshMapLayerItemProvider.java b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/CartesianTriangularMeshMapLayerItemProvider.java
index b1c56cb..44960b5 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/CartesianTriangularMeshMapLayerItemProvider.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/CartesianTriangularMeshMapLayerItemProvider.java
@@ -191,6 +191,16 @@
 			(createChildParameter
 				(ApogySurfaceEnvironmentPackage.Literals.CARTESIAN_TRIANGULAR_MESH_MAP_LAYER__SHADER_BASED_MESH_TOOLS,
 				 ApogySurfaceEnvironmentFactory.eINSTANCE.createVariableAngularDisplayMeshTool()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(ApogySurfaceEnvironmentPackage.Literals.CARTESIAN_TRIANGULAR_MESH_MAP_LAYER__SHADER_BASED_MESH_TOOLS,
+				 ApogySurfaceEnvironmentFactory.eINSTANCE.createShaderBasedProjectedImageMeshTool()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(ApogySurfaceEnvironmentPackage.Literals.CARTESIAN_TRIANGULAR_MESH_MAP_LAYER__SHADER_BASED_MESH_TOOLS,
+				 ApogySurfaceEnvironmentFactory.eINSTANCE.createVariableShaderBasedProjectedImageMeshTool()));
 	}
 
 }
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/ImageBasedShaderBasedMeshToolItemProvider.java b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/ImageBasedShaderBasedMeshToolItemProvider.java
new file mode 100644
index 0000000..23e560b
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/ImageBasedShaderBasedMeshToolItemProvider.java
@@ -0,0 +1,152 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2020 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *      Pierre Allard - initial API and implementation    
+ *         
+ * SPDX-License-Identifier: EPL-1.0    
+ * *******************************************************************************
+ */
+package org.eclipse.apogy.core.environment.surface.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.apogy.common.images.ApogyCommonImagesFactory;
+
+import org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage;
+import org.eclipse.apogy.core.environment.surface.ImageBasedShaderBasedMeshTool;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.apogy.core.environment.surface.ImageBasedShaderBasedMeshTool} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ImageBasedShaderBasedMeshToolItemProvider extends ShaderBasedMeshToolCustomItemProvider {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ImageBasedShaderBasedMeshToolItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+		if (childrenFeatures == null) {
+			super.getChildrenFeatures(object);
+			childrenFeatures.add(ApogySurfaceEnvironmentPackage.Literals.IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE);
+		}
+		return childrenFeatures;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EStructuralFeature getChildFeature(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildFeature(object, child);
+	}
+
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getText(Object object) {
+		String label = ((ImageBasedShaderBasedMeshTool)object).getName();
+		return label == null || label.length() == 0 ?
+			getString("_UI_ImageBasedShaderBasedMeshTool_type") :
+			getString("_UI_ImageBasedShaderBasedMeshTool_type") + " " + label;
+	}
+
+
+	/**
+	 * This handles model notifications by calling {@link #updateChildren} to update any cached
+	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		updateChildren(notification);
+
+		switch (notification.getFeatureID(ImageBasedShaderBasedMeshTool.class)) {
+			case ApogySurfaceEnvironmentPackage.IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE:
+				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+				return;
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+	 * that can be created under this object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add
+			(createChildParameter
+				(ApogySurfaceEnvironmentPackage.Literals.IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE,
+				 ApogyCommonImagesFactory.eINSTANCE.createEImage()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(ApogySurfaceEnvironmentPackage.Literals.IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE,
+				 ApogyCommonImagesFactory.eINSTANCE.createURLEImage()));
+	}
+
+}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/ShaderBasedProjectedImageMeshToolItemProvider.java b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/ShaderBasedProjectedImageMeshToolItemProvider.java
new file mode 100644
index 0000000..1880495
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/ShaderBasedProjectedImageMeshToolItemProvider.java
@@ -0,0 +1,189 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2020 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *      Pierre Allard - initial API and implementation    
+ *         
+ * SPDX-License-Identifier: EPL-1.0    
+ * *******************************************************************************
+ */
+package org.eclipse.apogy.core.environment.surface.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+import org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage;
+import org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool;
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public abstract class ShaderBasedProjectedImageMeshToolItemProvider extends ImageBasedShaderBasedMeshToolItemProvider {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ShaderBasedProjectedImageMeshToolItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			addXDimensionPropertyDescriptor(object);
+			addYDimensionPropertyDescriptor(object);
+			addTransparentColorPropertyDescriptor(object);
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the XDimension feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addXDimensionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_ShaderBasedProjectedImageMeshTool_xDimension_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_ShaderBasedProjectedImageMeshTool_xDimension_feature", "_UI_ShaderBasedProjectedImageMeshTool_type"),
+				 ApogySurfaceEnvironmentPackage.Literals.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__XDIMENSION,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the YDimension feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addYDimensionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_ShaderBasedProjectedImageMeshTool_yDimension_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_ShaderBasedProjectedImageMeshTool_yDimension_feature", "_UI_ShaderBasedProjectedImageMeshTool_type"),
+				 ApogySurfaceEnvironmentPackage.Literals.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__YDIMENSION,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.REAL_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Transparent Color feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addTransparentColorPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_ShaderBasedProjectedImageMeshTool_transparentColor_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_ShaderBasedProjectedImageMeshTool_transparentColor_feature", "_UI_ShaderBasedProjectedImageMeshTool_type"),
+				 ApogySurfaceEnvironmentPackage.Literals.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__TRANSPARENT_COLOR,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This returns ShaderBasedProjectedImageMeshTool.gif.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return overlayImage(object, getResourceLocator().getImage("full/obj16/ShaderBasedProjectedImageMeshTool"));
+	}
+
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getText(Object object) {
+		String label = ((ShaderBasedProjectedImageMeshTool)object).getName();
+		return label == null || label.length() == 0 ?
+			getString("_UI_ShaderBasedProjectedImageMeshTool_type") :
+			getString("_UI_ShaderBasedProjectedImageMeshTool_type") + " " + label;
+	}
+
+
+	/**
+	 * This handles model notifications by calling {@link #updateChildren} to update any cached
+	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		updateChildren(notification);
+
+		switch (notification.getFeatureID(ShaderBasedProjectedImageMeshTool.class)) {
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__XDIMENSION:
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__YDIMENSION:
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__TRANSPARENT_COLOR:
+				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+				return;
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+	 * that can be created under this object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+	}
+
+}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariableAngularDisplayMeshToolItemProvider.java b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariableAngularDisplayMeshToolItemProvider.java
index 4e0c497..51e86aa 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariableAngularDisplayMeshToolItemProvider.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariableAngularDisplayMeshToolItemProvider.java
@@ -26,6 +26,7 @@
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 
 /**
@@ -57,6 +58,8 @@
 			super.getPropertyDescriptors(object);
 
 			addVariableFeatureReferencePropertyDescriptor(object);
+			addUpdatePositionPropertyDescriptor(object);
+			addUpdateOrientationPropertyDescriptor(object);
 		}
 		return itemPropertyDescriptors;
 	}
@@ -84,6 +87,50 @@
 	}
 
 	/**
+	 * This adds a property descriptor for the Update Position feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addUpdatePositionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_VariableBasedShaderBasedMeshTool_updatePosition_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_VariableBasedShaderBasedMeshTool_updatePosition_feature", "_UI_VariableBasedShaderBasedMeshTool_type"),
+				 ApogySurfaceEnvironmentPackage.Literals.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Update Orientation feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addUpdateOrientationPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_VariableBasedShaderBasedMeshTool_updateOrientation_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_VariableBasedShaderBasedMeshTool_updateOrientation_feature", "_UI_VariableBasedShaderBasedMeshTool_type"),
+				 ApogySurfaceEnvironmentPackage.Literals.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
 	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
 	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
 	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
@@ -151,7 +198,9 @@
 		updateChildren(notification);
 
 		switch (notification.getFeatureID(VariableAngularDisplayMeshTool.class)) {
+			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_POSITION:
 			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_POSITION:
+			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_ORIENTATION:
 			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
 				return;
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariableBasedShaderBasedMeshToolItemProvider.java b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariableBasedShaderBasedMeshToolItemProvider.java
index 819f5ae..0df1e38 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariableBasedShaderBasedMeshToolItemProvider.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariableBasedShaderBasedMeshToolItemProvider.java
@@ -26,6 +26,7 @@
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 
 /**
@@ -57,6 +58,8 @@
 			super.getPropertyDescriptors(object);
 
 			addVariableFeatureReferencePropertyDescriptor(object);
+			addUpdatePositionPropertyDescriptor(object);
+			addUpdateOrientationPropertyDescriptor(object);
 		}
 		return itemPropertyDescriptors;
 	}
@@ -84,6 +87,50 @@
 	}
 
 	/**
+	 * This adds a property descriptor for the Update Position feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addUpdatePositionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_VariableBasedShaderBasedMeshTool_updatePosition_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_VariableBasedShaderBasedMeshTool_updatePosition_feature", "_UI_VariableBasedShaderBasedMeshTool_type"),
+				 ApogySurfaceEnvironmentPackage.Literals.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Update Orientation feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addUpdateOrientationPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_VariableBasedShaderBasedMeshTool_updateOrientation_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_VariableBasedShaderBasedMeshTool_updateOrientation_feature", "_UI_VariableBasedShaderBasedMeshTool_type"),
+				 ApogySurfaceEnvironmentPackage.Literals.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
 	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
 	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
 	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
@@ -140,7 +187,9 @@
 		updateChildren(notification);
 
 		switch (notification.getFeatureID(VariableBasedShaderBasedMeshTool.class)) {
+			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION:
 			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION:
+			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION:
 			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
 				return;
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariablePoseBullseyeToolItemProvider.java b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariablePoseBullseyeToolItemProvider.java
index 816b9ea..fad9373 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariablePoseBullseyeToolItemProvider.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariablePoseBullseyeToolItemProvider.java
@@ -27,6 +27,7 @@
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 
 /**
@@ -58,6 +59,8 @@
 			super.getPropertyDescriptors(object);
 
 			addVariableFeatureReferencePropertyDescriptor(object);
+			addUpdatePositionPropertyDescriptor(object);
+			addUpdateOrientationPropertyDescriptor(object);
 		}
 		return itemPropertyDescriptors;
 	}
@@ -85,6 +88,50 @@
 	}
 
 	/**
+	 * This adds a property descriptor for the Update Position feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addUpdatePositionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_VariableBasedShaderBasedMeshTool_updatePosition_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_VariableBasedShaderBasedMeshTool_updatePosition_feature", "_UI_VariableBasedShaderBasedMeshTool_type"),
+				 ApogySurfaceEnvironmentPackage.Literals.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Update Orientation feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addUpdateOrientationPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_VariableBasedShaderBasedMeshTool_updateOrientation_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_VariableBasedShaderBasedMeshTool_updateOrientation_feature", "_UI_VariableBasedShaderBasedMeshTool_type"),
+				 ApogySurfaceEnvironmentPackage.Literals.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
 	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
 	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
 	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
@@ -152,7 +199,9 @@
 		updateChildren(notification);
 
 		switch (notification.getFeatureID(VariablePoseBullseyeTool.class)) {
+			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_POSITION:
 			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_POSITION:
+			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_ORIENTATION:
 			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_ROTATION_MATRIX:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
 				return;
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariableShaderBasedGridToolItemProvider.java b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariableShaderBasedGridToolItemProvider.java
index 7efe5f3..83b0060 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariableShaderBasedGridToolItemProvider.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariableShaderBasedGridToolItemProvider.java
@@ -27,6 +27,7 @@
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
 import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
 import org.eclipse.emf.edit.provider.ViewerNotification;
 
 /**
@@ -58,6 +59,8 @@
 			super.getPropertyDescriptors(object);
 
 			addVariableFeatureReferencePropertyDescriptor(object);
+			addUpdatePositionPropertyDescriptor(object);
+			addUpdateOrientationPropertyDescriptor(object);
 		}
 		return itemPropertyDescriptors;
 	}
@@ -85,6 +88,50 @@
 	}
 
 	/**
+	 * This adds a property descriptor for the Update Position feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addUpdatePositionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_VariableBasedShaderBasedMeshTool_updatePosition_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_VariableBasedShaderBasedMeshTool_updatePosition_feature", "_UI_VariableBasedShaderBasedMeshTool_type"),
+				 ApogySurfaceEnvironmentPackage.Literals.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Update Orientation feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addUpdateOrientationPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_VariableBasedShaderBasedMeshTool_updateOrientation_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_VariableBasedShaderBasedMeshTool_updateOrientation_feature", "_UI_VariableBasedShaderBasedMeshTool_type"),
+				 ApogySurfaceEnvironmentPackage.Literals.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
 	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
 	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
 	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
@@ -152,7 +199,9 @@
 		updateChildren(notification);
 
 		switch (notification.getFeatureID(VariableShaderBasedGridTool.class)) {
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_POSITION:
 			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_POSITION:
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_ORIENTATION:
 			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_ROTATION_MATRIX:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
 				return;
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariableShaderBasedProjectedImageMeshToolItemProvider.java b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariableShaderBasedProjectedImageMeshToolItemProvider.java
new file mode 100644
index 0000000..efbcdc8
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.edit/src-gen/org/eclipse/apogy/core/environment/surface/provider/VariableShaderBasedProjectedImageMeshToolItemProvider.java
@@ -0,0 +1,240 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2020 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *      Pierre Allard - initial API and implementation    
+ *         
+ * SPDX-License-Identifier: EPL-1.0    
+ * *******************************************************************************
+ */
+package org.eclipse.apogy.core.environment.surface.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage;
+import org.eclipse.apogy.core.environment.surface.VariableShaderBasedProjectedImageMeshTool;
+
+import org.eclipse.apogy.core.invocator.ApogyCoreInvocatorFactory;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.apogy.core.environment.surface.VariableShaderBasedProjectedImageMeshTool} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public abstract class VariableShaderBasedProjectedImageMeshToolItemProvider extends ShaderBasedProjectedImageMeshToolCustomItemProvider {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VariableShaderBasedProjectedImageMeshToolItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			addVariableFeatureReferencePropertyDescriptor(object);
+			addUpdatePositionPropertyDescriptor(object);
+			addUpdateOrientationPropertyDescriptor(object);
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Variable Feature Reference feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addVariableFeatureReferencePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_VariableBasedShaderBasedMeshTool_variableFeatureReference_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_VariableBasedShaderBasedMeshTool_variableFeatureReference_feature", "_UI_VariableBasedShaderBasedMeshTool_type"),
+				 ApogySurfaceEnvironmentPackage.Literals.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE,
+				 true,
+				 false,
+				 false,
+				 null,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Update Position feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addUpdatePositionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_VariableBasedShaderBasedMeshTool_updatePosition_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_VariableBasedShaderBasedMeshTool_updatePosition_feature", "_UI_VariableBasedShaderBasedMeshTool_type"),
+				 ApogySurfaceEnvironmentPackage.Literals.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Update Orientation feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addUpdateOrientationPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_VariableBasedShaderBasedMeshTool_updateOrientation_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_VariableBasedShaderBasedMeshTool_updateOrientation_feature", "_UI_VariableBasedShaderBasedMeshTool_type"),
+				 ApogySurfaceEnvironmentPackage.Literals.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+		if (childrenFeatures == null) {
+			super.getChildrenFeatures(object);
+			childrenFeatures.add(ApogySurfaceEnvironmentPackage.Literals.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE);
+		}
+		return childrenFeatures;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EStructuralFeature getChildFeature(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildFeature(object, child);
+	}
+
+	/**
+	 * This returns VariableShaderBasedProjectedImageMeshTool.gif.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return overlayImage(object, getResourceLocator().getImage("full/obj16/VariableShaderBasedProjectedImageMeshTool"));
+	}
+
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getText(Object object) {
+		String label = ((VariableShaderBasedProjectedImageMeshTool)object).getName();
+		return label == null || label.length() == 0 ?
+			getString("_UI_VariableShaderBasedProjectedImageMeshTool_type") :
+			getString("_UI_VariableShaderBasedProjectedImageMeshTool_type") + " " + label;
+	}
+
+
+	/**
+	 * This handles model notifications by calling {@link #updateChildren} to update any cached
+	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		updateChildren(notification);
+
+		switch (notification.getFeatureID(VariableShaderBasedProjectedImageMeshTool.class)) {
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_POSITION:
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_POSITION:
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_ORIENTATION:
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
+				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__VARIABLE_FEATURE_REFERENCE:
+				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+				return;
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+	 * that can be created under this object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add
+			(createChildParameter
+				(ApogySurfaceEnvironmentPackage.Literals.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE,
+				 ApogyCoreInvocatorFactory.eINSTANCE.createVariableFeatureReference()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(ApogySurfaceEnvironmentPackage.Literals.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE,
+				 ApogyCoreInvocatorFactory.eINSTANCE.createOperationCall()));
+	}
+
+}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/bundle.properties b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/bundle.properties
index a66b30b..60ea145 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/bundle.properties
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/bundle.properties
@@ -303,3 +303,5 @@
 _UI_VariableShaderBasedGridToolWizardPagesProvider_type = Variable Shader Based Grid Tool Wizard Pages Provider
 _UI_ShaderBasedAngularDisplayMeshToolWizardPagesProvider_type = Shader Based Angular Display Mesh Tool Wizard Pages Provider
 _UI_VariableAngularDisplayMeshToolWizardPagesProvider_type = Variable Angular Display Mesh Tool Wizard Pages Provider
+_UI_ShaderBasedProjectedImageMeshToolWizardPagesProvider_type = Shader Based Projected Image Mesh Tool Wizard Pages Provider
+_UI_VariableShaderBasedProjectedImageMeshToolProvider_type = Variable Shader Based Projected Image Mesh Tool Provider
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/ctool16/CreateAggregateContentNode_aggregateContent_ShaderBasedProjectedImageMeshToolWizardPagesProvider.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/ctool16/CreateAggregateContentNode_aggregateContent_ShaderBasedProjectedImageMeshToolWizardPagesProvider.gif
new file mode 100644
index 0000000..ca61c9e
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/ctool16/CreateAggregateContentNode_aggregateContent_ShaderBasedProjectedImageMeshToolWizardPagesProvider.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/ctool16/CreateAggregateContentNode_aggregateContent_VariableShaderBasedProjectedImageMeshToolProvider.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/ctool16/CreateAggregateContentNode_aggregateContent_VariableShaderBasedProjectedImageMeshToolProvider.gif
new file mode 100644
index 0000000..889f3af
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/ctool16/CreateAggregateContentNode_aggregateContent_VariableShaderBasedProjectedImageMeshToolProvider.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/ctool16/CreateContentNode_content_ShaderBasedProjectedImageMeshToolWizardPagesProvider.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/ctool16/CreateContentNode_content_ShaderBasedProjectedImageMeshToolWizardPagesProvider.gif
new file mode 100644
index 0000000..fa6b936
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/ctool16/CreateContentNode_content_ShaderBasedProjectedImageMeshToolWizardPagesProvider.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/ctool16/CreateContentNode_content_VariableShaderBasedProjectedImageMeshToolProvider.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/ctool16/CreateContentNode_content_VariableShaderBasedProjectedImageMeshToolProvider.gif
new file mode 100644
index 0000000..282f419
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/ctool16/CreateContentNode_content_VariableShaderBasedProjectedImageMeshToolProvider.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/obj16/ShaderBasedProjectedImageMeshToolWizardPagesProvider.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/obj16/ShaderBasedProjectedImageMeshToolWizardPagesProvider.gif
new file mode 100644
index 0000000..83afb9b
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/obj16/ShaderBasedProjectedImageMeshToolWizardPagesProvider.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/obj16/VariableShaderBasedProjectedImageMeshToolProvider.gif b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/obj16/VariableShaderBasedProjectedImageMeshToolProvider.gif
new file mode 100644
index 0000000..89ad5da
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/icons/full/obj16/VariableShaderBasedProjectedImageMeshToolProvider.gif
Binary files differ
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/src-gen/org/eclipse/apogy/core/environment/surface/ui/provider/ApogySurfaceEnvironmentUIItemProviderAdapterFactory.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/src-gen/org/eclipse/apogy/core/environment/surface/ui/provider/ApogySurfaceEnvironmentUIItemProviderAdapterFactory.java
index a9a052d..452f400 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/src-gen/org/eclipse/apogy/core/environment/surface/ui/provider/ApogySurfaceEnvironmentUIItemProviderAdapterFactory.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/src-gen/org/eclipse/apogy/core/environment/surface/ui/provider/ApogySurfaceEnvironmentUIItemProviderAdapterFactory.java
@@ -1076,6 +1076,52 @@
 	}
 
 	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.apogy.core.environment.surface.ui.ShaderBasedProjectedImageMeshToolWizardPagesProvider} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ShaderBasedProjectedImageMeshToolWizardPagesProviderItemProvider shaderBasedProjectedImageMeshToolWizardPagesProviderItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.apogy.core.environment.surface.ui.ShaderBasedProjectedImageMeshToolWizardPagesProvider}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createShaderBasedProjectedImageMeshToolWizardPagesProviderAdapter() {
+		if (shaderBasedProjectedImageMeshToolWizardPagesProviderItemProvider == null) {
+			shaderBasedProjectedImageMeshToolWizardPagesProviderItemProvider = new ShaderBasedProjectedImageMeshToolWizardPagesProviderItemProvider(this);
+		}
+
+		return shaderBasedProjectedImageMeshToolWizardPagesProviderItemProvider;
+	}
+
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.apogy.core.environment.surface.ui.VariableShaderBasedProjectedImageMeshToolProvider} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VariableShaderBasedProjectedImageMeshToolProviderItemProvider variableShaderBasedProjectedImageMeshToolProviderItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.apogy.core.environment.surface.ui.VariableShaderBasedProjectedImageMeshToolProvider}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createVariableShaderBasedProjectedImageMeshToolProviderAdapter() {
+		if (variableShaderBasedProjectedImageMeshToolProviderItemProvider == null) {
+			variableShaderBasedProjectedImageMeshToolProviderItemProvider = new VariableShaderBasedProjectedImageMeshToolProviderItemProvider(this);
+		}
+
+		return variableShaderBasedProjectedImageMeshToolProviderItemProvider;
+	}
+
+	/**
 	 * This returns the root adapter factory that contains this factory.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1249,6 +1295,8 @@
 		if (variableAngularDisplayMeshToolWizardPagesProviderItemProvider != null) variableAngularDisplayMeshToolWizardPagesProviderItemProvider.dispose();
 		if (shaderBasedBullseyeToolWizardPagesProviderItemProvider != null) shaderBasedBullseyeToolWizardPagesProviderItemProvider.dispose();
 		if (variablePoseBullseyeToolWizardPagesProviderItemProvider != null) variablePoseBullseyeToolWizardPagesProviderItemProvider.dispose();
+		if (shaderBasedProjectedImageMeshToolWizardPagesProviderItemProvider != null) shaderBasedProjectedImageMeshToolWizardPagesProviderItemProvider.dispose();
+		if (variableShaderBasedProjectedImageMeshToolProviderItemProvider != null) variableShaderBasedProjectedImageMeshToolProviderItemProvider.dispose();
 	}
 
 	/**
@@ -1702,6 +1750,16 @@
 						(ApogyCommonTopologyPackage.Literals.CONTENT_NODE__CONTENT,
 						 ApogySurfaceEnvironmentUIFactory.eINSTANCE.createVariablePoseBullseyeToolWizardPagesProvider()));
 
+				newChildDescriptors.add
+					(createChildParameter
+						(ApogyCommonTopologyPackage.Literals.CONTENT_NODE__CONTENT,
+						 ApogySurfaceEnvironmentUIFactory.eINSTANCE.createShaderBasedProjectedImageMeshToolWizardPagesProvider()));
+
+				newChildDescriptors.add
+					(createChildParameter
+						(ApogyCommonTopologyPackage.Literals.CONTENT_NODE__CONTENT,
+						 ApogySurfaceEnvironmentUIFactory.eINSTANCE.createVariableShaderBasedProjectedImageMeshToolProvider()));
+
 				return null;
 			}
  
@@ -1922,6 +1980,16 @@
 						(ApogyCommonTopologyPackage.Literals.AGGREGATE_CONTENT_NODE__AGGREGATE_CONTENT,
 						 ApogySurfaceEnvironmentUIFactory.eINSTANCE.createVariablePoseBullseyeToolWizardPagesProvider()));
 
+				newChildDescriptors.add
+					(createChildParameter
+						(ApogyCommonTopologyPackage.Literals.AGGREGATE_CONTENT_NODE__AGGREGATE_CONTENT,
+						 ApogySurfaceEnvironmentUIFactory.eINSTANCE.createShaderBasedProjectedImageMeshToolWizardPagesProvider()));
+
+				newChildDescriptors.add
+					(createChildParameter
+						(ApogyCommonTopologyPackage.Literals.AGGREGATE_CONTENT_NODE__AGGREGATE_CONTENT,
+						 ApogySurfaceEnvironmentUIFactory.eINSTANCE.createVariableShaderBasedProjectedImageMeshToolProvider()));
+
 				return null;
 			}
  
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/src-gen/org/eclipse/apogy/core/environment/surface/ui/provider/ShaderBasedProjectedImageMeshToolWizardPagesProviderItemProvider.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/src-gen/org/eclipse/apogy/core/environment/surface/ui/provider/ShaderBasedProjectedImageMeshToolWizardPagesProviderItemProvider.java
new file mode 100644
index 0000000..e4d189c
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/src-gen/org/eclipse/apogy/core/environment/surface/ui/provider/ShaderBasedProjectedImageMeshToolWizardPagesProviderItemProvider.java
@@ -0,0 +1,109 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *      Pierre Allard - initial API and implementation
+ *      Regent L'Archeveque
+ *         
+ * SPDX-License-Identifier: EPL-1.0    
+ * *******************************************************************************
+ */
+package org.eclipse.apogy.core.environment.surface.ui.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.apogy.common.emf.ui.emfforms.provider.NamedDescribedElementEMFFormsWizardPageProviderItemProvider;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.apogy.core.environment.surface.ui.ShaderBasedProjectedImageMeshToolWizardPagesProvider} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ShaderBasedProjectedImageMeshToolWizardPagesProviderItemProvider extends NamedDescribedElementEMFFormsWizardPageProviderItemProvider {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public ShaderBasedProjectedImageMeshToolWizardPagesProviderItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This returns ShaderBasedProjectedImageMeshToolWizardPagesProvider.gif.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return overlayImage(object, getResourceLocator().getImage("full/obj16/ShaderBasedProjectedImageMeshToolWizardPagesProvider"));
+	}
+
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getText(Object object) {
+		return getString("_UI_ShaderBasedProjectedImageMeshToolWizardPagesProvider_type");
+	}
+
+
+	/**
+	 * This handles model notifications by calling {@link #updateChildren} to update any cached
+	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		updateChildren(notification);
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+	 * that can be created under this object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+	}
+
+}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/src-gen/org/eclipse/apogy/core/environment/surface/ui/provider/VariableShaderBasedProjectedImageMeshToolProviderItemProvider.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/src-gen/org/eclipse/apogy/core/environment/surface/ui/provider/VariableShaderBasedProjectedImageMeshToolProviderItemProvider.java
new file mode 100644
index 0000000..ca5ba5f
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.edit/src-gen/org/eclipse/apogy/core/environment/surface/ui/provider/VariableShaderBasedProjectedImageMeshToolProviderItemProvider.java
@@ -0,0 +1,107 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *      Pierre Allard - initial API and implementation
+ *      Regent L'Archeveque
+ *         
+ * SPDX-License-Identifier: EPL-1.0    
+ * *******************************************************************************
+ */
+package org.eclipse.apogy.core.environment.surface.ui.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.apogy.core.environment.surface.ui.VariableShaderBasedProjectedImageMeshToolProvider} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class VariableShaderBasedProjectedImageMeshToolProviderItemProvider extends ShaderBasedProjectedImageMeshToolWizardPagesProviderItemProvider {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public VariableShaderBasedProjectedImageMeshToolProviderItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This returns VariableShaderBasedProjectedImageMeshToolProvider.gif.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return overlayImage(object, getResourceLocator().getImage("full/obj16/VariableShaderBasedProjectedImageMeshToolProvider"));
+	}
+
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getText(Object object) {
+		return getString("_UI_VariableShaderBasedProjectedImageMeshToolProvider_type");
+	}
+
+
+	/**
+	 * This handles model notifications by calling {@link #updateChildren} to update any cached
+	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		updateChildren(notification);
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+	 * that can be created under this object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+	}
+
+}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.jme3/assets/MatDefs/TerrainLighting.frag b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.jme3/assets/MatDefs/TerrainLighting.frag
index aa20c50..98efba2 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.jme3/assets/MatDefs/TerrainLighting.frag
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.jme3/assets/MatDefs/TerrainLighting.frag
@@ -24,6 +24,15 @@
 uniform mat4 m_Tool6Matrix;

 uniform mat4 m_Tool7Matrix;

 

+uniform sampler2D m_Tool0Texture2D;

+uniform sampler2D m_Tool1Texture2D;

+uniform sampler2D m_Tool2Texture2D;

+uniform sampler2D m_Tool3Texture2D;

+uniform sampler2D m_Tool4Texture2D;

+uniform sampler2D m_Tool5Texture2D;

+uniform sampler2D m_Tool6Texture2D;

+uniform sampler2D m_Tool7Texture2D;

+

 uniform float[] m_Tool0;

 uniform float[] m_Tool1;

 uniform float[] m_Tool2;

@@ -50,6 +59,7 @@
 const float TOOL_GRID_TYPE 	 			 = 2.0;

 const float TOOL_CIRCULAR_LINE_TYPE		 = 3.0;

 const float TOOL_ANGULAR_TYPE			 = 4.0;

+const float TOOL_IMAGE_TYPE			 	 = 5.0;

 

 // ShaderBasedMeshTool END

 

@@ -288,16 +298,35 @@
 

 //-------------------------------------------------------------------------

 

-vec4 contourLineColor(vec3 position, float deltaZ, vec3 lineColor)

+vec4 projectedImageColor(vec3 position, mat4 matrix, float xDimension, float yDimension, sampler2D image, vec3 transparentColor)

 {

-	vec4 contourColor = vec4(0.0, 0.0, 0.0, 0.0);

+	vec4 imageColor = vec4(0.0, 0.0, 0.0, 0.0);

+	vec4 point = matrix * vec4(position.x, position.y, position.z, 1.0);	

 

-	if(abs(mod(position.z, deltaZ)) <= 0.1)

+	float u = (point.x + (xDimension / 2.0)) / xDimension;

+	float v = (point.y + (yDimension / 2.0)) / yDimension;

+

+	// Check image is visible.

+	if(xDimension > 0.0 && yDimension > 0.0)

 	{

-		contourColor = vec4(lineColor, 1.0);

-	}	

+		if( (0.0 <= u) && (u <= 1.0) )

+		{

+			if( (0.0 <= v) && (v <= 1.0)  )

+			{

+				// Sample the texture.				

+				vec2 texCoord = vec2(u, v);

+				imageColor = texture2D(image, texCoord);	

+				

+				// White is set to transparent.

+				if(imageColor.r == transparentColor.r && imageColor.g == transparentColor.g && imageColor.b == transparentColor.b)

+				{

+					imageColor = vec4(0.0, 0.0, 0.0, 0.0);

+				}			

+			}

+		}		

+	}

 	

-	return contourColor;

+	return imageColor;

 }

 

 //-------------------------------------------------------------------------

@@ -1598,10 +1627,10 @@
     			0.0, 0.0, 1.0, 0.0,

     			0.0, 0.0, 0.0, 1.0); 

 }

-

 //-------------------------------------------------------------------------

 

-void main(){

+void main()

+{

     vec2 newTexCoord;

      

     #if (defined(PARALLAXMAP) || (defined(NORMALMAP_PARALLAX) && defined(NORMALMAP))) && !defined(VERTEX_LIGHTING) 

@@ -1779,9 +1808,13 @@
     float tool_param_14	= 0.0;

     float tool_param_15	= 0.0;

     

-    // Color produced by the tool.                     

+    // Color produced by the tool being processed.                     

     vec4 toolColor = vec4(0.0, 0.0, 0.0, 0.0);

+    

+   	vec4 toolsColors[NUMBER_OF_TOOLS] = vec4[NUMBER_OF_TOOLS](vec4(0.0), vec4(0.0), vec4(0.0), vec4(0.0), vec4(0.0), vec4(0.0), vec4(0.0), vec4(0.0));

+   	float[NUMBER_OF_TOOLS] toolsAlphas = float[NUMBER_OF_TOOLS](0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);

                  

+    float enabledToolCount = 0.0;                 

     for(int i = 0; i < NUMBER_OF_TOOLS; i++)

     {

     	// Clear previous tool color.

@@ -1808,10 +1841,15 @@
     	tool_param_13 	= getToolParameter13(i);

     	tool_param_14 	= getToolParameter14(i);

     	tool_param_15 	= getToolParameter15(i);

+    	    	   	    	    	    

+    	// Records the tool alpha value.		    	   	    	    	

+    	toolsAlphas[i] = tool_alpha;

     	    	   	    	    	    	    	    	

     	// If the tool is enabled.

     	if(tool_enable == 1.0)

     	{

+    		enabledToolCount += 1.0;

+    	

     		// Get the tool matrix.

     		toolMatrix = getToolMatrix(i);

     	    	

@@ -1873,30 +1911,72 @@
     		 	

 				toolColor = angularToolColor(myPosition, toolMatrix, lineColor, minRadius, maxRadius, startAngle, endAngle, angleInterval, lineWidth);    		 		 								    		     		 	    		 								     				        			

     		}

-    		    		    		     		    		    	

-    		// If the tool returns a non transparent color, mix it with the fragment color.

-    		if(toolColor.a > 0.0)

- 			{ 				

- 				float originalLuminance = length(gl_FragColor.rgb); 				 				 				

- 				 				 				 				 	

- 				vec3 tempColor = vec3(gl_FragColor.rgb); 				 				 				 				 				

- 				tempColor += tool_alpha * toolColor.rgb; 				

- 				float newLuminance = length(tempColor.rgb);

- 				 				

- 				//gl_FragColor.rgb *= tempColor;

- 				

- 				// Rescale

- 				float t = 1.0;

- 				if(tool_alpha > 0.5)

- 				{

- 					t = 1.0 + (tool_alpha - 0.5);

- 				}

- 				

- 				gl_FragColor.rgb = ((originalLuminance / newLuminance) * t) * tempColor;

-    		}   

+    		

+    		if(tool_type == TOOL_IMAGE_TYPE)

+    		{

+    			float xDimension = tool_param_0;

+    			float yDimension = tool_param_1;

+    			vec3 transparentColor = vec3(tool_param_2,tool_param_3,tool_param_4);

+    			

+    			if(i == 0)

+			    {

+			    	toolColor = projectedImageColor(myPosition, toolMatrix, xDimension, yDimension, m_Tool0Texture2D, transparentColor);	

+			    }	

+			    else if(i == 1)

+			    {

+			    	toolColor = projectedImageColor(myPosition, toolMatrix, xDimension, yDimension, m_Tool1Texture2D, transparentColor);		

+			    }

+			    else if(i == 2)

+			    {

+			    	toolColor = projectedImageColor(myPosition, toolMatrix, xDimension, yDimension, m_Tool2Texture2D, transparentColor);	

+			    }		   

+			    else if(i == 3)

+			    {

+			    	toolColor = projectedImageColor(myPosition, toolMatrix, xDimension, yDimension, m_Tool3Texture2D, transparentColor);	

+			    }		   

+			    else if(i == 4)

+			    {

+			    	toolColor = projectedImageColor(myPosition, toolMatrix, xDimension, yDimension, m_Tool4Texture2D, transparentColor);	

+			    }		   

+			    else if(i == 5)

+			    {

+			    	toolColor = projectedImageColor(myPosition, toolMatrix, xDimension, yDimension, m_Tool5Texture2D, transparentColor);	

+			    }		   

+			    else if(i == 6)

+			    {

+			    	toolColor = projectedImageColor(myPosition, toolMatrix, xDimension, yDimension, m_Tool6Texture2D, transparentColor);	  	

+			    }		   

+			    else if(i == 7)

+			    {

+			    	toolColor = projectedImageColor(myPosition, toolMatrix, xDimension, yDimension, m_Tool7Texture2D, transparentColor);		

+			    }		     			    			    		    		

+    		}    		    

     	}

-    }      

-                 			    

+    	else

+    	{

+    		// Effective tool alpha is zero when tool is disabled.

+    		toolsAlphas[i] = 0.0; 

+    	}

+    	

+    	// Records the color produced by the tool.	

+    	toolsColors[i] = toolColor;   		    		     	    	

+    }

+    	    	    		     

+	// Computes the color generated by all the tools.

+	vec4 color = vec4(0.0, 0.0, 0.0, 0.0);

+

+	if(enabledToolCount > 0.0)

+	{

+		for(int i =0; i < NUMBER_OF_TOOLS; i++)

+		{

+			color = color * (1.0 - toolsAlphas[i]) + toolsAlphas[i] * toolsColors[i];

+		}    		

+		

+		if(color.a > 1.0) color.a = 1.0;

+					

+		gl_FragColor = gl_FragColor * (1.0 - color.a) + color.a * color;

+	}

+    		    		    		     		    		    	    	                 			    

     // Experimental

 }

 

diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.jme3/assets/MatDefs/TerrainLighting.j3md b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.jme3/assets/MatDefs/TerrainLighting.j3md
index 6b8c00f..14e0fca 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.jme3/assets/MatDefs/TerrainLighting.j3md
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.jme3/assets/MatDefs/TerrainLighting.j3md
@@ -142,6 +142,15 @@
     	Matrix4	   Tool6Matrix

     	Matrix4	   Tool7Matrix

         

+        Texture2D	Tool0Texture2D

+        Texture2D	Tool1Texture2D

+        Texture2D	Tool2Texture2D

+        Texture2D	Tool3Texture2D

+        Texture2D	Tool4Texture2D

+        Texture2D	Tool5Texture2D

+        Texture2D	Tool6Texture2D

+        Texture2D	Tool7Texture2D

+        

         FloatArray Tool0

         FloatArray Tool1

         FloatArray Tool2

@@ -156,8 +165,8 @@
 

         LightMode MultiPass

 

-        VertexShader GLSL100:   MatDefs/TerrainLighting.vert

-        FragmentShader GLSL100: MatDefs/TerrainLighting.frag

+        VertexShader GLSL120:   MatDefs/TerrainLighting.vert

+        FragmentShader GLSL120: MatDefs/TerrainLighting.frag

 

         WorldParameters {

             WorldViewProjectionMatrix

diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.jme3/src/org/eclipse/apogy/core/environment/surface/ui/jme3/scene_objects/CartesianTriangularMeshMapLayerNodeJM3SceneObject.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.jme3/src/org/eclipse/apogy/core/environment/surface/ui/jme3/scene_objects/CartesianTriangularMeshMapLayerNodeJM3SceneObject.java
index 08a1937..0446f58 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.ui.jme3/src/org/eclipse/apogy/core/environment/surface/ui/jme3/scene_objects/CartesianTriangularMeshMapLayerNodeJM3SceneObject.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui.jme3/src/org/eclipse/apogy/core/environment/surface/ui/jme3/scene_objects/CartesianTriangularMeshMapLayerNodeJM3SceneObject.java
@@ -40,6 +40,7 @@
 import org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage;
 import org.eclipse.apogy.core.environment.surface.CartesianTriangularMeshMapLayer;
 import org.eclipse.apogy.core.environment.surface.CartesianTriangularMeshMapLayerNode;
+import org.eclipse.apogy.core.environment.surface.ImageBasedShaderBasedMeshTool;
 import org.eclipse.apogy.core.environment.surface.ShaderBasedMeshTool;
 import org.eclipse.apogy.core.environment.surface.ui.scene_objects.CartesianTriangularMeshMapLayerNodeSceneObject;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -442,6 +443,9 @@
 				Matrix4f m = createMatrix4f(ApogyCommonMathFacade.INSTANCE.createIdentityMatrix4x4());
 				mat.setMatrix4(getToolMatrixNameForIndex(i), m);
 
+				// Initialise the textures.
+				mat.setTexture(getToolTextureNameForIndex(i), null);
+				
 				// Initialises the tool parameters array.	
 				float [] parameters = new float[NUMBER_OF_PARAMETERS];				
 				mat.setParam(getToolParamNameForIndex(i), VarType.FloatArray, parameters);				
@@ -507,6 +511,17 @@
 				Matrix4f m = createMatrix4f(tool.createToolMatrix());
 				mat.setParam(getToolMatrixNameForIndex(toolIndex), VarType.Matrix4, m);
 				
+				if(tool instanceof ImageBasedShaderBasedMeshTool)
+				{
+					ImageBasedShaderBasedMeshTool t = (ImageBasedShaderBasedMeshTool) tool;
+					AbstractEImage image = t.getImage();
+					if(image !=  null)
+					{
+						Texture2D texture = createTexture(image);
+						mat.setTexture(getToolTextureNameForIndex(toolIndex), texture);			
+					}										
+				}
+				
 				float [] parameters = tool.createShaderParameters();				
 				mat.setParam(getToolParamNameForIndex(toolIndex), VarType.FloatArray, parameters);
 				
@@ -517,7 +532,8 @@
 			{				
 				Matrix4f m = createMatrix4f(ApogyCommonMathFacade.INSTANCE.createIdentityMatrix4x4());
 				mat.setParam(getToolMatrixNameForIndex(toolIndex), VarType.Matrix4, m);
-				mat.setParam(getToolParamNameForIndex(toolIndex), VarType.FloatArray, new float[NUMBER_OF_PARAMETERS]);
+				mat.setParam(getToolParamNameForIndex(toolIndex), VarType.FloatArray, new float[NUMBER_OF_PARAMETERS]);				
+				mat.setTexture(getToolTextureNameForIndex(i), null);								
 			}
 		}
 	}
@@ -531,6 +547,17 @@
 			Matrix4f m = createMatrix4f(tool.createToolMatrix());
 			mat.setParam(getToolMatrixNameForIndex(toolIndex), VarType.Matrix4, m);
 			
+			if(tool instanceof ImageBasedShaderBasedMeshTool)
+			{
+				ImageBasedShaderBasedMeshTool t = (ImageBasedShaderBasedMeshTool) tool;
+				AbstractEImage image = t.getImage();
+				if(image !=  null)
+				{
+					Texture2D texture = createTexture(image);
+					mat.setTexture(getToolTextureNameForIndex(toolIndex), texture);			
+				}
+			}
+						
 			float [] parameters = tool.createShaderParameters();
 			mat.setParam(getToolParamNameForIndex(toolIndex), VarType.FloatArray, parameters);		
 		}
@@ -541,6 +568,11 @@
 		return "Tool" + toolIndex + "Matrix";
 	}
 	
+	private String getToolTextureNameForIndex(int toolIndex)
+	{
+		return "Tool" + toolIndex + "Texture2D";
+	}
+	
 	private String getToolParamNameForIndex(int toolIndex)
 	{
 		return "Tool" + toolIndex;
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/model/apogy_core_environment_surface_ui.xcore b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/model/apogy_core_environment_surface_ui.xcore
index 89bc896..b73d0b8 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/model/apogy_core_environment_surface_ui.xcore
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/model/apogy_core_environment_surface_ui.xcore
@@ -746,3 +746,15 @@
 class VariablePoseBullseyeToolWizardPagesProvider extends NamedDescribedElementEMFFormsWizardPageProvider
 {
 }
+
+// Wizard Support for ShaderBasedProjectedImageMeshTool
+@Apogy(hasCustomClass="true")
+class ShaderBasedProjectedImageMeshToolWizardPagesProvider extends NamedDescribedElementEMFFormsWizardPageProvider
+{	
+}
+
+// Wizard Support for ShaderBasedProjectedImageMeshToolWizardPagesProvider
+@Apogy(hasCustomClass="true")
+class VariableShaderBasedProjectedImageMeshToolProvider extends ShaderBasedProjectedImageMeshToolWizardPagesProvider
+{	
+}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/plugin.xml b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/plugin.xml
index 4bf9177..46e6161 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/plugin.xml
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/plugin.xml
@@ -164,6 +164,10 @@
 
 
 <extension  point="org.eclipse.emf.ecp.view.model.provider.xmi.file">
+<file filePath="viewModels/VariableShaderBasedProjectedImageMeshTool.view"/>
+
+<file filePath="viewModels/ShaderBasedProjectedImageMeshTool.view"/>
+
 <file filePath="viewModels/VariableShaderBasedGridTool.view"/>
 
 <file filePath="viewModels/VariableAngularDisplayMeshTool.view"/>
@@ -262,5 +266,13 @@
          eClass="org.eclipse.apogy.core.environment.surface.VariableAngularDisplayMeshTool"
          provider="org.eclipse.apogy.core.environment.surface.ui.VariableAngularDisplayMeshToolWizardPagesProvider">
    </WizardPages>
+   <WizardPages
+         eClass="org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool"
+         provider="org.eclipse.apogy.core.environment.surface.ui.ShaderBasedProjectedImageMeshToolWizardPagesProvider">
+   </WizardPages>
+   <WizardPages
+         eClass="org.eclipse.apogy.core.environment.surface.VariableShaderBasedProjectedImageMeshTool"
+         provider="org.eclipse.apogy.core.environment.surface.ui.VariableShaderBasedProjectedImageMeshToolProvider">
+   </WizardPages>
 </extension>
 </plugin>
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen-custom/org/eclipse/apogy/core/environment/surface/ui/impl/ShaderBasedProjectedImageMeshToolWizardPagesProviderCustomImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen-custom/org/eclipse/apogy/core/environment/surface/ui/impl/ShaderBasedProjectedImageMeshToolWizardPagesProviderCustomImpl.java
new file mode 100644
index 0000000..05f26a0
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen-custom/org/eclipse/apogy/core/environment/surface/ui/impl/ShaderBasedProjectedImageMeshToolWizardPagesProviderCustomImpl.java
@@ -0,0 +1,65 @@
+package org.eclipse.apogy.core.environment.surface.ui.impl;
+
+import org.eclipse.apogy.common.emf.ApogyCommonEMFFacade;
+import org.eclipse.apogy.common.emf.ui.EClassSettings;
+import org.eclipse.apogy.common.emf.ui.MapBasedEClassSettings;
+import org.eclipse.apogy.common.images.ApogyCommonImagesFactory;
+import org.eclipse.apogy.common.images.URLEImage;
+import org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentFactory;
+import org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage;
+import org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool;
+import org.eclipse.apogy.core.environment.surface.ui.wizards.ShaderBasedProjectedImageMeshToolImageURLWizardPage;
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.wizard.WizardPage;
+
+public class ShaderBasedProjectedImageMeshToolWizardPagesProviderCustomImpl extends ShaderBasedProjectedImageMeshToolWizardPagesProviderImpl 
+{
+	@Override
+	public EObject createEObject(EClass eClass, EClassSettings settings) 
+	{
+		ShaderBasedProjectedImageMeshTool tool = ApogySurfaceEnvironmentFactory.eINSTANCE.createShaderBasedProjectedImageMeshTool();		
+		tool.setDescription(ApogyCommonEMFFacade.INSTANCE.getDocumentation(ApogySurfaceEnvironmentPackage.Literals.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL));
+		
+		// Force tool to update its position and rotation
+		tool.getPosition();
+		tool.getRotationMatrix();
+		
+		URLEImage image = ApogyCommonImagesFactory.eINSTANCE.createURLEImage();
+		image.setUrl("file:///home/pallard/Pictures/Pattern.png");
+		tool.setImage(image);
+		
+		if (settings instanceof MapBasedEClassSettings) 
+		{
+			MapBasedEClassSettings mapBasedEClassSettings = (MapBasedEClassSettings) settings;
+			
+			if(mapBasedEClassSettings.getUserDataMap().get("name") != null)
+			{
+				tool.setName((String) mapBasedEClassSettings.getUserDataMap().get("name"));
+			}
+		}
+		else
+		{
+			tool.setName(ApogySurfaceEnvironmentPackage.Literals.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL.getName());
+		}
+
+		return tool;
+	}
+
+	@Override
+	public EList<WizardPage> instantiateWizardPages(EObject eObject, EClassSettings settings) 
+	{
+		EList<WizardPage> list = new BasicEList<>();
+		list.addAll(super.instantiateWizardPages(eObject, settings));
+
+		ShaderBasedProjectedImageMeshTool tool = (ShaderBasedProjectedImageMeshTool) eObject;
+		
+		// Add pages to create the image.
+		ShaderBasedProjectedImageMeshToolImageURLWizardPage page = new ShaderBasedProjectedImageMeshToolImageURLWizardPage(tool);
+		list.add(page);
+		
+		return list;
+	}
+}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen-custom/org/eclipse/apogy/core/environment/surface/ui/impl/VariableShaderBasedProjectedImageMeshToolProviderCustomImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen-custom/org/eclipse/apogy/core/environment/surface/ui/impl/VariableShaderBasedProjectedImageMeshToolProviderCustomImpl.java
new file mode 100644
index 0000000..96acb02
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen-custom/org/eclipse/apogy/core/environment/surface/ui/impl/VariableShaderBasedProjectedImageMeshToolProviderCustomImpl.java
@@ -0,0 +1,81 @@
+package org.eclipse.apogy.core.environment.surface.ui.impl;
+
+import org.eclipse.apogy.common.emf.ApogyCommonEMFFacade;
+import org.eclipse.apogy.common.emf.ui.EClassSettings;
+import org.eclipse.apogy.common.emf.ui.MapBasedEClassSettings;
+import org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentFactory;
+import org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage;
+import org.eclipse.apogy.core.environment.surface.VariableShaderBasedProjectedImageMeshTool;
+import org.eclipse.apogy.core.invocator.ApogyCoreInvocatorFactory;
+import org.eclipse.apogy.core.invocator.ui.wizards.VariableFeatureReferenceWizardPage;
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.wizard.WizardPage;
+
+public class VariableShaderBasedProjectedImageMeshToolProviderCustomImpl extends VariableShaderBasedProjectedImageMeshToolProviderImpl 
+{
+	public EObject createEObject(EClass eClass, EClassSettings settings) 
+	{
+		VariableShaderBasedProjectedImageMeshTool tool = ApogySurfaceEnvironmentFactory.eINSTANCE.createVariableShaderBasedProjectedImageMeshTool();		
+		tool.setVariableFeatureReference(ApogyCoreInvocatorFactory.eINSTANCE.createVariableFeatureReference());
+		tool.setDescription(ApogyCommonEMFFacade.INSTANCE.getDocumentation(ApogySurfaceEnvironmentPackage.Literals.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL));
+									
+		// Force position and rotation update
+		tool.getPosition();
+		tool.getRotationMatrix();
+		tool.getRelativePosition();
+		tool.getRelativeRotationMatrix();
+		
+		if (settings instanceof MapBasedEClassSettings) 
+		{
+			MapBasedEClassSettings mapBasedEClassSettings = (MapBasedEClassSettings) settings;
+			
+			if(mapBasedEClassSettings.getUserDataMap().get("name") != null)
+			{
+				tool.setName((String) mapBasedEClassSettings.getUserDataMap().get("name"));
+			}
+		}
+		else
+		{
+			tool.setName(ApogySurfaceEnvironmentPackage.Literals.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL.getName());
+		}
+
+
+		return tool;
+	}
+	
+	@Override
+	public EList<WizardPage> instantiateWizardPages(EObject eObject, EClassSettings settings) 
+	{
+		EList<WizardPage> list = new BasicEList<>();
+		list.addAll(super.instantiateWizardPages(eObject, settings));
+
+		VariableShaderBasedProjectedImageMeshTool tool = (VariableShaderBasedProjectedImageMeshTool) eObject;
+		
+		// Add pages to create the tool.
+		VariableFeatureReferenceWizardPage variableFeatureReferenceWizardPage = new VariableFeatureReferenceWizardPage(tool.getVariableFeatureReference())
+		{
+			@Override
+			protected void validate() 
+			{
+				String errorStr = null;
+
+				if (getResolvedEObject().getVariable() == null) 
+				{
+					errorStr = "Select the Variable.";
+				} 				
+				setErrorMessage(errorStr);
+				setPageComplete(errorStr == null);
+			}
+		};
+		variableFeatureReferenceWizardPage.setTitle("Variable Feature Selection.");
+		variableFeatureReferenceWizardPage.setDescription("Select Variable Feature for which to track the pose.");		
+		pages.add(variableFeatureReferenceWizardPage);
+		
+		return list;
+	}
+	
+	
+}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/ApogySurfaceEnvironmentUIFactory.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/ApogySurfaceEnvironmentUIFactory.java
index 416e1af..a47404c 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/ApogySurfaceEnvironmentUIFactory.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/ApogySurfaceEnvironmentUIFactory.java
@@ -413,6 +413,24 @@
 	VariablePoseBullseyeToolWizardPagesProvider createVariablePoseBullseyeToolWizardPagesProvider();
 
 	/**
+	 * Returns a new object of class '<em>Shader Based Projected Image Mesh Tool Wizard Pages Provider</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Shader Based Projected Image Mesh Tool Wizard Pages Provider</em>'.
+	 * @generated
+	 */
+	ShaderBasedProjectedImageMeshToolWizardPagesProvider createShaderBasedProjectedImageMeshToolWizardPagesProvider();
+
+	/**
+	 * Returns a new object of class '<em>Variable Shader Based Projected Image Mesh Tool Provider</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Variable Shader Based Projected Image Mesh Tool Provider</em>'.
+	 * @generated
+	 */
+	VariableShaderBasedProjectedImageMeshToolProvider createVariableShaderBasedProjectedImageMeshToolProvider();
+
+	/**
 	 * Returns the package supported by this factory.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/ApogySurfaceEnvironmentUIPackage.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/ApogySurfaceEnvironmentUIPackage.java
index 8d4b2f5..2ade500 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/ApogySurfaceEnvironmentUIPackage.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/ApogySurfaceEnvironmentUIPackage.java
@@ -4877,6 +4877,188 @@
 	int VARIABLE_POSE_BULLSEYE_TOOL_WIZARD_PAGES_PROVIDER_OPERATION_COUNT = ApogyCommonEMFUiEMFFormsPackage.NAMED_DESCRIBED_ELEMENT_EMF_FORMS_WIZARD_PAGE_PROVIDER_OPERATION_COUNT + 0;
 
 	/**
+	 * The meta object id for the '{@link org.eclipse.apogy.core.environment.surface.ui.impl.ShaderBasedProjectedImageMeshToolWizardPagesProviderImpl <em>Shader Based Projected Image Mesh Tool Wizard Pages Provider</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.apogy.core.environment.surface.ui.impl.ShaderBasedProjectedImageMeshToolWizardPagesProviderImpl
+	 * @see org.eclipse.apogy.core.environment.surface.ui.impl.ApogySurfaceEnvironmentUIPackageImpl#getShaderBasedProjectedImageMeshToolWizardPagesProvider()
+	 * @generated
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER = 49;
+
+	/**
+	 * The feature id for the '<em><b>Pages</b></em>' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER__PAGES = ApogyCommonEMFUiEMFFormsPackage.NAMED_DESCRIBED_ELEMENT_EMF_FORMS_WIZARD_PAGE_PROVIDER__PAGES;
+
+	/**
+	 * The feature id for the '<em><b>EObject</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER__EOBJECT = ApogyCommonEMFUiEMFFormsPackage.NAMED_DESCRIBED_ELEMENT_EMF_FORMS_WIZARD_PAGE_PROVIDER__EOBJECT;
+
+	/**
+	 * The number of structural features of the '<em>Shader Based Projected Image Mesh Tool Wizard Pages Provider</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER_FEATURE_COUNT = ApogyCommonEMFUiEMFFormsPackage.NAMED_DESCRIBED_ELEMENT_EMF_FORMS_WIZARD_PAGE_PROVIDER_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>Get Pages</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER___GET_PAGES__ECLASS_ECLASSSETTINGS = ApogyCommonEMFUiEMFFormsPackage.NAMED_DESCRIBED_ELEMENT_EMF_FORMS_WIZARD_PAGE_PROVIDER___GET_PAGES__ECLASS_ECLASSSETTINGS;
+
+	/**
+	 * The operation id for the '<em>Create EObject</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER___CREATE_EOBJECT__ECLASS_ECLASSSETTINGS = ApogyCommonEMFUiEMFFormsPackage.NAMED_DESCRIBED_ELEMENT_EMF_FORMS_WIZARD_PAGE_PROVIDER___CREATE_EOBJECT__ECLASS_ECLASSSETTINGS;
+
+	/**
+	 * The operation id for the '<em>Instantiate Wizard Pages</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER___INSTANTIATE_WIZARD_PAGES__EOBJECT_ECLASSSETTINGS = ApogyCommonEMFUiEMFFormsPackage.NAMED_DESCRIBED_ELEMENT_EMF_FORMS_WIZARD_PAGE_PROVIDER___INSTANTIATE_WIZARD_PAGES__EOBJECT_ECLASSSETTINGS;
+
+	/**
+	 * The operation id for the '<em>Get Perform Finish Commands</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER___GET_PERFORM_FINISH_COMMANDS__EOBJECT_ECLASSSETTINGS_EDITINGDOMAIN = ApogyCommonEMFUiEMFFormsPackage.NAMED_DESCRIBED_ELEMENT_EMF_FORMS_WIZARD_PAGE_PROVIDER___GET_PERFORM_FINISH_COMMANDS__EOBJECT_ECLASSSETTINGS_EDITINGDOMAIN;
+
+	/**
+	 * The operation id for the '<em>Get Next Page</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER___GET_NEXT_PAGE__IWIZARDPAGE = ApogyCommonEMFUiEMFFormsPackage.NAMED_DESCRIBED_ELEMENT_EMF_FORMS_WIZARD_PAGE_PROVIDER___GET_NEXT_PAGE__IWIZARDPAGE;
+
+	/**
+	 * The number of operations of the '<em>Shader Based Projected Image Mesh Tool Wizard Pages Provider</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER_OPERATION_COUNT = ApogyCommonEMFUiEMFFormsPackage.NAMED_DESCRIBED_ELEMENT_EMF_FORMS_WIZARD_PAGE_PROVIDER_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.apogy.core.environment.surface.ui.impl.VariableShaderBasedProjectedImageMeshToolProviderImpl <em>Variable Shader Based Projected Image Mesh Tool Provider</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.apogy.core.environment.surface.ui.impl.VariableShaderBasedProjectedImageMeshToolProviderImpl
+	 * @see org.eclipse.apogy.core.environment.surface.ui.impl.ApogySurfaceEnvironmentUIPackageImpl#getVariableShaderBasedProjectedImageMeshToolProvider()
+	 * @generated
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_PROVIDER = 50;
+
+	/**
+	 * The feature id for the '<em><b>Pages</b></em>' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_PROVIDER__PAGES = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER__PAGES;
+
+	/**
+	 * The feature id for the '<em><b>EObject</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_PROVIDER__EOBJECT = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER__EOBJECT;
+
+	/**
+	 * The number of structural features of the '<em>Variable Shader Based Projected Image Mesh Tool Provider</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_PROVIDER_FEATURE_COUNT = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>Get Pages</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_PROVIDER___GET_PAGES__ECLASS_ECLASSSETTINGS = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER___GET_PAGES__ECLASS_ECLASSSETTINGS;
+
+	/**
+	 * The operation id for the '<em>Create EObject</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_PROVIDER___CREATE_EOBJECT__ECLASS_ECLASSSETTINGS = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER___CREATE_EOBJECT__ECLASS_ECLASSSETTINGS;
+
+	/**
+	 * The operation id for the '<em>Instantiate Wizard Pages</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_PROVIDER___INSTANTIATE_WIZARD_PAGES__EOBJECT_ECLASSSETTINGS = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER___INSTANTIATE_WIZARD_PAGES__EOBJECT_ECLASSSETTINGS;
+
+	/**
+	 * The operation id for the '<em>Get Perform Finish Commands</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_PROVIDER___GET_PERFORM_FINISH_COMMANDS__EOBJECT_ECLASSSETTINGS_EDITINGDOMAIN = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER___GET_PERFORM_FINISH_COMMANDS__EOBJECT_ECLASSSETTINGS_EDITINGDOMAIN;
+
+	/**
+	 * The operation id for the '<em>Get Next Page</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_PROVIDER___GET_NEXT_PAGE__IWIZARDPAGE = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER___GET_NEXT_PAGE__IWIZARDPAGE;
+
+	/**
+	 * The number of operations of the '<em>Variable Shader Based Projected Image Mesh Tool Provider</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_PROVIDER_OPERATION_COUNT = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER_OPERATION_COUNT + 0;
+
+	/**
 	 * The meta object id for the '<em>List</em>' data type.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -4884,7 +5066,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.ui.impl.ApogySurfaceEnvironmentUIPackageImpl#getList()
 	 * @generated
 	 */
-	int LIST = 49;
+	int LIST = 51;
 
 	/**
 	 * The meta object id for the '<em>Hash Map</em>' data type.
@@ -4894,7 +5076,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.ui.impl.ApogySurfaceEnvironmentUIPackageImpl#getHashMap()
 	 * @generated
 	 */
-	int HASH_MAP = 50;
+	int HASH_MAP = 52;
 
 	/**
 	 * The meta object id for the '<em>Point2d</em>' data type.
@@ -4904,7 +5086,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.ui.impl.ApogySurfaceEnvironmentUIPackageImpl#getPoint2d()
 	 * @generated
 	 */
-	int POINT2D = 51;
+	int POINT2D = 53;
 
 	/**
 	 * The meta object id for the '<em>Point3f</em>' data type.
@@ -4914,7 +5096,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.ui.impl.ApogySurfaceEnvironmentUIPackageImpl#getPoint3f()
 	 * @generated
 	 */
-	int POINT3F = 52;
+	int POINT3F = 54;
 
 
 	/**
@@ -6151,6 +6333,26 @@
 	EClass getVariablePoseBullseyeToolWizardPagesProvider();
 
 	/**
+	 * Returns the meta object for class '{@link org.eclipse.apogy.core.environment.surface.ui.ShaderBasedProjectedImageMeshToolWizardPagesProvider <em>Shader Based Projected Image Mesh Tool Wizard Pages Provider</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Shader Based Projected Image Mesh Tool Wizard Pages Provider</em>'.
+	 * @see org.eclipse.apogy.core.environment.surface.ui.ShaderBasedProjectedImageMeshToolWizardPagesProvider
+	 * @generated
+	 */
+	EClass getShaderBasedProjectedImageMeshToolWizardPagesProvider();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.apogy.core.environment.surface.ui.VariableShaderBasedProjectedImageMeshToolProvider <em>Variable Shader Based Projected Image Mesh Tool Provider</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Variable Shader Based Projected Image Mesh Tool Provider</em>'.
+	 * @see org.eclipse.apogy.core.environment.surface.ui.VariableShaderBasedProjectedImageMeshToolProvider
+	 * @generated
+	 */
+	EClass getVariableShaderBasedProjectedImageMeshToolProvider();
+
+	/**
 	 * Returns the meta object for data type '{@link java.util.List <em>List</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -7260,6 +7462,26 @@
 		EClass VARIABLE_POSE_BULLSEYE_TOOL_WIZARD_PAGES_PROVIDER = eINSTANCE.getVariablePoseBullseyeToolWizardPagesProvider();
 
 		/**
+		 * The meta object literal for the '{@link org.eclipse.apogy.core.environment.surface.ui.impl.ShaderBasedProjectedImageMeshToolWizardPagesProviderImpl <em>Shader Based Projected Image Mesh Tool Wizard Pages Provider</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.apogy.core.environment.surface.ui.impl.ShaderBasedProjectedImageMeshToolWizardPagesProviderImpl
+		 * @see org.eclipse.apogy.core.environment.surface.ui.impl.ApogySurfaceEnvironmentUIPackageImpl#getShaderBasedProjectedImageMeshToolWizardPagesProvider()
+		 * @generated
+		 */
+		EClass SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER = eINSTANCE.getShaderBasedProjectedImageMeshToolWizardPagesProvider();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.apogy.core.environment.surface.ui.impl.VariableShaderBasedProjectedImageMeshToolProviderImpl <em>Variable Shader Based Projected Image Mesh Tool Provider</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.apogy.core.environment.surface.ui.impl.VariableShaderBasedProjectedImageMeshToolProviderImpl
+		 * @see org.eclipse.apogy.core.environment.surface.ui.impl.ApogySurfaceEnvironmentUIPackageImpl#getVariableShaderBasedProjectedImageMeshToolProvider()
+		 * @generated
+		 */
+		EClass VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_PROVIDER = eINSTANCE.getVariableShaderBasedProjectedImageMeshToolProvider();
+
+		/**
 		 * The meta object literal for the '<em>List</em>' data type.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/ShaderBasedProjectedImageMeshToolWizardPagesProvider.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/ShaderBasedProjectedImageMeshToolWizardPagesProvider.java
new file mode 100644
index 0000000..229cc18
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/ShaderBasedProjectedImageMeshToolWizardPagesProvider.java
@@ -0,0 +1,32 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *      Pierre Allard - initial API and implementation
+ *      Regent L'Archeveque
+ *         
+ * SPDX-License-Identifier: EPL-1.0    
+ * *******************************************************************************
+ */
+package org.eclipse.apogy.core.environment.surface.ui;
+
+import org.eclipse.apogy.common.emf.ui.emfforms.NamedDescribedElementEMFFormsWizardPageProvider;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Shader Based Projected Image Mesh Tool Wizard Pages Provider</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.apogy.core.environment.surface.ui.ApogySurfaceEnvironmentUIPackage#getShaderBasedProjectedImageMeshToolWizardPagesProvider()
+ * @model annotation="http://www.eclipse.org/apogy hasCustomClass='true'"
+ * @generated
+ */
+public interface ShaderBasedProjectedImageMeshToolWizardPagesProvider extends NamedDescribedElementEMFFormsWizardPageProvider {
+	
+} // ShaderBasedProjectedImageMeshToolWizardPagesProvider
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/VariableShaderBasedProjectedImageMeshToolProvider.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/VariableShaderBasedProjectedImageMeshToolProvider.java
new file mode 100644
index 0000000..17d9028
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/VariableShaderBasedProjectedImageMeshToolProvider.java
@@ -0,0 +1,31 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *      Pierre Allard - initial API and implementation
+ *      Regent L'Archeveque
+ *         
+ * SPDX-License-Identifier: EPL-1.0    
+ * *******************************************************************************
+ */
+package org.eclipse.apogy.core.environment.surface.ui;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Variable Shader Based Projected Image Mesh Tool Provider</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.apogy.core.environment.surface.ui.ApogySurfaceEnvironmentUIPackage#getVariableShaderBasedProjectedImageMeshToolProvider()
+ * @model annotation="http://www.eclipse.org/apogy hasCustomClass='true'"
+ * @generated
+ */
+public interface VariableShaderBasedProjectedImageMeshToolProvider extends ShaderBasedProjectedImageMeshToolWizardPagesProvider {
+	
+} // VariableShaderBasedProjectedImageMeshToolProvider
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/impl/ApogySurfaceEnvironmentUIFactoryImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/impl/ApogySurfaceEnvironmentUIFactoryImpl.java
index eb0587f..030c1bf 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/impl/ApogySurfaceEnvironmentUIFactoryImpl.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/impl/ApogySurfaceEnvironmentUIFactoryImpl.java
@@ -118,6 +118,8 @@
 			case ApogySurfaceEnvironmentUIPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL_WIZARD_PAGES_PROVIDER: return createVariableAngularDisplayMeshToolWizardPagesProvider();
 			case ApogySurfaceEnvironmentUIPackage.SHADER_BASED_BULLSEYE_TOOL_WIZARD_PAGES_PROVIDER: return createShaderBasedBullseyeToolWizardPagesProvider();
 			case ApogySurfaceEnvironmentUIPackage.VARIABLE_POSE_BULLSEYE_TOOL_WIZARD_PAGES_PROVIDER: return createVariablePoseBullseyeToolWizardPagesProvider();
+			case ApogySurfaceEnvironmentUIPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER: return createShaderBasedProjectedImageMeshToolWizardPagesProvider();
+			case ApogySurfaceEnvironmentUIPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_PROVIDER: return createVariableShaderBasedProjectedImageMeshToolProvider();
 			default:
 				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
 		}
@@ -632,6 +634,28 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
+	public ShaderBasedProjectedImageMeshToolWizardPagesProvider createShaderBasedProjectedImageMeshToolWizardPagesProvider() {
+		ShaderBasedProjectedImageMeshToolWizardPagesProviderImpl shaderBasedProjectedImageMeshToolWizardPagesProvider = new ShaderBasedProjectedImageMeshToolWizardPagesProviderCustomImpl();
+		return shaderBasedProjectedImageMeshToolWizardPagesProvider;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public VariableShaderBasedProjectedImageMeshToolProvider createVariableShaderBasedProjectedImageMeshToolProvider() {
+		VariableShaderBasedProjectedImageMeshToolProviderImpl variableShaderBasedProjectedImageMeshToolProvider = new VariableShaderBasedProjectedImageMeshToolProviderCustomImpl();
+		return variableShaderBasedProjectedImageMeshToolProvider;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public List<?> createListFromString(EDataType eDataType, String initialValue) {
 		return (List<?>)super.createFromString(initialValue);
 	}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/impl/ApogySurfaceEnvironmentUIPackageImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/impl/ApogySurfaceEnvironmentUIPackageImpl.java
index 8076167..ba63af7 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/impl/ApogySurfaceEnvironmentUIPackageImpl.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/impl/ApogySurfaceEnvironmentUIPackageImpl.java
@@ -91,6 +91,7 @@
 import org.eclipse.apogy.core.environment.surface.ui.ShaderBasedBullseyeToolWizardPagesProvider;
 import org.eclipse.apogy.core.environment.surface.ui.ShaderBasedDiscreteSlopesToolWizardPagesProvider;
 import org.eclipse.apogy.core.environment.surface.ui.ShaderBasedGridToolWizardPagesProvider;
+import org.eclipse.apogy.core.environment.surface.ui.ShaderBasedProjectedImageMeshToolWizardPagesProvider;
 import org.eclipse.apogy.core.environment.surface.ui.SurfaceWorksiteSettings;
 import org.eclipse.apogy.core.environment.surface.ui.TopologyTreeMapLayerWizardPagesProvider;
 import org.eclipse.apogy.core.environment.surface.ui.TrajectoryPickingTool;
@@ -99,6 +100,7 @@
 import org.eclipse.apogy.core.environment.surface.ui.VariableAngularDisplayMeshToolWizardPagesProvider;
 import org.eclipse.apogy.core.environment.surface.ui.VariablePoseBullseyeToolWizardPagesProvider;
 import org.eclipse.apogy.core.environment.surface.ui.VariableShaderBasedGridToolWizardPagesProvider;
+import org.eclipse.apogy.core.environment.surface.ui.VariableShaderBasedProjectedImageMeshToolProvider;
 import org.eclipse.apogy.core.environment.surface.ui.VariableTrajectoryAnnotation;
 import org.eclipse.apogy.core.environment.surface.ui.VariableTrajectoryProvider;
 import org.eclipse.apogy.core.environment.surface.ui.VehicleVariableAnnotation;
@@ -471,6 +473,20 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	private EClass shaderBasedProjectedImageMeshToolWizardPagesProviderEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass variableShaderBasedProjectedImageMeshToolProviderEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	private EDataType listEDataType = null;
 
 	/**
@@ -1760,6 +1776,26 @@
 	 * @generated
 	 */
 	@Override
+	public EClass getShaderBasedProjectedImageMeshToolWizardPagesProvider() {
+		return shaderBasedProjectedImageMeshToolWizardPagesProviderEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EClass getVariableShaderBasedProjectedImageMeshToolProvider() {
+		return variableShaderBasedProjectedImageMeshToolProviderEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EDataType getList() {
 		return listEDataType;
 	}
@@ -1990,6 +2026,10 @@
 
 		variablePoseBullseyeToolWizardPagesProviderEClass = createEClass(VARIABLE_POSE_BULLSEYE_TOOL_WIZARD_PAGES_PROVIDER);
 
+		shaderBasedProjectedImageMeshToolWizardPagesProviderEClass = createEClass(SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER);
+
+		variableShaderBasedProjectedImageMeshToolProviderEClass = createEClass(VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_PROVIDER);
+
 		// Create data types
 		listEDataType = createEDataType(LIST);
 		hashMapEDataType = createEDataType(HASH_MAP);
@@ -2090,6 +2130,8 @@
 		variableAngularDisplayMeshToolWizardPagesProviderEClass.getESuperTypes().add(theApogyCommonEMFUiEMFFormsPackage.getNamedDescribedElementEMFFormsWizardPageProvider());
 		shaderBasedBullseyeToolWizardPagesProviderEClass.getESuperTypes().add(theApogyCommonEMFUiEMFFormsPackage.getNamedDescribedElementEMFFormsWizardPageProvider());
 		variablePoseBullseyeToolWizardPagesProviderEClass.getESuperTypes().add(theApogyCommonEMFUiEMFFormsPackage.getNamedDescribedElementEMFFormsWizardPageProvider());
+		shaderBasedProjectedImageMeshToolWizardPagesProviderEClass.getESuperTypes().add(theApogyCommonEMFUiEMFFormsPackage.getNamedDescribedElementEMFFormsWizardPageProvider());
+		variableShaderBasedProjectedImageMeshToolProviderEClass.getESuperTypes().add(this.getShaderBasedProjectedImageMeshToolWizardPagesProvider());
 
 		// Initialize classes, features, and operations; add parameters
 		initEClass(abstractSurfaceWorksitePresentationEClass, AbstractSurfaceWorksitePresentation.class, "AbstractSurfaceWorksitePresentation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
@@ -2312,6 +2354,10 @@
 
 		initEClass(variablePoseBullseyeToolWizardPagesProviderEClass, VariablePoseBullseyeToolWizardPagesProvider.class, "VariablePoseBullseyeToolWizardPagesProvider", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 
+		initEClass(shaderBasedProjectedImageMeshToolWizardPagesProviderEClass, ShaderBasedProjectedImageMeshToolWizardPagesProvider.class, "ShaderBasedProjectedImageMeshToolWizardPagesProvider", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(variableShaderBasedProjectedImageMeshToolProviderEClass, VariableShaderBasedProjectedImageMeshToolProvider.class, "VariableShaderBasedProjectedImageMeshToolProvider", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
 		// Initialize data types
 		initEDataType(listEDataType, List.class, "List", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
 		initEDataType(hashMapEDataType, HashMap.class, "HashMap", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
@@ -3121,6 +3167,18 @@
 		   new String[] {
 			   "hasCustomClass", "true"
 		   });
+		addAnnotation
+		  (shaderBasedProjectedImageMeshToolWizardPagesProviderEClass,
+		   source,
+		   new String[] {
+			   "hasCustomClass", "true"
+		   });
+		addAnnotation
+		  (variableShaderBasedProjectedImageMeshToolProviderEClass,
+		   source,
+		   new String[] {
+			   "hasCustomClass", "true"
+		   });
 	}
 
 } //ApogySurfaceEnvironmentUIPackageImpl
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/impl/ShaderBasedProjectedImageMeshToolWizardPagesProviderImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/impl/ShaderBasedProjectedImageMeshToolWizardPagesProviderImpl.java
new file mode 100644
index 0000000..61cd741
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/impl/ShaderBasedProjectedImageMeshToolWizardPagesProviderImpl.java
@@ -0,0 +1,52 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *      Pierre Allard - initial API and implementation
+ *      Regent L'Archeveque
+ *         
+ * SPDX-License-Identifier: EPL-1.0    
+ * *******************************************************************************
+ */
+package org.eclipse.apogy.core.environment.surface.ui.impl;
+
+import org.eclipse.apogy.common.emf.ui.emfforms.impl.NamedDescribedElementEMFFormsWizardPageProviderCustomImpl;
+
+import org.eclipse.apogy.core.environment.surface.ui.ApogySurfaceEnvironmentUIPackage;
+import org.eclipse.apogy.core.environment.surface.ui.ShaderBasedProjectedImageMeshToolWizardPagesProvider;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Shader Based Projected Image Mesh Tool Wizard Pages Provider</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public abstract class ShaderBasedProjectedImageMeshToolWizardPagesProviderImpl extends NamedDescribedElementEMFFormsWizardPageProviderCustomImpl implements ShaderBasedProjectedImageMeshToolWizardPagesProvider {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ShaderBasedProjectedImageMeshToolWizardPagesProviderImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ApogySurfaceEnvironmentUIPackage.Literals.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER;
+	}
+
+} //ShaderBasedProjectedImageMeshToolWizardPagesProviderImpl
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/impl/VariableShaderBasedProjectedImageMeshToolProviderImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/impl/VariableShaderBasedProjectedImageMeshToolProviderImpl.java
new file mode 100644
index 0000000..d041a85
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/impl/VariableShaderBasedProjectedImageMeshToolProviderImpl.java
@@ -0,0 +1,50 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *      Pierre Allard - initial API and implementation
+ *      Regent L'Archeveque
+ *         
+ * SPDX-License-Identifier: EPL-1.0    
+ * *******************************************************************************
+ */
+package org.eclipse.apogy.core.environment.surface.ui.impl;
+
+import org.eclipse.apogy.core.environment.surface.ui.ApogySurfaceEnvironmentUIPackage;
+import org.eclipse.apogy.core.environment.surface.ui.VariableShaderBasedProjectedImageMeshToolProvider;
+
+import org.eclipse.emf.ecore.EClass;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Variable Shader Based Projected Image Mesh Tool Provider</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * @generated
+ */
+public abstract class VariableShaderBasedProjectedImageMeshToolProviderImpl extends ShaderBasedProjectedImageMeshToolWizardPagesProviderCustomImpl implements VariableShaderBasedProjectedImageMeshToolProvider {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VariableShaderBasedProjectedImageMeshToolProviderImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ApogySurfaceEnvironmentUIPackage.Literals.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_PROVIDER;
+	}
+
+} //VariableShaderBasedProjectedImageMeshToolProviderImpl
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/util/ApogySurfaceEnvironmentUIAdapterFactory.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/util/ApogySurfaceEnvironmentUIAdapterFactory.java
index 5fa0412..52aeb24 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/util/ApogySurfaceEnvironmentUIAdapterFactory.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/util/ApogySurfaceEnvironmentUIAdapterFactory.java
@@ -294,6 +294,14 @@
 				return createVariablePoseBullseyeToolWizardPagesProviderAdapter();
 			}
 			@Override
+			public Adapter caseShaderBasedProjectedImageMeshToolWizardPagesProvider(ShaderBasedProjectedImageMeshToolWizardPagesProvider object) {
+				return createShaderBasedProjectedImageMeshToolWizardPagesProviderAdapter();
+			}
+			@Override
+			public Adapter caseVariableShaderBasedProjectedImageMeshToolProvider(VariableShaderBasedProjectedImageMeshToolProvider object) {
+				return createVariableShaderBasedProjectedImageMeshToolProviderAdapter();
+			}
+			@Override
 			public Adapter caseNodePresentation(NodePresentation object) {
 				return createNodePresentationAdapter();
 			}
@@ -1040,6 +1048,34 @@
 	}
 
 	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.apogy.core.environment.surface.ui.ShaderBasedProjectedImageMeshToolWizardPagesProvider <em>Shader Based Projected Image Mesh Tool Wizard Pages Provider</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.apogy.core.environment.surface.ui.ShaderBasedProjectedImageMeshToolWizardPagesProvider
+	 * @generated
+	 */
+	public Adapter createShaderBasedProjectedImageMeshToolWizardPagesProviderAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.apogy.core.environment.surface.ui.VariableShaderBasedProjectedImageMeshToolProvider <em>Variable Shader Based Projected Image Mesh Tool Provider</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.apogy.core.environment.surface.ui.VariableShaderBasedProjectedImageMeshToolProvider
+	 * @generated
+	 */
+	public Adapter createVariableShaderBasedProjectedImageMeshToolProviderAdapter() {
+		return null;
+	}
+
+	/**
 	 * Creates a new adapter for an object of class '{@link org.eclipse.apogy.common.topology.ui.NodePresentation <em>Node Presentation</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/util/ApogySurfaceEnvironmentUISwitch.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/util/ApogySurfaceEnvironmentUISwitch.java
index 4624e3a..4b34665 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/util/ApogySurfaceEnvironmentUISwitch.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src-gen/org/eclipse/apogy/core/environment/surface/ui/util/ApogySurfaceEnvironmentUISwitch.java
@@ -486,6 +486,23 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case ApogySurfaceEnvironmentUIPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_WIZARD_PAGES_PROVIDER: {
+				ShaderBasedProjectedImageMeshToolWizardPagesProvider shaderBasedProjectedImageMeshToolWizardPagesProvider = (ShaderBasedProjectedImageMeshToolWizardPagesProvider)theEObject;
+				T result = caseShaderBasedProjectedImageMeshToolWizardPagesProvider(shaderBasedProjectedImageMeshToolWizardPagesProvider);
+				if (result == null) result = caseNamedDescribedElementEMFFormsWizardPageProvider(shaderBasedProjectedImageMeshToolWizardPagesProvider);
+				if (result == null) result = caseWizardPagesProvider(shaderBasedProjectedImageMeshToolWizardPagesProvider);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ApogySurfaceEnvironmentUIPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_PROVIDER: {
+				VariableShaderBasedProjectedImageMeshToolProvider variableShaderBasedProjectedImageMeshToolProvider = (VariableShaderBasedProjectedImageMeshToolProvider)theEObject;
+				T result = caseVariableShaderBasedProjectedImageMeshToolProvider(variableShaderBasedProjectedImageMeshToolProvider);
+				if (result == null) result = caseShaderBasedProjectedImageMeshToolWizardPagesProvider(variableShaderBasedProjectedImageMeshToolProvider);
+				if (result == null) result = caseNamedDescribedElementEMFFormsWizardPageProvider(variableShaderBasedProjectedImageMeshToolProvider);
+				if (result == null) result = caseWizardPagesProvider(variableShaderBasedProjectedImageMeshToolProvider);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			default: return defaultCase(theEObject);
 		}
 	}
@@ -1226,6 +1243,36 @@
 	}
 
 	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Shader Based Projected Image Mesh Tool Wizard Pages Provider</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Shader Based Projected Image Mesh Tool Wizard Pages Provider</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseShaderBasedProjectedImageMeshToolWizardPagesProvider(ShaderBasedProjectedImageMeshToolWizardPagesProvider object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Variable Shader Based Projected Image Mesh Tool Provider</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Variable Shader Based Projected Image Mesh Tool Provider</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseVariableShaderBasedProjectedImageMeshToolProvider(VariableShaderBasedProjectedImageMeshToolProvider object) {
+		return null;
+	}
+
+	/**
 	 * Returns the result of interpreting the object as an instance of '<em>Node Presentation</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src/org/eclipse/apogy/core/environment/surface/ui/composites/DEMsComposite.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src/org/eclipse/apogy/core/environment/surface/ui/composites/DEMsComposite.java
index fd09dc4..6a26f25 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src/org/eclipse/apogy/core/environment/surface/ui/composites/DEMsComposite.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src/org/eclipse/apogy/core/environment/surface/ui/composites/DEMsComposite.java
@@ -100,7 +100,7 @@
 		ECollectionCompositeSettings shaderBasedToolsListSettings = ApogyCommonEMFUIFactory.eINSTANCE.createECollectionCompositeSettings();
 		shaderBasedToolsListSettings.setCollectionSectionTitle("Shader Based Tools");
 		shaderBasedToolsListSettings.setDetailSectionTitle("Map Layer Presentations Details");		
-		shaderBasedToolsListSettings.setMultiSelection(false);
+		shaderBasedToolsListSettings.setMultiSelection(true);
 		
 		shaderBasedMeshToolListComposite = new ShaderBasedMeshToolListComposite(folder,  SWT.NONE, shaderBasedToolsListSettings);
 		GridData shaderBasedMeshToolListComposite_gd = new GridData(SWT.FILL, SWT.FILL, true, true);
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src/org/eclipse/apogy/core/environment/surface/ui/composites/ShaderBasedMeshToolListComposite.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src/org/eclipse/apogy/core/environment/surface/ui/composites/ShaderBasedMeshToolListComposite.java
index bf49aaf..24c93f4 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src/org/eclipse/apogy/core/environment/surface/ui/composites/ShaderBasedMeshToolListComposite.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src/org/eclipse/apogy/core/environment/surface/ui/composites/ShaderBasedMeshToolListComposite.java
@@ -13,6 +13,10 @@
  *******************************************************************************/
 package org.eclipse.apogy.core.environment.surface.ui.composites;
 
+import java.util.List;
+
+import org.eclipse.apogy.common.emf.ApogyCommonTransactionFacade;
+import org.eclipse.apogy.common.emf.ui.ApogyCommonEMFUIFacade;
 import org.eclipse.apogy.common.emf.ui.ECollectionCompositeSettings;
 import org.eclipse.apogy.common.emf.ui.adapters.AbstractEListContentProvider;
 import org.eclipse.apogy.common.emf.ui.emfforms.composites.EMFFormsEListComposite;
@@ -27,6 +31,9 @@
 import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
 import org.eclipse.jface.wizard.Wizard;
 import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 
 
@@ -53,6 +60,11 @@
 	@Override
 	protected void createButtons(Composite parent, int style) 
 	{
+		createActivateButton(parent, style);
+		createDeActivateButton(parent, style);
+				
+		createSeparator(parent, style);
+		
 		createNewButton(parent, style);
 		createDeleteButton(parent, style);
 		
@@ -60,6 +72,7 @@
 		
 		createUpButton(parent, style);
 		createDownButton(parent, style);
+				
 	}
 	
 	@Override
@@ -78,4 +91,66 @@
 		dialog.open();		
 	}
 	
+	@Override
+	protected void createActivateButtonBindings(Button button) 
+	{
+		ApogyCommonEMFUIFacade.INSTANCE.createViewerSelectionControlEnabledBinding(getDataBindingContext(), getViewer(),
+				button, o -> 
+				{
+					if(o instanceof ShaderBasedMeshTool)
+					{
+						ShaderBasedMeshTool tool = (ShaderBasedMeshTool) o;
+						return !tool.isEnabled();
+					}
+					return false;
+				});
+	}
+	
+	@Override
+	protected void doActivate(List<ShaderBasedMeshTool> list) 
+	{
+		for(ShaderBasedMeshTool tool : list)
+		{
+			ApogyCommonTransactionFacade.INSTANCE.basicSet(tool, ApogySurfaceEnvironmentPackage.Literals.SHADER_BASED_MESH_TOOL__ENABLED, true, true);			
+		}
+	}
+	
+	/**
+	 * Create the De-Activate button used to activate the selected items. By default,
+	 * only one item must be selected. Overwrite the method
+	 * #createDeActivateButtonBindings(Button) to implement a different behavior.
+	 */
+	protected Button createDeActivateButton(Composite parent, int style) {
+		Button btnActivate = createButton(parent, SWT.NONE, "De-Activate", e -> {
+			BusyIndicator.showWhile(getDisplay(), () -> {
+				doDeActivate(getSelectedItemObjects());
+				refreshViewer();
+			});
+		});
+		createDeActivateButtonBindings(btnActivate);
+		return btnActivate;
+	}
+
+	protected void doDeActivate(List<ShaderBasedMeshTool> list) 
+	{
+		for(ShaderBasedMeshTool tool : list)
+		{
+			ApogyCommonTransactionFacade.INSTANCE.basicSet(tool, ApogySurfaceEnvironmentPackage.Literals.SHADER_BASED_MESH_TOOL__ENABLED, false, true);
+		}
+	}
+	
+	protected void createDeActivateButtonBindings(Button button) 
+	{
+		ApogyCommonEMFUIFacade.INSTANCE.createViewerSelectionControlEnabledBinding(getDataBindingContext(), getViewer(),
+				button, o -> 
+				{
+					if(o instanceof ShaderBasedMeshTool)
+					{
+						ShaderBasedMeshTool tool = (ShaderBasedMeshTool) o;
+						return tool.isEnabled();
+					}
+					return false;
+				});
+	}
+
 }
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src/org/eclipse/apogy/core/environment/surface/ui/wizards/ShaderBasedProjectedImageMeshToolImageURLWizardPage.java b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src/org/eclipse/apogy/core/environment/surface/ui/wizards/ShaderBasedProjectedImageMeshToolImageURLWizardPage.java
new file mode 100644
index 0000000..873804c
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/src/org/eclipse/apogy/core/environment/surface/ui/wizards/ShaderBasedProjectedImageMeshToolImageURLWizardPage.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2020 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Pierre Allard - initial API and implementation
+ *
+ * SPDX-License-Identifier: EPL-1.0
+ *     
+ *******************************************************************************/
+package org.eclipse.apogy.core.environment.surface.ui.wizards;
+
+import org.eclipse.apogy.common.emf.ApogyCommonTransactionFacade;
+import org.eclipse.apogy.common.images.ApogyCommonImagesFactory;
+import org.eclipse.apogy.common.images.URLEImage;
+import org.eclipse.apogy.common.ui.composites.URLSelectionComposite;
+import org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage;
+import org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+
+public class ShaderBasedProjectedImageMeshToolImageURLWizardPage extends WizardPage 
+{
+	private final static String WIZARD_PAGE_ID = "org.eclipse.apogy.core.environment.surface.ui.wizards.ShaderBasedProjectedImageMeshToolImageURLWizardPage";
+
+	private final ShaderBasedProjectedImageMeshTool tool;
+	private URLSelectionComposite urlSelectionComposite;
+	private String urlString = null;
+
+	public ShaderBasedProjectedImageMeshToolImageURLWizardPage(ShaderBasedProjectedImageMeshTool shaderBasedProjectedImageMeshTool) {
+		super(WIZARD_PAGE_ID);
+		this.tool = shaderBasedProjectedImageMeshTool;
+
+		if (shaderBasedProjectedImageMeshTool != null) 
+		{
+			if(shaderBasedProjectedImageMeshTool.getImage() instanceof URLEImage)
+			{
+				URLEImage urleImage = (URLEImage) shaderBasedProjectedImageMeshTool.getImage();
+				this.urlString = urleImage.getUrl();
+			}
+		}
+
+		setTitle("Shader Based Projected Image Mesh Tool : Image URL selection");
+		setDescription("Sets the Image URL.");
+
+		validate();
+	}
+
+	@Override
+	public void createControl(Composite parent) 
+	{
+		Composite container = new Composite(parent, SWT.None);
+		container.setLayout(new GridLayout(1, false));
+
+		this.urlSelectionComposite = new URLSelectionComposite(container, SWT.None, new String[] { "*.png", "*.gif", "*.jpg", "*.jpeg"}, true,
+				true, true) 
+		{
+			@Override
+			protected void urlStringSelected(String newURLString) 
+			{
+				ShaderBasedProjectedImageMeshToolImageURLWizardPage.this.urlString = newURLString;
+				validate();
+				
+				URLEImage urleImage = ApogyCommonImagesFactory.eINSTANCE.createURLEImage();
+				urleImage.setUrl(newURLString);
+				
+				ApogyCommonTransactionFacade.INSTANCE.basicSet(
+						ShaderBasedProjectedImageMeshToolImageURLWizardPage.this.tool,
+						ApogySurfaceEnvironmentPackage.Literals.IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE, urleImage, true);
+			}
+		};
+		this.urlSelectionComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+
+		if (this.tool != null && this.tool.getImage() instanceof URLEImage) 
+		{
+			URLEImage urleImage = (URLEImage) tool.getImage();
+			this.urlSelectionComposite.setUrlString(urleImage.getUrl());
+		}
+
+		setControl(container);
+		this.urlSelectionComposite.setFocus();
+	}
+
+	protected void validate() {
+		boolean urlValid = (this.urlString != null) && (this.urlString.length() > 0);
+		setPageComplete(urlValid);
+
+		if (urlValid) {
+			setErrorMessage(null);
+		} else {
+			setErrorMessage("Invalid URL specified !");
+		}
+	}
+}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/viewModels/ShaderBasedProjectedImageMeshTool.view b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/viewModels/ShaderBasedProjectedImageMeshTool.view
new file mode 100644
index 0000000..665904d
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/viewModels/ShaderBasedProjectedImageMeshTool.view
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<org.eclipse.emf.ecp.view.model:View xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:org.eclipse.emf.ecp.view.group.model="http://org/eclipse/emf/ecp/view/group/model" xmlns:org.eclipse.emf.ecp.view.model="http://org/eclipse/emf/ecp/view/model/1180" xmi:id="_qWqpEAHaEeuADKolW_MMqQ" name="ShaderBasedProjectedImageMeshTool">
+  <rootEClass href="org.eclipse.apogy.core.environment.surface#//ShaderBasedProjectedImageMeshTool"/>
+  <children xsi:type="org.eclipse.emf.ecp.view.group.model:Group" xmi:id="_sdnHcAHaEeuADKolW_MMqQ" name="Overview" groupType="Collapsible">
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="_qW3dYAHaEeuADKolW_MMqQ" name="Control name">
+      <domainModelReference xmi:id="_qW3dYQHaEeuADKolW_MMqQ">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="_qW3dYgHaEeuADKolW_MMqQ" domainModelFeature="name"/>
+      </domainModelReference>
+    </children>
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="_qW3dYwHaEeuADKolW_MMqQ" name="Control description">
+      <domainModelReference xmi:id="_qW3dZAHaEeuADKolW_MMqQ">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="_qW3dZQHaEeuADKolW_MMqQ" domainModelFeature="description"/>
+      </domainModelReference>
+    </children>
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="_qW3daQHaEeuADKolW_MMqQ" name="Control enabled">
+      <domainModelReference xmi:id="_qW3dagHaEeuADKolW_MMqQ">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="_qW3dawHaEeuADKolW_MMqQ" domainModelFeature="enabled"/>
+      </domainModelReference>
+    </children>
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="_qW3dbAHaEeuADKolW_MMqQ" name="Control alpha">
+      <domainModelReference xmi:id="_qW3dbQHaEeuADKolW_MMqQ">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="_qW3dbgHaEeuADKolW_MMqQ" domainModelFeature="alpha"/>
+      </domainModelReference>
+    </children>
+  </children>
+  <children xsi:type="org.eclipse.emf.ecp.view.group.model:Group" xmi:id="_wfu5EAHaEeuADKolW_MMqQ" name="Dimensions" groupType="Collapsible">
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="_qW3dgQHaEeuADKolW_MMqQ" name="Control xDimension">
+      <domainModelReference xmi:id="_qW3dggHaEeuADKolW_MMqQ">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="_qW3dgwHaEeuADKolW_MMqQ" domainModelFeature="xDimension"/>
+      </domainModelReference>
+    </children>
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="_qW3dhAHaEeuADKolW_MMqQ" name="Control yDimension">
+      <domainModelReference xmi:id="_qW3dhQHaEeuADKolW_MMqQ">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="_qW3dhgHaEeuADKolW_MMqQ" domainModelFeature="yDimension"/>
+      </domainModelReference>
+    </children>
+  </children>
+  <children xsi:type="org.eclipse.emf.ecp.view.group.model:Group" xmi:id="_3fVIcAHaEeuADKolW_MMqQ" name="Image" groupType="Collapsible">
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="_KQQqEAKaEeu8VZ_wPV3avQ" name="Control transparentColor">
+      <domainModelReference xmi:id="_KQQqEQKaEeu8VZ_wPV3avQ">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="_KQQqEgKaEeu8VZ_wPV3avQ" domainModelFeature="transparentColor"/>
+      </domainModelReference>
+    </children>
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="_qW3dfgHaEeuADKolW_MMqQ" name="Control image">
+      <domainModelReference xmi:id="_qW3dfwHaEeuADKolW_MMqQ">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="_qW3dgAHaEeuADKolW_MMqQ" domainModelFeature="image"/>
+      </domainModelReference>
+    </children>
+  </children>
+  <children xsi:type="org.eclipse.emf.ecp.view.group.model:Group" xmi:id="_1ycv4AHaEeuADKolW_MMqQ" name="Pose" groupType="Collapsible">
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="_qW3deAHaEeuADKolW_MMqQ" name="Control position">
+      <domainModelReference xmi:id="_qW3deQHaEeuADKolW_MMqQ">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="_qW3degHaEeuADKolW_MMqQ" domainModelFeature="position"/>
+      </domainModelReference>
+    </children>
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="_qW3dewHaEeuADKolW_MMqQ" name="Control rotationMatrix">
+      <domainModelReference xmi:id="_qW3dfAHaEeuADKolW_MMqQ">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="_qW3dfQHaEeuADKolW_MMqQ" domainModelFeature="rotationMatrix"/>
+      </domainModelReference>
+    </children>
+  </children>
+</org.eclipse.emf.ecp.view.model:View>
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface.ui/viewModels/VariableShaderBasedProjectedImageMeshTool.view b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/viewModels/VariableShaderBasedProjectedImageMeshTool.view
new file mode 100644
index 0000000..4b53559
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface.ui/viewModels/VariableShaderBasedProjectedImageMeshTool.view
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<org.eclipse.emf.ecp.view.model:View xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:org.eclipse.emf.ecp.view.group.model="http://org/eclipse/emf/ecp/view/group/model" xmlns:org.eclipse.emf.ecp.view.model="http://org/eclipse/emf/ecp/view/model/1180" xmi:id="__y9dAAJSEeuQgrUo19Ibgw" name="VariableShaderBasedProjectedImageMeshTool">
+  <rootEClass href="org.eclipse.apogy.core.environment.surface#//VariableShaderBasedProjectedImageMeshTool"/>
+  <children xsi:type="org.eclipse.emf.ecp.view.group.model:Group" xmi:id="_CReG0AJTEeuQgrUo19Ibgw" name="Overview" groupType="Collapsible">
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="__zIcIAJSEeuQgrUo19Ibgw" name="Control name">
+      <domainModelReference xmi:id="__zIcIQJSEeuQgrUo19Ibgw">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="__zIcIgJSEeuQgrUo19Ibgw" domainModelFeature="name"/>
+      </domainModelReference>
+    </children>
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="__zIcIwJSEeuQgrUo19Ibgw" name="Control description">
+      <domainModelReference xmi:id="__zIcJAJSEeuQgrUo19Ibgw">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="__zIcJQJSEeuQgrUo19Ibgw" domainModelFeature="description"/>
+      </domainModelReference>
+    </children>
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="__zJDMAJSEeuQgrUo19Ibgw" name="Control enabled">
+      <domainModelReference xmi:id="__zJDMQJSEeuQgrUo19Ibgw">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="__zJDMgJSEeuQgrUo19Ibgw" domainModelFeature="enabled"/>
+      </domainModelReference>
+    </children>
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="__zJDMwJSEeuQgrUo19Ibgw" name="Control alpha">
+      <domainModelReference xmi:id="__zJDNAJSEeuQgrUo19Ibgw">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="__zJDNQJSEeuQgrUo19Ibgw" domainModelFeature="alpha"/>
+      </domainModelReference>
+    </children>
+  </children>
+  <children xsi:type="org.eclipse.emf.ecp.view.group.model:Group" xmi:id="_Cv02wAJTEeuQgrUo19Ibgw" name="Dimensions" groupType="Collapsible">
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="__zJDSAJSEeuQgrUo19Ibgw" name="Control xDimension">
+      <domainModelReference xmi:id="__zJDSQJSEeuQgrUo19Ibgw">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="__zJDSgJSEeuQgrUo19Ibgw" domainModelFeature="xDimension"/>
+      </domainModelReference>
+    </children>
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="__zJDSwJSEeuQgrUo19Ibgw" name="Control yDimension">
+      <domainModelReference xmi:id="__zJDTAJSEeuQgrUo19Ibgw">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="__zJDTQJSEeuQgrUo19Ibgw" domainModelFeature="yDimension"/>
+      </domainModelReference>
+    </children>
+  </children>
+  <children xsi:type="org.eclipse.emf.ecp.view.group.model:Group" xmi:id="_IGNFkAJTEeuQgrUo19Ibgw" name="Image" groupType="Collapsible">
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="_NdnW4AKaEeu8VZ_wPV3avQ" name="Control transparentColor">
+      <domainModelReference xmi:id="_NdnW4QKaEeu8VZ_wPV3avQ">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="_NdnW4gKaEeu8VZ_wPV3avQ" domainModelFeature="transparentColor"/>
+      </domainModelReference>
+    </children>
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="__zJDRQJSEeuQgrUo19Ibgw" name="Control image">
+      <domainModelReference xmi:id="__zJDRgJSEeuQgrUo19Ibgw">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="__zJDRwJSEeuQgrUo19Ibgw" domainModelFeature="image"/>
+      </domainModelReference>
+    </children>
+  </children>
+  <children xsi:type="org.eclipse.emf.ecp.view.group.model:Group" xmi:id="_OSVQoAJTEeuQgrUo19Ibgw" name="Pose" groupType="Collapsible">
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="__zJDPwJSEeuQgrUo19Ibgw" name="Control position">
+      <domainModelReference xmi:id="__zJDQAJSEeuQgrUo19Ibgw">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="__zJDQQJSEeuQgrUo19Ibgw" domainModelFeature="position"/>
+      </domainModelReference>
+    </children>
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="_YYIKYAKfEeus9-VPvRfoIw" name="Control updatePosition">
+      <domainModelReference xmi:id="_YYIKYQKfEeus9-VPvRfoIw">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="_YYIKYgKfEeus9-VPvRfoIw" domainModelFeature="updatePosition"/>
+      </domainModelReference>
+    </children>
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="__zJDQgJSEeuQgrUo19Ibgw" name="Control rotationMatrix">
+      <domainModelReference xmi:id="__zJDQwJSEeuQgrUo19Ibgw">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="__zJDRAJSEeuQgrUo19Ibgw" domainModelFeature="rotationMatrix"/>
+      </domainModelReference>
+    </children>
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="_YYL0wAKfEeus9-VPvRfoIw" name="Control updateOrientation">
+      <domainModelReference xmi:id="_YYL0wQKfEeus9-VPvRfoIw">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="_YYL0wgKfEeus9-VPvRfoIw" domainModelFeature="updateOrientation"/>
+      </domainModelReference>
+    </children>
+  </children>
+  <children xsi:type="org.eclipse.emf.ecp.view.group.model:Group" xmi:id="_TDf5kAJTEeuQgrUo19Ibgw" name="Pose Offsets" groupType="Collapsible">
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="__zJDUQJSEeuQgrUo19Ibgw" name="Control relativePosition">
+      <domainModelReference xmi:id="__zJDUgJSEeuQgrUo19Ibgw">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="__zJDUwJSEeuQgrUo19Ibgw" domainModelFeature="relativePosition"/>
+      </domainModelReference>
+    </children>
+    <children xsi:type="org.eclipse.emf.ecp.view.model:Control" xmi:id="__zJDVAJSEeuQgrUo19Ibgw" name="Control relativeRotationMatrix">
+      <domainModelReference xmi:id="__zJDVQJSEeuQgrUo19Ibgw">
+        <segments xsi:type="org.eclipse.emf.ecp.view.model:FeatureDomainModelReferenceSegment" xmi:id="__zJDVgJSEeuQgrUo19Ibgw" domainModelFeature="relativeRotationMatrix"/>
+      </domainModelReference>
+    </children>
+  </children>
+</org.eclipse.emf.ecp.view.model:View>
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/model/apogy_core_environment_surface.xcore b/bundles/core/org.eclipse.apogy.core.environment.surface/model/apogy_core_environment_surface.xcore
index 894824e..86efb80 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/model/apogy_core_environment_surface.xcore
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/model/apogy_core_environment_surface.xcore
@@ -39,15 +39,15 @@
 
 import org.eclipse.apogy.common.Apogy
 import org.eclipse.apogy.common.emf.Disposable
-import org.eclipse.apogy.common.emf.Startable
-import org.eclipse.apogy.common.emf.NamedDescribedElement
 import org.eclipse.apogy.common.emf.Exception
+import org.eclipse.apogy.common.emf.NamedDescribedElement
+import org.eclipse.apogy.common.emf.Startable
 import org.eclipse.apogy.common.emf.ui.RGBA
 import org.eclipse.apogy.common.geometry.data3d.CartesianTriangularMesh
 import org.eclipse.apogy.common.images.AbstractEImage
+import org.eclipse.apogy.common.math.Matrix3x3
 import org.eclipse.apogy.common.math.Matrix4x4
 import org.eclipse.apogy.common.math.Tuple3d
-import org.eclipse.apogy.common.math.Matrix3x3
 import org.eclipse.apogy.common.topology.AggregateGroupNode
 import org.eclipse.apogy.common.topology.Node
 import org.eclipse.apogy.common.topology.TransformNode
@@ -497,10 +497,22 @@
 	DISCRETE_SLOPES as "Discrete Slopes" = 1,
 	GRID as "Grid" = 2,
 	BULLSEYE as "Bullseye" = 3,
-	ANGULAR as "Angular" = 4
+	ANGULAR as "Angular" = 4,
+	IMAGE as "Image" = 5
 }
 
 /**
+ *  Shader based tool that uses an image to its rendering.  
+ */
+abstract class ImageBasedShaderBasedMeshTool extends ShaderBasedMeshTool
+{
+	/**
+	 * The image.  
+	 *
+	 */
+	contains AbstractEImage image
+}
+/**
  * Abstract class representing a ShaderBasedMeshTool that is attached to a Variable with position and orientation offsets.  
  */
 @Apogy(hasCustomClass="true")
@@ -509,12 +521,16 @@
 	@GenModel(children="true", property="Editable")
 	contains VariableFeatureReference variableFeatureReference	
 	
+	boolean updatePosition = "true"
+	
 	/**
 	 * The position of the tool relative to the Variable.
 	 */
  	@GenModel(children="false", createChild="false")
 	contains Tuple3d relativePosition
 	
+	boolean updateOrientation = "true"
+	
 	/**
 	 * The orientation of the tool relative to the Variable
 	 */
@@ -636,7 +652,7 @@
 }
 
 /**
- * Specialisation of ShaderBasedBullseyeTool which centre coordinates are updates to reflect the location
+ * Specialisation of ShaderBasedBullseyeTool which centre coordinates are updated to reflect the location
  * of a Variable on that mesh.
  */
 @Apogy(hasCustomClass="true", hasCustomItemProvider="true")
@@ -694,13 +710,48 @@
 }
 
 /**
- * Shader based tool that displays angles as radial lines. 
+ * Shader based tool that displays angles as radial lines which centre coordinates are updated to reflect the location
+ * of a Variable on that mesh.
  */
 @Apogy(hasCustomClass="true", hasCustomItemProvider="true")
 class VariableAngularDisplayMeshTool extends ShaderBasedAngularDisplayMeshTool, VariableBasedShaderBasedMeshTool
 {
 }
 
+/**
+ * Shader based tool that displays an image on top of the mesh. 
+ */
+@Apogy(hasCustomClass="true", hasCustomItemProvider="true")
+class ShaderBasedProjectedImageMeshTool extends ImageBasedShaderBasedMeshTool
+{
+	/**
+	 * Size of the projected image along the X axis  
+	 */
+	@Apogy(units="m")
+	float xDimension = "1.0"
+	
+	/**
+	 * Size of the projected image along the Y axis  
+	 */
+	@Apogy(units="m")
+	float yDimension = "1.0"
+	
+	/*
+	 * The color that is interpreted as transparent.
+	 */
+	@GenModel(property="Editable")
+	RGBA transparentColor = "255,255,255,255"
+}
+
+/**
+ * Shader based tool that displays an image on top of the mesh which centre coordinates are updated to reflect the location
+ * of a Variable on that mesh. 
+ */
+@Apogy(hasCustomClass="true", hasCustomItemProvider="true")
+class VariableShaderBasedProjectedImageMeshTool extends ShaderBasedProjectedImageMeshTool, VariableBasedShaderBasedMeshTool
+{	
+}
+
 /*
  * Abstract class defining an ImageMapLayer for which the image is derived from a Mesh.
  */
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen-custom/org/eclipse/apogy/core/environment/surface/impl/ShaderBasedMeshToolCustomImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen-custom/org/eclipse/apogy/core/environment/surface/impl/ShaderBasedMeshToolCustomImpl.java
index 1d539f2..28e102b 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen-custom/org/eclipse/apogy/core/environment/surface/impl/ShaderBasedMeshToolCustomImpl.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen-custom/org/eclipse/apogy/core/environment/surface/impl/ShaderBasedMeshToolCustomImpl.java
@@ -72,47 +72,7 @@
 		
 		// Tool alpha
 		parameters[TOOL_ALPHA_INDEX] = getAlpha();
-								
-		
-		// Position and orientation matrix
-		/*
-		Matrix4d matrix = new Matrix4d();
-		matrix.setIdentity();
-
-		if (getRotationMatrix() != null) 
-		{
-			matrix.setRotation(getRotationMatrix().asMatrix3d());
-		}
-
-		if (getPosition() != null) 
-		{
-			matrix.setTranslation(new Vector3d(getPosition().asTuple3d()));
-		}
-		
-		// Invert the matrix, so the shader does not have to.
-		matrix.invert();
-		
-		parameters[TOOL_MATRIX_0_0_INDEX] = new Float(matrix.m00);
-		parameters[TOOL_MATRIX_0_1_INDEX] = new Float(matrix.m01);
-		parameters[TOOL_MATRIX_0_2_INDEX] = new Float(matrix.m02);
-		parameters[TOOL_MATRIX_0_3_INDEX] = new Float(matrix.m03);
-		
-		parameters[TOOL_MATRIX_1_0_INDEX] = new Float(matrix.m10);
-		parameters[TOOL_MATRIX_1_1_INDEX] = new Float(matrix.m11);
-		parameters[TOOL_MATRIX_1_2_INDEX] = new Float(matrix.m12);
-		parameters[TOOL_MATRIX_1_3_INDEX] = new Float(matrix.m13);
-		
-		parameters[TOOL_MATRIX_2_0_INDEX] = new Float(matrix.m20);
-		parameters[TOOL_MATRIX_2_1_INDEX] = new Float(matrix.m21);
-		parameters[TOOL_MATRIX_2_2_INDEX] = new Float(matrix.m22);
-		parameters[TOOL_MATRIX_2_3_INDEX] = new Float(matrix.m23);
-		
-		parameters[TOOL_MATRIX_3_0_INDEX] = new Float(matrix.m30);
-		parameters[TOOL_MATRIX_3_1_INDEX] = new Float(matrix.m31);
-		parameters[TOOL_MATRIX_3_2_INDEX] = new Float(matrix.m32);
-		parameters[TOOL_MATRIX_3_3_INDEX] = new Float(matrix.m33);
-		*/
-		
+													
 		return parameters;
 	}	
 	
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen-custom/org/eclipse/apogy/core/environment/surface/impl/ShaderBasedProjectedImageMeshToolCustomImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen-custom/org/eclipse/apogy/core/environment/surface/impl/ShaderBasedProjectedImageMeshToolCustomImpl.java
new file mode 100644
index 0000000..31aa360
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen-custom/org/eclipse/apogy/core/environment/surface/impl/ShaderBasedProjectedImageMeshToolCustomImpl.java
@@ -0,0 +1,53 @@
+package org.eclipse.apogy.core.environment.surface.impl;
+
+import org.eclipse.apogy.core.environment.surface.ShaderBasedMeshToolType;
+
+public class ShaderBasedProjectedImageMeshToolCustomImpl extends ShaderBasedProjectedImageMeshToolImpl 
+{
+	public static final int TOOL_IMAGE_X_DIMENSION_INDEX    	= TOOL_PARAM0_INDEX ;						// Param 0
+	public static final int TOOL_IMAGE_Y_DIMENSION_INDEX    	= TOOL_IMAGE_X_DIMENSION_INDEX + 1 ;		// Param 1
+	
+	public static final int TOOL_TRANSPARENT_COLOR_RED_INDEX    = TOOL_IMAGE_Y_DIMENSION_INDEX + 1 ;		// Param 2
+	public static final int TOOL_TRANSPARENT_COLOR_GREEN_INDEX  = TOOL_TRANSPARENT_COLOR_RED_INDEX + 1 ;	// Param 3
+	public static final int TOOL_TRANSPARENT_COLOR_BLUE_INDEX   = TOOL_TRANSPARENT_COLOR_GREEN_INDEX + 1 ;	// Param 4
+	
+	
+	@Override
+	public ShaderBasedMeshToolType getToolType() 
+	{
+		return ShaderBasedMeshToolType.IMAGE;
+	}
+	
+	@Override
+	public void setXDimension(float newXDimension) 
+	{
+		if(newXDimension != 0.0f)
+		{
+			super.setXDimension(Math.abs(newXDimension));
+		}
+	}
+	
+	@Override
+	public void setYDimension(float newYDimension) 
+	{
+		if(newYDimension != 0.0f)
+		{
+			super.setYDimension(Math.abs(newYDimension));
+		}
+	}
+	
+	@Override
+	public float[] createShaderParameters() 
+	{	
+		float[] parameters = super.createShaderParameters();
+		
+		parameters[TOOL_IMAGE_X_DIMENSION_INDEX] = getXDimension();
+		parameters[TOOL_IMAGE_Y_DIMENSION_INDEX] = getYDimension();
+		
+		parameters[TOOL_TRANSPARENT_COLOR_RED_INDEX] = new Float((float) getTransparentColor().rgb.red  / 255.0f);
+		parameters[TOOL_TRANSPARENT_COLOR_GREEN_INDEX] =  new Float((float) getTransparentColor().rgb.green  / 255.0f);
+		parameters[TOOL_TRANSPARENT_COLOR_BLUE_INDEX] =  new Float((float) getTransparentColor().rgb.blue  / 255.0f);
+						
+		return parameters;
+	}
+}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen-custom/org/eclipse/apogy/core/environment/surface/impl/VariableBasedShaderBasedMeshToolPoseAdapterCustomImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen-custom/org/eclipse/apogy/core/environment/surface/impl/VariableBasedShaderBasedMeshToolPoseAdapterCustomImpl.java
index 25b94a3..7c0c950 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen-custom/org/eclipse/apogy/core/environment/surface/impl/VariableBasedShaderBasedMeshToolPoseAdapterCustomImpl.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen-custom/org/eclipse/apogy/core/environment/surface/impl/VariableBasedShaderBasedMeshToolPoseAdapterCustomImpl.java
@@ -158,8 +158,8 @@
 						@Override
 						public void run() 
 						{
-							ApogyCommonTransactionFacade.INSTANCE.basicSet(getVariableBasedShaderBasedMeshTool(), ApogySurfaceEnvironmentPackage.Literals.SHADER_BASED_MESH_TOOL__POSITION, position, true);
-							ApogyCommonTransactionFacade.INSTANCE.basicSet(getVariableBasedShaderBasedMeshTool(), ApogySurfaceEnvironmentPackage.Literals.SHADER_BASED_MESH_TOOL__ROTATION_MATRIX, rotation, true);
+							if(getVariableBasedShaderBasedMeshTool().isUpdatePosition()) ApogyCommonTransactionFacade.INSTANCE.basicSet(getVariableBasedShaderBasedMeshTool(), ApogySurfaceEnvironmentPackage.Literals.SHADER_BASED_MESH_TOOL__POSITION, position, true);
+							if(getVariableBasedShaderBasedMeshTool().isUpdateOrientation()) ApogyCommonTransactionFacade.INSTANCE.basicSet(getVariableBasedShaderBasedMeshTool(), ApogySurfaceEnvironmentPackage.Literals.SHADER_BASED_MESH_TOOL__ROTATION_MATRIX, rotation, true);
 						}
 					});
 				}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen-custom/org/eclipse/apogy/core/environment/surface/impl/VariableShaderBasedProjectedImageMeshToolCustomImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen-custom/org/eclipse/apogy/core/environment/surface/impl/VariableShaderBasedProjectedImageMeshToolCustomImpl.java
new file mode 100644
index 0000000..132e2c4
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen-custom/org/eclipse/apogy/core/environment/surface/impl/VariableShaderBasedProjectedImageMeshToolCustomImpl.java
@@ -0,0 +1,82 @@
+package org.eclipse.apogy.core.environment.surface.impl;
+
+import javax.vecmath.Matrix4d;
+import javax.vecmath.Vector3d;
+
+import org.eclipse.apogy.common.math.ApogyCommonMathFacade;
+import org.eclipse.apogy.common.math.Matrix4x4;
+import org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentFactory;
+import org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshToolPoseAdapter;
+
+public class VariableShaderBasedProjectedImageMeshToolCustomImpl extends VariableShaderBasedProjectedImageMeshToolImpl 
+{
+	protected VariableBasedShaderBasedMeshToolPoseAdapter poseAdapter = null;
+	
+	@Override
+	public void start() 
+	{
+		if(!isStarted())
+		{
+			super.start();
+			
+			getPoseDapter().setVariableBasedShaderBasedMeshTool(this);
+		}
+	}
+	
+	@Override
+	public Matrix4x4 createToolMatrix() 
+	{
+		// Position and orientation matrix
+		Matrix4d matrix = new Matrix4d();
+		matrix.setIdentity();
+
+		if (getRotationMatrix() != null) 
+		{
+			matrix.setRotation(getRotationMatrix().asMatrix3d());
+		}
+
+		if (getPosition() != null) 
+		{
+			matrix.setTranslation(new Vector3d(getPosition().asTuple3d()));
+		}
+	
+		Matrix4d offsetSMatrix = new Matrix4d();
+		offsetSMatrix.setIdentity();
+		
+		if(getRelativeRotationMatrix() != null)
+		{
+			offsetSMatrix.setRotation(getRelativeRotationMatrix().asMatrix3d());
+		}
+		
+		if(getRelativePosition() != null)
+		{
+			offsetSMatrix.setTranslation(new Vector3d(getRelativePosition().asTuple3d()));
+		}
+		
+		// Adds the offsets.
+		matrix.mul(offsetSMatrix);
+				
+		// Invert the matrix, so the shader does not have to.
+		matrix.invert();
+		
+		return ApogyCommonMathFacade.INSTANCE.createMatrix4x4(matrix);		
+	}
+	
+	@Override
+	public void dispose() 
+	{
+		if(poseAdapter != null) poseAdapter.dispose();
+		
+		super.dispose();
+	}
+	
+	protected VariableBasedShaderBasedMeshToolPoseAdapter getPoseDapter()
+	{
+		if(poseAdapter == null)
+		{
+			poseAdapter = ApogySurfaceEnvironmentFactory.eINSTANCE.createVariableBasedShaderBasedMeshToolPoseAdapter();			
+		}
+		
+		return poseAdapter;
+	}	
+}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ApogySurfaceEnvironmentFactory.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ApogySurfaceEnvironmentFactory.java
index 44d4012..fe2da0d 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ApogySurfaceEnvironmentFactory.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ApogySurfaceEnvironmentFactory.java
@@ -187,6 +187,24 @@
 	VariableAngularDisplayMeshTool createVariableAngularDisplayMeshTool();
 
 	/**
+	 * Returns a new object of class '<em>Shader Based Projected Image Mesh Tool</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Shader Based Projected Image Mesh Tool</em>'.
+	 * @generated
+	 */
+	ShaderBasedProjectedImageMeshTool createShaderBasedProjectedImageMeshTool();
+
+	/**
+	 * Returns a new object of class '<em>Variable Shader Based Projected Image Mesh Tool</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Variable Shader Based Projected Image Mesh Tool</em>'.
+	 * @generated
+	 */
+	VariableShaderBasedProjectedImageMeshTool createVariableShaderBasedProjectedImageMeshTool();
+
+	/**
 	 * Returns a new object of class '<em>Cartesian Triangular Mesh Slope Image Map Layer</em>'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ApogySurfaceEnvironmentPackage.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ApogySurfaceEnvironmentPackage.java
index 7655728..c87af6e 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ApogySurfaceEnvironmentPackage.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ApogySurfaceEnvironmentPackage.java
@@ -1879,6 +1879,169 @@
 	int SHADER_BASED_MESH_TOOL_OPERATION_COUNT = ApogyCommonEMFPackage.NAMED_DESCRIBED_ELEMENT_OPERATION_COUNT + 4;
 
 	/**
+	 * The meta object id for the '{@link org.eclipse.apogy.core.environment.surface.impl.ImageBasedShaderBasedMeshToolImpl <em>Image Based Shader Based Mesh Tool</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.apogy.core.environment.surface.impl.ImageBasedShaderBasedMeshToolImpl
+	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getImageBasedShaderBasedMeshTool()
+	 * @generated
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL = 18;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL__NAME = SHADER_BASED_MESH_TOOL__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL__DESCRIPTION = SHADER_BASED_MESH_TOOL__DESCRIPTION;
+
+	/**
+	 * The feature id for the '<em><b>Started</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL__STARTED = SHADER_BASED_MESH_TOOL__STARTED;
+
+	/**
+	 * The feature id for the '<em><b>Enabled</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL__ENABLED = SHADER_BASED_MESH_TOOL__ENABLED;
+
+	/**
+	 * The feature id for the '<em><b>Alpha</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL__ALPHA = SHADER_BASED_MESH_TOOL__ALPHA;
+
+	/**
+	 * The feature id for the '<em><b>Shader Parameter Array Size</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL__SHADER_PARAMETER_ARRAY_SIZE = SHADER_BASED_MESH_TOOL__SHADER_PARAMETER_ARRAY_SIZE;
+
+	/**
+	 * The feature id for the '<em><b>Tool Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL__TOOL_TYPE = SHADER_BASED_MESH_TOOL__TOOL_TYPE;
+
+	/**
+	 * The feature id for the '<em><b>Mesh Map Layer</b></em>' container reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL__MESH_MAP_LAYER = SHADER_BASED_MESH_TOOL__MESH_MAP_LAYER;
+
+	/**
+	 * The feature id for the '<em><b>Position</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL__POSITION = SHADER_BASED_MESH_TOOL__POSITION;
+
+	/**
+	 * The feature id for the '<em><b>Rotation Matrix</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL__ROTATION_MATRIX = SHADER_BASED_MESH_TOOL__ROTATION_MATRIX;
+
+	/**
+	 * The feature id for the '<em><b>Image</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE = SHADER_BASED_MESH_TOOL_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Image Based Shader Based Mesh Tool</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL_FEATURE_COUNT = SHADER_BASED_MESH_TOOL_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>Dispose</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL___DISPOSE = SHADER_BASED_MESH_TOOL___DISPOSE;
+
+	/**
+	 * The operation id for the '<em>Start</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL___START = SHADER_BASED_MESH_TOOL___START;
+
+	/**
+	 * The operation id for the '<em>Create Shader Parameters</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL___CREATE_SHADER_PARAMETERS = SHADER_BASED_MESH_TOOL___CREATE_SHADER_PARAMETERS;
+
+	/**
+	 * The operation id for the '<em>Create Tool Matrix</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL___CREATE_TOOL_MATRIX = SHADER_BASED_MESH_TOOL___CREATE_TOOL_MATRIX;
+
+	/**
+	 * The number of operations of the '<em>Image Based Shader Based Mesh Tool</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int IMAGE_BASED_SHADER_BASED_MESH_TOOL_OPERATION_COUNT = SHADER_BASED_MESH_TOOL_OPERATION_COUNT + 0;
+
+	/**
 	 * The meta object id for the '{@link org.eclipse.apogy.core.environment.surface.impl.VariableBasedShaderBasedMeshToolImpl <em>Variable Based Shader Based Mesh Tool</em>}' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1886,7 +2049,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getVariableBasedShaderBasedMeshTool()
 	 * @generated
 	 */
-	int VARIABLE_BASED_SHADER_BASED_MESH_TOOL = 18;
+	int VARIABLE_BASED_SHADER_BASED_MESH_TOOL = 19;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -1988,13 +2151,31 @@
 	int VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE = SHADER_BASED_MESH_TOOL_FEATURE_COUNT + 0;
 
 	/**
+	 * The feature id for the '<em><b>Update Position</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION = SHADER_BASED_MESH_TOOL_FEATURE_COUNT + 1;
+
+	/**
 	 * The feature id for the '<em><b>Relative Position</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION = SHADER_BASED_MESH_TOOL_FEATURE_COUNT + 1;
+	int VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION = SHADER_BASED_MESH_TOOL_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Update Orientation</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION = SHADER_BASED_MESH_TOOL_FEATURE_COUNT + 3;
 
 	/**
 	 * The feature id for the '<em><b>Relative Rotation Matrix</b></em>' containment reference.
@@ -2003,7 +2184,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX = SHADER_BASED_MESH_TOOL_FEATURE_COUNT + 2;
+	int VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX = SHADER_BASED_MESH_TOOL_FEATURE_COUNT + 4;
 
 	/**
 	 * The number of structural features of the '<em>Variable Based Shader Based Mesh Tool</em>' class.
@@ -2012,7 +2193,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int VARIABLE_BASED_SHADER_BASED_MESH_TOOL_FEATURE_COUNT = SHADER_BASED_MESH_TOOL_FEATURE_COUNT + 3;
+	int VARIABLE_BASED_SHADER_BASED_MESH_TOOL_FEATURE_COUNT = SHADER_BASED_MESH_TOOL_FEATURE_COUNT + 5;
 
 	/**
 	 * The operation id for the '<em>Dispose</em>' operation.
@@ -2067,7 +2248,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getVariableBasedShaderBasedMeshToolPoseAdapter()
 	 * @generated
 	 */
-	int VARIABLE_BASED_SHADER_BASED_MESH_TOOL_POSE_ADAPTER = 19;
+	int VARIABLE_BASED_SHADER_BASED_MESH_TOOL_POSE_ADAPTER = 20;
 
 	/**
 	 * The feature id for the '<em><b>Variable Based Shader Based Mesh Tool</b></em>' reference.
@@ -2113,7 +2294,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getShaderBasedGridTool()
 	 * @generated
 	 */
-	int SHADER_BASED_GRID_TOOL = 20;
+	int SHADER_BASED_GRID_TOOL = 21;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -2357,7 +2538,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getVariableShaderBasedGridTool()
 	 * @generated
 	 */
-	int VARIABLE_SHADER_BASED_GRID_TOOL = 21;
+	int VARIABLE_SHADER_BASED_GRID_TOOL = 22;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -2549,13 +2730,31 @@
 	int VARIABLE_SHADER_BASED_GRID_TOOL__VARIABLE_FEATURE_REFERENCE = SHADER_BASED_GRID_TOOL_FEATURE_COUNT + 0;
 
 	/**
+	 * The feature id for the '<em><b>Update Position</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_POSITION = SHADER_BASED_GRID_TOOL_FEATURE_COUNT + 1;
+
+	/**
 	 * The feature id for the '<em><b>Relative Position</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_POSITION = SHADER_BASED_GRID_TOOL_FEATURE_COUNT + 1;
+	int VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_POSITION = SHADER_BASED_GRID_TOOL_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Update Orientation</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_ORIENTATION = SHADER_BASED_GRID_TOOL_FEATURE_COUNT + 3;
 
 	/**
 	 * The feature id for the '<em><b>Relative Rotation Matrix</b></em>' containment reference.
@@ -2564,7 +2763,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_ROTATION_MATRIX = SHADER_BASED_GRID_TOOL_FEATURE_COUNT + 2;
+	int VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_ROTATION_MATRIX = SHADER_BASED_GRID_TOOL_FEATURE_COUNT + 4;
 
 	/**
 	 * The number of structural features of the '<em>Variable Shader Based Grid Tool</em>' class.
@@ -2573,7 +2772,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int VARIABLE_SHADER_BASED_GRID_TOOL_FEATURE_COUNT = SHADER_BASED_GRID_TOOL_FEATURE_COUNT + 3;
+	int VARIABLE_SHADER_BASED_GRID_TOOL_FEATURE_COUNT = SHADER_BASED_GRID_TOOL_FEATURE_COUNT + 5;
 
 	/**
 	 * The operation id for the '<em>Dispose</em>' operation.
@@ -2628,7 +2827,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getShaderBasedDiscreteSlopesTool()
 	 * @generated
 	 */
-	int SHADER_BASED_DISCRETE_SLOPES_TOOL = 22;
+	int SHADER_BASED_DISCRETE_SLOPES_TOOL = 23;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -2791,7 +2990,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getShaderBasedBullseyeTool()
 	 * @generated
 	 */
-	int SHADER_BASED_BULLSEYE_TOOL = 23;
+	int SHADER_BASED_BULLSEYE_TOOL = 24;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -2981,7 +3180,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getVariablePoseBullseyeTool()
 	 * @generated
 	 */
-	int VARIABLE_POSE_BULLSEYE_TOOL = 24;
+	int VARIABLE_POSE_BULLSEYE_TOOL = 25;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -3119,13 +3318,31 @@
 	int VARIABLE_POSE_BULLSEYE_TOOL__VARIABLE_FEATURE_REFERENCE = SHADER_BASED_BULLSEYE_TOOL_FEATURE_COUNT + 0;
 
 	/**
+	 * The feature id for the '<em><b>Update Position</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_POSITION = SHADER_BASED_BULLSEYE_TOOL_FEATURE_COUNT + 1;
+
+	/**
 	 * The feature id for the '<em><b>Relative Position</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_POSITION = SHADER_BASED_BULLSEYE_TOOL_FEATURE_COUNT + 1;
+	int VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_POSITION = SHADER_BASED_BULLSEYE_TOOL_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Update Orientation</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_ORIENTATION = SHADER_BASED_BULLSEYE_TOOL_FEATURE_COUNT + 3;
 
 	/**
 	 * The feature id for the '<em><b>Relative Rotation Matrix</b></em>' containment reference.
@@ -3134,7 +3351,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_ROTATION_MATRIX = SHADER_BASED_BULLSEYE_TOOL_FEATURE_COUNT + 2;
+	int VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_ROTATION_MATRIX = SHADER_BASED_BULLSEYE_TOOL_FEATURE_COUNT + 4;
 
 	/**
 	 * The number of structural features of the '<em>Variable Pose Bullseye Tool</em>' class.
@@ -3143,7 +3360,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int VARIABLE_POSE_BULLSEYE_TOOL_FEATURE_COUNT = SHADER_BASED_BULLSEYE_TOOL_FEATURE_COUNT + 3;
+	int VARIABLE_POSE_BULLSEYE_TOOL_FEATURE_COUNT = SHADER_BASED_BULLSEYE_TOOL_FEATURE_COUNT + 5;
 
 	/**
 	 * The operation id for the '<em>Dispose</em>' operation.
@@ -3198,7 +3415,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getShaderBasedAngularDisplayMeshTool()
 	 * @generated
 	 */
-	int SHADER_BASED_ANGULAR_DISPLAY_MESH_TOOL = 25;
+	int SHADER_BASED_ANGULAR_DISPLAY_MESH_TOOL = 26;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -3415,7 +3632,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getVariableAngularDisplayMeshTool()
 	 * @generated
 	 */
-	int VARIABLE_ANGULAR_DISPLAY_MESH_TOOL = 26;
+	int VARIABLE_ANGULAR_DISPLAY_MESH_TOOL = 27;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -3580,13 +3797,31 @@
 	int VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__VARIABLE_FEATURE_REFERENCE = SHADER_BASED_ANGULAR_DISPLAY_MESH_TOOL_FEATURE_COUNT + 0;
 
 	/**
+	 * The feature id for the '<em><b>Update Position</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_POSITION = SHADER_BASED_ANGULAR_DISPLAY_MESH_TOOL_FEATURE_COUNT + 1;
+
+	/**
 	 * The feature id for the '<em><b>Relative Position</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_POSITION = SHADER_BASED_ANGULAR_DISPLAY_MESH_TOOL_FEATURE_COUNT + 1;
+	int VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_POSITION = SHADER_BASED_ANGULAR_DISPLAY_MESH_TOOL_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Update Orientation</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_ORIENTATION = SHADER_BASED_ANGULAR_DISPLAY_MESH_TOOL_FEATURE_COUNT + 3;
 
 	/**
 	 * The feature id for the '<em><b>Relative Rotation Matrix</b></em>' containment reference.
@@ -3595,7 +3830,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_ROTATION_MATRIX = SHADER_BASED_ANGULAR_DISPLAY_MESH_TOOL_FEATURE_COUNT + 2;
+	int VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_ROTATION_MATRIX = SHADER_BASED_ANGULAR_DISPLAY_MESH_TOOL_FEATURE_COUNT + 4;
 
 	/**
 	 * The number of structural features of the '<em>Variable Angular Display Mesh Tool</em>' class.
@@ -3604,7 +3839,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int VARIABLE_ANGULAR_DISPLAY_MESH_TOOL_FEATURE_COUNT = SHADER_BASED_ANGULAR_DISPLAY_MESH_TOOL_FEATURE_COUNT + 3;
+	int VARIABLE_ANGULAR_DISPLAY_MESH_TOOL_FEATURE_COUNT = SHADER_BASED_ANGULAR_DISPLAY_MESH_TOOL_FEATURE_COUNT + 5;
 
 	/**
 	 * The operation id for the '<em>Dispose</em>' operation.
@@ -3652,6 +3887,431 @@
 	int VARIABLE_ANGULAR_DISPLAY_MESH_TOOL_OPERATION_COUNT = SHADER_BASED_ANGULAR_DISPLAY_MESH_TOOL_OPERATION_COUNT + 0;
 
 	/**
+	 * The meta object id for the '{@link org.eclipse.apogy.core.environment.surface.impl.ShaderBasedProjectedImageMeshToolImpl <em>Shader Based Projected Image Mesh Tool</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.apogy.core.environment.surface.impl.ShaderBasedProjectedImageMeshToolImpl
+	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getShaderBasedProjectedImageMeshTool()
+	 * @generated
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL = 28;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__NAME = IMAGE_BASED_SHADER_BASED_MESH_TOOL__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__DESCRIPTION = IMAGE_BASED_SHADER_BASED_MESH_TOOL__DESCRIPTION;
+
+	/**
+	 * The feature id for the '<em><b>Started</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__STARTED = IMAGE_BASED_SHADER_BASED_MESH_TOOL__STARTED;
+
+	/**
+	 * The feature id for the '<em><b>Enabled</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__ENABLED = IMAGE_BASED_SHADER_BASED_MESH_TOOL__ENABLED;
+
+	/**
+	 * The feature id for the '<em><b>Alpha</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__ALPHA = IMAGE_BASED_SHADER_BASED_MESH_TOOL__ALPHA;
+
+	/**
+	 * The feature id for the '<em><b>Shader Parameter Array Size</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__SHADER_PARAMETER_ARRAY_SIZE = IMAGE_BASED_SHADER_BASED_MESH_TOOL__SHADER_PARAMETER_ARRAY_SIZE;
+
+	/**
+	 * The feature id for the '<em><b>Tool Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__TOOL_TYPE = IMAGE_BASED_SHADER_BASED_MESH_TOOL__TOOL_TYPE;
+
+	/**
+	 * The feature id for the '<em><b>Mesh Map Layer</b></em>' container reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__MESH_MAP_LAYER = IMAGE_BASED_SHADER_BASED_MESH_TOOL__MESH_MAP_LAYER;
+
+	/**
+	 * The feature id for the '<em><b>Position</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__POSITION = IMAGE_BASED_SHADER_BASED_MESH_TOOL__POSITION;
+
+	/**
+	 * The feature id for the '<em><b>Rotation Matrix</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__ROTATION_MATRIX = IMAGE_BASED_SHADER_BASED_MESH_TOOL__ROTATION_MATRIX;
+
+	/**
+	 * The feature id for the '<em><b>Image</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__IMAGE = IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE;
+
+	/**
+	 * The feature id for the '<em><b>XDimension</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__XDIMENSION = IMAGE_BASED_SHADER_BASED_MESH_TOOL_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>YDimension</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__YDIMENSION = IMAGE_BASED_SHADER_BASED_MESH_TOOL_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Transparent Color</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__TRANSPARENT_COLOR = IMAGE_BASED_SHADER_BASED_MESH_TOOL_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Shader Based Projected Image Mesh Tool</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_FEATURE_COUNT = IMAGE_BASED_SHADER_BASED_MESH_TOOL_FEATURE_COUNT + 3;
+
+	/**
+	 * The operation id for the '<em>Dispose</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL___DISPOSE = IMAGE_BASED_SHADER_BASED_MESH_TOOL___DISPOSE;
+
+	/**
+	 * The operation id for the '<em>Start</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL___START = IMAGE_BASED_SHADER_BASED_MESH_TOOL___START;
+
+	/**
+	 * The operation id for the '<em>Create Shader Parameters</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL___CREATE_SHADER_PARAMETERS = IMAGE_BASED_SHADER_BASED_MESH_TOOL___CREATE_SHADER_PARAMETERS;
+
+	/**
+	 * The operation id for the '<em>Create Tool Matrix</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL___CREATE_TOOL_MATRIX = IMAGE_BASED_SHADER_BASED_MESH_TOOL___CREATE_TOOL_MATRIX;
+
+	/**
+	 * The number of operations of the '<em>Shader Based Projected Image Mesh Tool</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_OPERATION_COUNT = IMAGE_BASED_SHADER_BASED_MESH_TOOL_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.apogy.core.environment.surface.impl.VariableShaderBasedProjectedImageMeshToolImpl <em>Variable Shader Based Projected Image Mesh Tool</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.apogy.core.environment.surface.impl.VariableShaderBasedProjectedImageMeshToolImpl
+	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getVariableShaderBasedProjectedImageMeshTool()
+	 * @generated
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL = 29;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__NAME = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__DESCRIPTION = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__DESCRIPTION;
+
+	/**
+	 * The feature id for the '<em><b>Started</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__STARTED = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__STARTED;
+
+	/**
+	 * The feature id for the '<em><b>Enabled</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__ENABLED = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__ENABLED;
+
+	/**
+	 * The feature id for the '<em><b>Alpha</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__ALPHA = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__ALPHA;
+
+	/**
+	 * The feature id for the '<em><b>Shader Parameter Array Size</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__SHADER_PARAMETER_ARRAY_SIZE = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__SHADER_PARAMETER_ARRAY_SIZE;
+
+	/**
+	 * The feature id for the '<em><b>Tool Type</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__TOOL_TYPE = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__TOOL_TYPE;
+
+	/**
+	 * The feature id for the '<em><b>Mesh Map Layer</b></em>' container reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__MESH_MAP_LAYER = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__MESH_MAP_LAYER;
+
+	/**
+	 * The feature id for the '<em><b>Position</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__POSITION = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__POSITION;
+
+	/**
+	 * The feature id for the '<em><b>Rotation Matrix</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__ROTATION_MATRIX = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__ROTATION_MATRIX;
+
+	/**
+	 * The feature id for the '<em><b>Image</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__IMAGE = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__IMAGE;
+
+	/**
+	 * The feature id for the '<em><b>XDimension</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__XDIMENSION = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__XDIMENSION;
+
+	/**
+	 * The feature id for the '<em><b>YDimension</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__YDIMENSION = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__YDIMENSION;
+
+	/**
+	 * The feature id for the '<em><b>Transparent Color</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__TRANSPARENT_COLOR = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__TRANSPARENT_COLOR;
+
+	/**
+	 * The feature id for the '<em><b>Variable Feature Reference</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__VARIABLE_FEATURE_REFERENCE = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Update Position</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_POSITION = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Relative Position</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_POSITION = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Update Orientation</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_ORIENTATION = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Relative Rotation Matrix</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_ROTATION_MATRIX = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of structural features of the '<em>Variable Shader Based Projected Image Mesh Tool</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_FEATURE_COUNT = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_FEATURE_COUNT + 5;
+
+	/**
+	 * The operation id for the '<em>Dispose</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL___DISPOSE = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL___DISPOSE;
+
+	/**
+	 * The operation id for the '<em>Start</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL___START = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL___START;
+
+	/**
+	 * The operation id for the '<em>Create Shader Parameters</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL___CREATE_SHADER_PARAMETERS = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL___CREATE_SHADER_PARAMETERS;
+
+	/**
+	 * The operation id for the '<em>Create Tool Matrix</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL___CREATE_TOOL_MATRIX = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL___CREATE_TOOL_MATRIX;
+
+	/**
+	 * The number of operations of the '<em>Variable Shader Based Projected Image Mesh Tool</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_OPERATION_COUNT = SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL_OPERATION_COUNT + 0;
+
+	/**
 	 * The meta object id for the '{@link org.eclipse.apogy.core.environment.surface.impl.CartesianTriangularMeshDerivedImageMapLayerImpl <em>Cartesian Triangular Mesh Derived Image Map Layer</em>}' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3659,7 +4319,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getCartesianTriangularMeshDerivedImageMapLayer()
 	 * @generated
 	 */
-	int CARTESIAN_TRIANGULAR_MESH_DERIVED_IMAGE_MAP_LAYER = 27;
+	int CARTESIAN_TRIANGULAR_MESH_DERIVED_IMAGE_MAP_LAYER = 30;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -3849,7 +4509,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getCartesianTriangularMeshSlopeImageMapLayer()
 	 * @generated
 	 */
-	int CARTESIAN_TRIANGULAR_MESH_SLOPE_IMAGE_MAP_LAYER = 28;
+	int CARTESIAN_TRIANGULAR_MESH_SLOPE_IMAGE_MAP_LAYER = 31;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -4066,7 +4726,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getCartesianTriangularMeshDiscreteSlopeImageMapLayer()
 	 * @generated
 	 */
-	int CARTESIAN_TRIANGULAR_MESH_DISCRETE_SLOPE_IMAGE_MAP_LAYER = 29;
+	int CARTESIAN_TRIANGULAR_MESH_DISCRETE_SLOPE_IMAGE_MAP_LAYER = 32;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -4265,7 +4925,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getCartesianTriangularMeshHeightImageMapLayer()
 	 * @generated
 	 */
-	int CARTESIAN_TRIANGULAR_MESH_HEIGHT_IMAGE_MAP_LAYER = 30;
+	int CARTESIAN_TRIANGULAR_MESH_HEIGHT_IMAGE_MAP_LAYER = 33;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -4482,7 +5142,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getSlopeRange()
 	 * @generated
 	 */
-	int SLOPE_RANGE = 31;
+	int SLOPE_RANGE = 34;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -4555,7 +5215,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getAbstractLineOfSightImageMapLayer()
 	 * @generated
 	 */
-	int ABSTRACT_LINE_OF_SIGHT_IMAGE_MAP_LAYER = 32;
+	int ABSTRACT_LINE_OF_SIGHT_IMAGE_MAP_LAYER = 35;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -4781,7 +5441,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getFixedPositionLineOfSightImageMapLayer()
 	 * @generated
 	 */
-	int FIXED_POSITION_LINE_OF_SIGHT_IMAGE_MAP_LAYER = 33;
+	int FIXED_POSITION_LINE_OF_SIGHT_IMAGE_MAP_LAYER = 36;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -5016,7 +5676,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getAbstractShapeImageLayer()
 	 * @generated
 	 */
-	int ABSTRACT_SHAPE_IMAGE_LAYER = 34;
+	int ABSTRACT_SHAPE_IMAGE_LAYER = 37;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -5215,7 +5875,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getEllipseShapeImageLayer()
 	 * @generated
 	 */
-	int ELLIPSE_SHAPE_IMAGE_LAYER = 35;
+	int ELLIPSE_SHAPE_IMAGE_LAYER = 38;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -5441,7 +6101,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getRectangleShapeImageLayer()
 	 * @generated
 	 */
-	int RECTANGLE_SHAPE_IMAGE_LAYER = 36;
+	int RECTANGLE_SHAPE_IMAGE_LAYER = 39;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -5667,7 +6327,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getPolygonShapeImageMapLayer()
 	 * @generated
 	 */
-	int POLYGON_SHAPE_IMAGE_MAP_LAYER = 37;
+	int POLYGON_SHAPE_IMAGE_MAP_LAYER = 40;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -5875,7 +6535,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getCartesianCoordinatesPolygonShapeImageMapLayer()
 	 * @generated
 	 */
-	int CARTESIAN_COORDINATES_POLYGON_SHAPE_IMAGE_MAP_LAYER = 38;
+	int CARTESIAN_COORDINATES_POLYGON_SHAPE_IMAGE_MAP_LAYER = 41;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -6092,7 +6752,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getBasicCartesianTriangularMeshMapLayer()
 	 * @generated
 	 */
-	int BASIC_CARTESIAN_TRIANGULAR_MESH_MAP_LAYER = 39;
+	int BASIC_CARTESIAN_TRIANGULAR_MESH_MAP_LAYER = 42;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -6237,7 +6897,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getCartesianTriangularMeshURLMapLayer()
 	 * @generated
 	 */
-	int CARTESIAN_TRIANGULAR_MESH_URL_MAP_LAYER = 40;
+	int CARTESIAN_TRIANGULAR_MESH_URL_MAP_LAYER = 43;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -6391,7 +7051,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getFeaturesOfInterestMapLayer()
 	 * @generated
 	 */
-	int FEATURES_OF_INTEREST_MAP_LAYER = 41;
+	int FEATURES_OF_INTEREST_MAP_LAYER = 44;
 
 	/**
 	 * The feature id for the '<em><b>Name</b></em>' attribute.
@@ -6482,7 +7142,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getSurfaceWorksiteNode()
 	 * @generated
 	 */
-	int SURFACE_WORKSITE_NODE = 42;
+	int SURFACE_WORKSITE_NODE = 45;
 
 	/**
 	 * The feature id for the '<em><b>Description</b></em>' attribute.
@@ -6582,7 +7242,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getMapsListNode()
 	 * @generated
 	 */
-	int MAPS_LIST_NODE = 43;
+	int MAPS_LIST_NODE = 46;
 
 	/**
 	 * The feature id for the '<em><b>Description</b></em>' attribute.
@@ -6682,7 +7342,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getMapNode()
 	 * @generated
 	 */
-	int MAP_NODE = 44;
+	int MAP_NODE = 47;
 
 	/**
 	 * The feature id for the '<em><b>Description</b></em>' attribute.
@@ -6818,7 +7478,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getAbstractMapLayerNode()
 	 * @generated
 	 */
-	int ABSTRACT_MAP_LAYER_NODE = 45;
+	int ABSTRACT_MAP_LAYER_NODE = 48;
 
 	/**
 	 * The feature id for the '<em><b>Description</b></em>' attribute.
@@ -6918,7 +7578,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getCartesianTriangularMeshMapLayerNode()
 	 * @generated
 	 */
-	int CARTESIAN_TRIANGULAR_MESH_MAP_LAYER_NODE = 46;
+	int CARTESIAN_TRIANGULAR_MESH_MAP_LAYER_NODE = 49;
 
 	/**
 	 * The feature id for the '<em><b>Description</b></em>' attribute.
@@ -7027,7 +7687,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getSurfaceEnvironmentUtilities()
 	 * @generated
 	 */
-	int SURFACE_ENVIRONMENT_UTILITIES = 47;
+	int SURFACE_ENVIRONMENT_UTILITIES = 50;
 
 	/**
 	 * The number of structural features of the '<em>Surface Environment Utilities</em>' class.
@@ -7082,7 +7742,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getApogySurfaceEnvironmentFacade()
 	 * @generated
 	 */
-	int APOGY_SURFACE_ENVIRONMENT_FACADE = 48;
+	int APOGY_SURFACE_ENVIRONMENT_FACADE = 51;
 
 	/**
 	 * The number of structural features of the '<em>Facade</em>' class.
@@ -7254,7 +7914,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getShaderBasedMeshToolType()
 	 * @generated
 	 */
-	int SHADER_BASED_MESH_TOOL_TYPE = 49;
+	int SHADER_BASED_MESH_TOOL_TYPE = 52;
 
 	/**
 	 * The meta object id for the '<em>IProgress Monitor</em>' data type.
@@ -7264,7 +7924,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getIProgressMonitor()
 	 * @generated
 	 */
-	int IPROGRESS_MONITOR = 50;
+	int IPROGRESS_MONITOR = 53;
 
 	/**
 	 * The meta object id for the '<em>List</em>' data type.
@@ -7274,7 +7934,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getList()
 	 * @generated
 	 */
-	int LIST = 51;
+	int LIST = 54;
 
 	/**
 	 * The meta object id for the '<em>Float Array</em>' data type.
@@ -7283,7 +7943,7 @@
 	 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getFloatArray()
 	 * @generated
 	 */
-	int FLOAT_ARRAY = 52;
+	int FLOAT_ARRAY = 55;
 
 
 	/**
@@ -8116,6 +8776,27 @@
 	EOperation getShaderBasedMeshTool__CreateToolMatrix();
 
 	/**
+	 * Returns the meta object for class '{@link org.eclipse.apogy.core.environment.surface.ImageBasedShaderBasedMeshTool <em>Image Based Shader Based Mesh Tool</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Image Based Shader Based Mesh Tool</em>'.
+	 * @see org.eclipse.apogy.core.environment.surface.ImageBasedShaderBasedMeshTool
+	 * @generated
+	 */
+	EClass getImageBasedShaderBasedMeshTool();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.apogy.core.environment.surface.ImageBasedShaderBasedMeshTool#getImage <em>Image</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Image</em>'.
+	 * @see org.eclipse.apogy.core.environment.surface.ImageBasedShaderBasedMeshTool#getImage()
+	 * @see #getImageBasedShaderBasedMeshTool()
+	 * @generated
+	 */
+	EReference getImageBasedShaderBasedMeshTool_Image();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool <em>Variable Based Shader Based Mesh Tool</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -8137,6 +8818,17 @@
 	EReference getVariableBasedShaderBasedMeshTool_VariableFeatureReference();
 
 	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool#isUpdatePosition <em>Update Position</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Update Position</em>'.
+	 * @see org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool#isUpdatePosition()
+	 * @see #getVariableBasedShaderBasedMeshTool()
+	 * @generated
+	 */
+	EAttribute getVariableBasedShaderBasedMeshTool_UpdatePosition();
+
+	/**
 	 * Returns the meta object for the containment reference '{@link org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool#getRelativePosition <em>Relative Position</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -8148,6 +8840,17 @@
 	EReference getVariableBasedShaderBasedMeshTool_RelativePosition();
 
 	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool#isUpdateOrientation <em>Update Orientation</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Update Orientation</em>'.
+	 * @see org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool#isUpdateOrientation()
+	 * @see #getVariableBasedShaderBasedMeshTool()
+	 * @generated
+	 */
+	EAttribute getVariableBasedShaderBasedMeshTool_UpdateOrientation();
+
+	/**
 	 * Returns the meta object for the containment reference '{@link org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool#getRelativeRotationMatrix <em>Relative Rotation Matrix</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -8492,6 +9195,59 @@
 	EClass getVariableAngularDisplayMeshTool();
 
 	/**
+	 * Returns the meta object for class '{@link org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool <em>Shader Based Projected Image Mesh Tool</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Shader Based Projected Image Mesh Tool</em>'.
+	 * @see org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool
+	 * @generated
+	 */
+	EClass getShaderBasedProjectedImageMeshTool();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool#getXDimension <em>XDimension</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>XDimension</em>'.
+	 * @see org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool#getXDimension()
+	 * @see #getShaderBasedProjectedImageMeshTool()
+	 * @generated
+	 */
+	EAttribute getShaderBasedProjectedImageMeshTool_XDimension();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool#getYDimension <em>YDimension</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>YDimension</em>'.
+	 * @see org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool#getYDimension()
+	 * @see #getShaderBasedProjectedImageMeshTool()
+	 * @generated
+	 */
+	EAttribute getShaderBasedProjectedImageMeshTool_YDimension();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool#getTransparentColor <em>Transparent Color</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Transparent Color</em>'.
+	 * @see org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool#getTransparentColor()
+	 * @see #getShaderBasedProjectedImageMeshTool()
+	 * @generated
+	 */
+	EAttribute getShaderBasedProjectedImageMeshTool_TransparentColor();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.apogy.core.environment.surface.VariableShaderBasedProjectedImageMeshTool <em>Variable Shader Based Projected Image Mesh Tool</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Variable Shader Based Projected Image Mesh Tool</em>'.
+	 * @see org.eclipse.apogy.core.environment.surface.VariableShaderBasedProjectedImageMeshTool
+	 * @generated
+	 */
+	EClass getVariableShaderBasedProjectedImageMeshTool();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.apogy.core.environment.surface.CartesianTriangularMeshDerivedImageMapLayer <em>Cartesian Triangular Mesh Derived Image Map Layer</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -10010,6 +10766,24 @@
 		EOperation SHADER_BASED_MESH_TOOL___CREATE_TOOL_MATRIX = eINSTANCE.getShaderBasedMeshTool__CreateToolMatrix();
 
 		/**
+		 * The meta object literal for the '{@link org.eclipse.apogy.core.environment.surface.impl.ImageBasedShaderBasedMeshToolImpl <em>Image Based Shader Based Mesh Tool</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.apogy.core.environment.surface.impl.ImageBasedShaderBasedMeshToolImpl
+		 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getImageBasedShaderBasedMeshTool()
+		 * @generated
+		 */
+		EClass IMAGE_BASED_SHADER_BASED_MESH_TOOL = eINSTANCE.getImageBasedShaderBasedMeshTool();
+
+		/**
+		 * The meta object literal for the '<em><b>Image</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE = eINSTANCE.getImageBasedShaderBasedMeshTool_Image();
+
+		/**
 		 * The meta object literal for the '{@link org.eclipse.apogy.core.environment.surface.impl.VariableBasedShaderBasedMeshToolImpl <em>Variable Based Shader Based Mesh Tool</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -10028,6 +10802,14 @@
 		EReference VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE = eINSTANCE.getVariableBasedShaderBasedMeshTool_VariableFeatureReference();
 
 		/**
+		 * The meta object literal for the '<em><b>Update Position</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION = eINSTANCE.getVariableBasedShaderBasedMeshTool_UpdatePosition();
+
+		/**
 		 * The meta object literal for the '<em><b>Relative Position</b></em>' containment reference feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -10036,6 +10818,14 @@
 		EReference VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION = eINSTANCE.getVariableBasedShaderBasedMeshTool_RelativePosition();
 
 		/**
+		 * The meta object literal for the '<em><b>Update Orientation</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION = eINSTANCE.getVariableBasedShaderBasedMeshTool_UpdateOrientation();
+
+		/**
 		 * The meta object literal for the '<em><b>Relative Rotation Matrix</b></em>' containment reference feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -10308,6 +11098,50 @@
 		EClass VARIABLE_ANGULAR_DISPLAY_MESH_TOOL = eINSTANCE.getVariableAngularDisplayMeshTool();
 
 		/**
+		 * The meta object literal for the '{@link org.eclipse.apogy.core.environment.surface.impl.ShaderBasedProjectedImageMeshToolImpl <em>Shader Based Projected Image Mesh Tool</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.apogy.core.environment.surface.impl.ShaderBasedProjectedImageMeshToolImpl
+		 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getShaderBasedProjectedImageMeshTool()
+		 * @generated
+		 */
+		EClass SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL = eINSTANCE.getShaderBasedProjectedImageMeshTool();
+
+		/**
+		 * The meta object literal for the '<em><b>XDimension</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__XDIMENSION = eINSTANCE.getShaderBasedProjectedImageMeshTool_XDimension();
+
+		/**
+		 * The meta object literal for the '<em><b>YDimension</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__YDIMENSION = eINSTANCE.getShaderBasedProjectedImageMeshTool_YDimension();
+
+		/**
+		 * The meta object literal for the '<em><b>Transparent Color</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__TRANSPARENT_COLOR = eINSTANCE.getShaderBasedProjectedImageMeshTool_TransparentColor();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.apogy.core.environment.surface.impl.VariableShaderBasedProjectedImageMeshToolImpl <em>Variable Shader Based Projected Image Mesh Tool</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.apogy.core.environment.surface.impl.VariableShaderBasedProjectedImageMeshToolImpl
+		 * @see org.eclipse.apogy.core.environment.surface.impl.ApogySurfaceEnvironmentPackageImpl#getVariableShaderBasedProjectedImageMeshTool()
+		 * @generated
+		 */
+		EClass VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL = eINSTANCE.getVariableShaderBasedProjectedImageMeshTool();
+
+		/**
 		 * The meta object literal for the '{@link org.eclipse.apogy.core.environment.surface.impl.CartesianTriangularMeshDerivedImageMapLayerImpl <em>Cartesian Triangular Mesh Derived Image Map Layer</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ImageBasedShaderBasedMeshTool.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ImageBasedShaderBasedMeshTool.java
new file mode 100644
index 0000000..081a44d
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ImageBasedShaderBasedMeshTool.java
@@ -0,0 +1,68 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2020 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *      Pierre Allard - initial API and implementation    
+ *         
+ * SPDX-License-Identifier: EPL-1.0    
+ * *******************************************************************************
+ */
+package org.eclipse.apogy.core.environment.surface;
+
+import org.eclipse.apogy.common.images.AbstractEImage;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Image Based Shader Based Mesh Tool</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * *
+ *  Shader based tool that uses an image to its rendering.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.ImageBasedShaderBasedMeshTool#getImage <em>Image</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage#getImageBasedShaderBasedMeshTool()
+ * @model abstract="true"
+ * @generated
+ */
+public interface ImageBasedShaderBasedMeshTool extends ShaderBasedMeshTool {
+	/**
+	 * Returns the value of the '<em><b>Image</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * *
+	 * The image.
+	 * <!-- end-model-doc -->
+	 * @return the value of the '<em>Image</em>' containment reference.
+	 * @see #setImage(AbstractEImage)
+	 * @see org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage#getImageBasedShaderBasedMeshTool_Image()
+	 * @model containment="true"
+	 * @generated
+	 */
+	AbstractEImage getImage();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.apogy.core.environment.surface.ImageBasedShaderBasedMeshTool#getImage <em>Image</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Image</em>' containment reference.
+	 * @see #getImage()
+	 * @generated
+	 */
+	void setImage(AbstractEImage value);
+
+	
+} // ImageBasedShaderBasedMeshTool
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ShaderBasedMeshToolType.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ShaderBasedMeshToolType.java
index 5ccc06e..eac54ab 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ShaderBasedMeshToolType.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ShaderBasedMeshToolType.java
@@ -82,7 +82,17 @@
 	 * @generated
 	 * @ordered
 	 */
-	ANGULAR(4, "ANGULAR", "Angular");
+	ANGULAR(4, "ANGULAR", "Angular"),
+
+	/**
+	 * The '<em><b>IMAGE</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #IMAGE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	IMAGE(5, "IMAGE", "Image");
 
 	/**
 	 * The '<em><b>NONE</b></em>' literal value.
@@ -140,6 +150,17 @@
 	public static final int ANGULAR_VALUE = 4;
 
 	/**
+	 * The '<em><b>IMAGE</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #IMAGE
+	 * @model literal="Image"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int IMAGE_VALUE = 5;
+
+	/**
 	 * An array of all the '<em><b>Shader Based Mesh Tool Type</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -152,6 +173,7 @@
 			GRID,
 			BULLSEYE,
 			ANGULAR,
+			IMAGE,
 		};
 
 	/**
@@ -213,6 +235,7 @@
 			case GRID_VALUE: return GRID;
 			case BULLSEYE_VALUE: return BULLSEYE;
 			case ANGULAR_VALUE: return ANGULAR;
+			case IMAGE_VALUE: return IMAGE;
 		}
 		return null;
 	}
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ShaderBasedProjectedImageMeshTool.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ShaderBasedProjectedImageMeshTool.java
new file mode 100644
index 0000000..cad53d0
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/ShaderBasedProjectedImageMeshTool.java
@@ -0,0 +1,127 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2020 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *      Pierre Allard - initial API and implementation    
+ *         
+ * SPDX-License-Identifier: EPL-1.0    
+ * *******************************************************************************
+ */
+package org.eclipse.apogy.core.environment.surface;
+
+import org.eclipse.swt.graphics.RGBA;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Shader Based Projected Image Mesh Tool</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * *
+ * Shader based tool that displays an image on top of the mesh.
+ * <!-- end-model-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool#getXDimension <em>XDimension</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool#getYDimension <em>YDimension</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool#getTransparentColor <em>Transparent Color</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage#getShaderBasedProjectedImageMeshTool()
+ * @model annotation="http://www.eclipse.org/apogy hasCustomClass='true' hasCustomItemProvider='true'"
+ * @generated
+ */
+public interface ShaderBasedProjectedImageMeshTool extends ImageBasedShaderBasedMeshTool {
+	/**
+	 * Returns the value of the '<em><b>XDimension</b></em>' attribute.
+	 * The default value is <code>"1.0"</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * *
+	 * Size of the projected image along the X axis
+	 * <!-- end-model-doc -->
+	 * @return the value of the '<em>XDimension</em>' attribute.
+	 * @see #setXDimension(float)
+	 * @see org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage#getShaderBasedProjectedImageMeshTool_XDimension()
+	 * @model default="1.0" unique="false"
+	 *        annotation="http://www.eclipse.org/apogy units='m'"
+	 * @generated
+	 */
+	float getXDimension();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool#getXDimension <em>XDimension</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>XDimension</em>' attribute.
+	 * @see #getXDimension()
+	 * @generated
+	 */
+	void setXDimension(float value);
+
+	/**
+	 * Returns the value of the '<em><b>YDimension</b></em>' attribute.
+	 * The default value is <code>"1.0"</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * *
+	 * Size of the projected image along the Y axis
+	 * <!-- end-model-doc -->
+	 * @return the value of the '<em>YDimension</em>' attribute.
+	 * @see #setYDimension(float)
+	 * @see org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage#getShaderBasedProjectedImageMeshTool_YDimension()
+	 * @model default="1.0" unique="false"
+	 *        annotation="http://www.eclipse.org/apogy units='m'"
+	 * @generated
+	 */
+	float getYDimension();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool#getYDimension <em>YDimension</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>YDimension</em>' attribute.
+	 * @see #getYDimension()
+	 * @generated
+	 */
+	void setYDimension(float value);
+
+	/**
+	 * Returns the value of the '<em><b>Transparent Color</b></em>' attribute.
+	 * The default value is <code>"255,255,255,255"</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * The color that is interpreted as transparent.
+	 * <!-- end-model-doc -->
+	 * @return the value of the '<em>Transparent Color</em>' attribute.
+	 * @see #setTransparentColor(RGBA)
+	 * @see org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage#getShaderBasedProjectedImageMeshTool_TransparentColor()
+	 * @model default="255,255,255,255" unique="false" dataType="org.eclipse.apogy.common.emf.ui.RGBA"
+	 *        annotation="http://www.eclipse.org/emf/2002/GenModel property='Editable'"
+	 * @generated
+	 */
+	RGBA getTransparentColor();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool#getTransparentColor <em>Transparent Color</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Transparent Color</em>' attribute.
+	 * @see #getTransparentColor()
+	 * @generated
+	 */
+	void setTransparentColor(RGBA value);
+
+	
+} // ShaderBasedProjectedImageMeshTool
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/VariableAngularDisplayMeshTool.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/VariableAngularDisplayMeshTool.java
index 98d6405..d20d54a 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/VariableAngularDisplayMeshTool.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/VariableAngularDisplayMeshTool.java
@@ -22,7 +22,8 @@
  *
  * <!-- begin-model-doc -->
  * *
- * Shader based tool that displays angles as radial lines.
+ * Shader based tool that displays angles as radial lines which centre coordinates are updated to reflect the location
+ * of a Variable on that mesh.
  * <!-- end-model-doc -->
  *
  *
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/VariableBasedShaderBasedMeshTool.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/VariableBasedShaderBasedMeshTool.java
index 6c1ebd1..70a2746 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/VariableBasedShaderBasedMeshTool.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/VariableBasedShaderBasedMeshTool.java
@@ -34,7 +34,9 @@
  * </p>
  * <ul>
  *   <li>{@link org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool#getVariableFeatureReference <em>Variable Feature Reference</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool#isUpdatePosition <em>Update Position</em>}</li>
  *   <li>{@link org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool#getRelativePosition <em>Relative Position</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool#isUpdateOrientation <em>Update Orientation</em>}</li>
  *   <li>{@link org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool#getRelativeRotationMatrix <em>Relative Rotation Matrix</em>}</li>
  * </ul>
  *
@@ -68,6 +70,29 @@
 	void setVariableFeatureReference(VariableFeatureReference value);
 
 	/**
+	 * Returns the value of the '<em><b>Update Position</b></em>' attribute.
+	 * The default value is <code>"true"</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Update Position</em>' attribute.
+	 * @see #setUpdatePosition(boolean)
+	 * @see org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage#getVariableBasedShaderBasedMeshTool_UpdatePosition()
+	 * @model default="true" unique="false"
+	 * @generated
+	 */
+	boolean isUpdatePosition();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool#isUpdatePosition <em>Update Position</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Update Position</em>' attribute.
+	 * @see #isUpdatePosition()
+	 * @generated
+	 */
+	void setUpdatePosition(boolean value);
+
+	/**
 	 * Returns the value of the '<em><b>Relative Position</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -95,6 +120,29 @@
 	void setRelativePosition(Tuple3d value);
 
 	/**
+	 * Returns the value of the '<em><b>Update Orientation</b></em>' attribute.
+	 * The default value is <code>"true"</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Update Orientation</em>' attribute.
+	 * @see #setUpdateOrientation(boolean)
+	 * @see org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage#getVariableBasedShaderBasedMeshTool_UpdateOrientation()
+	 * @model default="true" unique="false"
+	 * @generated
+	 */
+	boolean isUpdateOrientation();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool#isUpdateOrientation <em>Update Orientation</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Update Orientation</em>' attribute.
+	 * @see #isUpdateOrientation()
+	 * @generated
+	 */
+	void setUpdateOrientation(boolean value);
+
+	/**
 	 * Returns the value of the '<em><b>Relative Rotation Matrix</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/VariablePoseBullseyeTool.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/VariablePoseBullseyeTool.java
index e341e2e..e38e89f 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/VariablePoseBullseyeTool.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/VariablePoseBullseyeTool.java
@@ -22,7 +22,7 @@
  *
  * <!-- begin-model-doc -->
  * *
- * Specialisation of ShaderBasedBullseyeTool which centre coordinates are updates to reflect the location
+ * Specialisation of ShaderBasedBullseyeTool which centre coordinates are updated to reflect the location
  * of a Variable on that mesh.
  * <!-- end-model-doc -->
  *
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/VariableShaderBasedProjectedImageMeshTool.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/VariableShaderBasedProjectedImageMeshTool.java
new file mode 100644
index 0000000..2541f62
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/VariableShaderBasedProjectedImageMeshTool.java
@@ -0,0 +1,36 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2020 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *      Pierre Allard - initial API and implementation    
+ *         
+ * SPDX-License-Identifier: EPL-1.0    
+ * *******************************************************************************
+ */
+package org.eclipse.apogy.core.environment.surface;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Variable Shader Based Projected Image Mesh Tool</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <!-- begin-model-doc -->
+ * *
+ * Shader based tool that displays an image on top of the mesh which centre coordinates are updated to reflect the location
+ * of a Variable on that mesh.
+ * <!-- end-model-doc -->
+ *
+ *
+ * @see org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage#getVariableShaderBasedProjectedImageMeshTool()
+ * @model annotation="http://www.eclipse.org/apogy hasCustomClass='true' hasCustomItemProvider='true'"
+ * @generated
+ */
+public interface VariableShaderBasedProjectedImageMeshTool extends ShaderBasedProjectedImageMeshTool, VariableBasedShaderBasedMeshTool {
+	
+} // VariableShaderBasedProjectedImageMeshTool
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/ApogySurfaceEnvironmentFactoryImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/ApogySurfaceEnvironmentFactoryImpl.java
index 3baffda..41ff566 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/ApogySurfaceEnvironmentFactoryImpl.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/ApogySurfaceEnvironmentFactoryImpl.java
@@ -90,6 +90,8 @@
 			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL: return createVariablePoseBullseyeTool();
 			case ApogySurfaceEnvironmentPackage.SHADER_BASED_ANGULAR_DISPLAY_MESH_TOOL: return createShaderBasedAngularDisplayMeshTool();
 			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL: return createVariableAngularDisplayMeshTool();
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL: return createShaderBasedProjectedImageMeshTool();
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL: return createVariableShaderBasedProjectedImageMeshTool();
 			case ApogySurfaceEnvironmentPackage.CARTESIAN_TRIANGULAR_MESH_SLOPE_IMAGE_MAP_LAYER: return createCartesianTriangularMeshSlopeImageMapLayer();
 			case ApogySurfaceEnvironmentPackage.CARTESIAN_TRIANGULAR_MESH_DISCRETE_SLOPE_IMAGE_MAP_LAYER: return createCartesianTriangularMeshDiscreteSlopeImageMapLayer();
 			case ApogySurfaceEnvironmentPackage.CARTESIAN_TRIANGULAR_MESH_HEIGHT_IMAGE_MAP_LAYER: return createCartesianTriangularMeshHeightImageMapLayer();
@@ -348,6 +350,28 @@
 	 * @generated
 	 */
 	@Override
+	public ShaderBasedProjectedImageMeshTool createShaderBasedProjectedImageMeshTool() {
+		ShaderBasedProjectedImageMeshToolImpl shaderBasedProjectedImageMeshTool = new ShaderBasedProjectedImageMeshToolCustomImpl();
+		return shaderBasedProjectedImageMeshTool;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public VariableShaderBasedProjectedImageMeshTool createVariableShaderBasedProjectedImageMeshTool() {
+		VariableShaderBasedProjectedImageMeshToolImpl variableShaderBasedProjectedImageMeshTool = new VariableShaderBasedProjectedImageMeshToolCustomImpl();
+		return variableShaderBasedProjectedImageMeshTool;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public CartesianTriangularMeshSlopeImageMapLayer createCartesianTriangularMeshSlopeImageMapLayer() {
 		CartesianTriangularMeshSlopeImageMapLayerImpl cartesianTriangularMeshSlopeImageMapLayer = new CartesianTriangularMeshSlopeImageMapLayerCustomImpl();
 		return cartesianTriangularMeshSlopeImageMapLayer;
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/ApogySurfaceEnvironmentPackageImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/ApogySurfaceEnvironmentPackageImpl.java
index e3fe7f6..1bb8f10 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/ApogySurfaceEnvironmentPackageImpl.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/ApogySurfaceEnvironmentPackageImpl.java
@@ -57,6 +57,7 @@
 import org.eclipse.apogy.core.environment.surface.EllipseShapeImageLayer;
 import org.eclipse.apogy.core.environment.surface.FeaturesOfInterestMapLayer;
 import org.eclipse.apogy.core.environment.surface.FixedPositionLineOfSightImageMapLayer;
+import org.eclipse.apogy.core.environment.surface.ImageBasedShaderBasedMeshTool;
 import org.eclipse.apogy.core.environment.surface.ImageMapLayer;
 import org.eclipse.apogy.core.environment.surface.ImageMapLayerPresentation;
 import org.eclipse.apogy.core.environment.surface.Map;
@@ -77,6 +78,7 @@
 import org.eclipse.apogy.core.environment.surface.ShaderBasedGridTool;
 import org.eclipse.apogy.core.environment.surface.ShaderBasedMeshTool;
 import org.eclipse.apogy.core.environment.surface.ShaderBasedMeshToolType;
+import org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool;
 import org.eclipse.apogy.core.environment.surface.SlopeRange;
 import org.eclipse.apogy.core.environment.surface.SurfaceEnvironmentUtilities;
 import org.eclipse.apogy.core.environment.surface.SurfaceWorksite;
@@ -90,6 +92,7 @@
 import org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshToolPoseAdapter;
 import org.eclipse.apogy.core.environment.surface.VariablePoseBullseyeTool;
 import org.eclipse.apogy.core.environment.surface.VariableShaderBasedGridTool;
+import org.eclipse.apogy.core.environment.surface.VariableShaderBasedProjectedImageMeshTool;
 
 import org.eclipse.apogy.core.invocator.ApogyCoreInvocatorPackage;
 
@@ -245,6 +248,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	private EClass imageBasedShaderBasedMeshToolEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	private EClass variableBasedShaderBasedMeshToolEClass = null;
 
 	/**
@@ -308,6 +318,20 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	private EClass shaderBasedProjectedImageMeshToolEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass variableShaderBasedProjectedImageMeshToolEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	private EClass cartesianTriangularMeshDerivedImageMapLayerEClass = null;
 
 	/**
@@ -1347,6 +1371,26 @@
 	 * @generated
 	 */
 	@Override
+	public EClass getImageBasedShaderBasedMeshTool() {
+		return imageBasedShaderBasedMeshToolEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EReference getImageBasedShaderBasedMeshTool_Image() {
+		return (EReference)imageBasedShaderBasedMeshToolEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EClass getVariableBasedShaderBasedMeshTool() {
 		return variableBasedShaderBasedMeshToolEClass;
 	}
@@ -1367,8 +1411,28 @@
 	 * @generated
 	 */
 	@Override
+	public EAttribute getVariableBasedShaderBasedMeshTool_UpdatePosition() {
+		return (EAttribute)variableBasedShaderBasedMeshToolEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EReference getVariableBasedShaderBasedMeshTool_RelativePosition() {
-		return (EReference)variableBasedShaderBasedMeshToolEClass.getEStructuralFeatures().get(1);
+		return (EReference)variableBasedShaderBasedMeshToolEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EAttribute getVariableBasedShaderBasedMeshTool_UpdateOrientation() {
+		return (EAttribute)variableBasedShaderBasedMeshToolEClass.getEStructuralFeatures().get(3);
 	}
 
 	/**
@@ -1378,7 +1442,7 @@
 	 */
 	@Override
 	public EReference getVariableBasedShaderBasedMeshTool_RelativeRotationMatrix() {
-		return (EReference)variableBasedShaderBasedMeshToolEClass.getEStructuralFeatures().get(2);
+		return (EReference)variableBasedShaderBasedMeshToolEClass.getEStructuralFeatures().get(4);
 	}
 
 	/**
@@ -1697,6 +1761,56 @@
 	 * @generated
 	 */
 	@Override
+	public EClass getShaderBasedProjectedImageMeshTool() {
+		return shaderBasedProjectedImageMeshToolEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EAttribute getShaderBasedProjectedImageMeshTool_XDimension() {
+		return (EAttribute)shaderBasedProjectedImageMeshToolEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EAttribute getShaderBasedProjectedImageMeshTool_YDimension() {
+		return (EAttribute)shaderBasedProjectedImageMeshToolEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EAttribute getShaderBasedProjectedImageMeshTool_TransparentColor() {
+		return (EAttribute)shaderBasedProjectedImageMeshToolEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EClass getVariableShaderBasedProjectedImageMeshTool() {
+		return variableShaderBasedProjectedImageMeshToolEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EClass getCartesianTriangularMeshDerivedImageMapLayer() {
 		return cartesianTriangularMeshDerivedImageMapLayerEClass;
 	}
@@ -2616,9 +2730,14 @@
 		createEOperation(shaderBasedMeshToolEClass, SHADER_BASED_MESH_TOOL___CREATE_SHADER_PARAMETERS);
 		createEOperation(shaderBasedMeshToolEClass, SHADER_BASED_MESH_TOOL___CREATE_TOOL_MATRIX);
 
+		imageBasedShaderBasedMeshToolEClass = createEClass(IMAGE_BASED_SHADER_BASED_MESH_TOOL);
+		createEReference(imageBasedShaderBasedMeshToolEClass, IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE);
+
 		variableBasedShaderBasedMeshToolEClass = createEClass(VARIABLE_BASED_SHADER_BASED_MESH_TOOL);
 		createEReference(variableBasedShaderBasedMeshToolEClass, VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE);
+		createEAttribute(variableBasedShaderBasedMeshToolEClass, VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION);
 		createEReference(variableBasedShaderBasedMeshToolEClass, VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION);
+		createEAttribute(variableBasedShaderBasedMeshToolEClass, VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION);
 		createEReference(variableBasedShaderBasedMeshToolEClass, VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX);
 
 		variableBasedShaderBasedMeshToolPoseAdapterEClass = createEClass(VARIABLE_BASED_SHADER_BASED_MESH_TOOL_POSE_ADAPTER);
@@ -2660,6 +2779,13 @@
 
 		variableAngularDisplayMeshToolEClass = createEClass(VARIABLE_ANGULAR_DISPLAY_MESH_TOOL);
 
+		shaderBasedProjectedImageMeshToolEClass = createEClass(SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL);
+		createEAttribute(shaderBasedProjectedImageMeshToolEClass, SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__XDIMENSION);
+		createEAttribute(shaderBasedProjectedImageMeshToolEClass, SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__YDIMENSION);
+		createEAttribute(shaderBasedProjectedImageMeshToolEClass, SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__TRANSPARENT_COLOR);
+
+		variableShaderBasedProjectedImageMeshToolEClass = createEClass(VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL);
+
 		cartesianTriangularMeshDerivedImageMapLayerEClass = createEClass(CARTESIAN_TRIANGULAR_MESH_DERIVED_IMAGE_MAP_LAYER);
 		createEAttribute(cartesianTriangularMeshDerivedImageMapLayerEClass, CARTESIAN_TRIANGULAR_MESH_DERIVED_IMAGE_MAP_LAYER__REQUIRED_RESOLUTION);
 		createEReference(cartesianTriangularMeshDerivedImageMapLayerEClass, CARTESIAN_TRIANGULAR_MESH_DERIVED_IMAGE_MAP_LAYER__CARTESIAN_TRIANGULAR_MESH_MAP_LAYER);
@@ -2829,6 +2955,7 @@
 		shaderBasedMeshToolEClass.getESuperTypes().add(theApogyCommonEMFPackage.getNamedDescribedElement());
 		shaderBasedMeshToolEClass.getESuperTypes().add(theApogyCommonEMFPackage.getStartable());
 		shaderBasedMeshToolEClass.getESuperTypes().add(theApogyCommonEMFPackage.getDisposable());
+		imageBasedShaderBasedMeshToolEClass.getESuperTypes().add(this.getShaderBasedMeshTool());
 		variableBasedShaderBasedMeshToolEClass.getESuperTypes().add(this.getShaderBasedMeshTool());
 		variableBasedShaderBasedMeshToolPoseAdapterEClass.getESuperTypes().add(theApogyCommonEMFPackage.getDisposable());
 		shaderBasedGridToolEClass.getESuperTypes().add(this.getShaderBasedMeshTool());
@@ -2841,6 +2968,9 @@
 		shaderBasedAngularDisplayMeshToolEClass.getESuperTypes().add(this.getShaderBasedMeshTool());
 		variableAngularDisplayMeshToolEClass.getESuperTypes().add(this.getShaderBasedAngularDisplayMeshTool());
 		variableAngularDisplayMeshToolEClass.getESuperTypes().add(this.getVariableBasedShaderBasedMeshTool());
+		shaderBasedProjectedImageMeshToolEClass.getESuperTypes().add(this.getImageBasedShaderBasedMeshTool());
+		variableShaderBasedProjectedImageMeshToolEClass.getESuperTypes().add(this.getShaderBasedProjectedImageMeshTool());
+		variableShaderBasedProjectedImageMeshToolEClass.getESuperTypes().add(this.getVariableBasedShaderBasedMeshTool());
 		cartesianTriangularMeshDerivedImageMapLayerEClass.getESuperTypes().add(this.getImageMapLayer());
 		cartesianTriangularMeshSlopeImageMapLayerEClass.getESuperTypes().add(this.getCartesianTriangularMeshDerivedImageMapLayer());
 		cartesianTriangularMeshDiscreteSlopeImageMapLayerEClass.getESuperTypes().add(this.getCartesianTriangularMeshDerivedImageMapLayer());
@@ -2973,9 +3103,14 @@
 
 		initEOperation(getShaderBasedMeshTool__CreateToolMatrix(), theApogyCommonMathPackage.getMatrix4x4(), "createToolMatrix", 0, 1, !IS_UNIQUE, IS_ORDERED);
 
+		initEClass(imageBasedShaderBasedMeshToolEClass, ImageBasedShaderBasedMeshTool.class, "ImageBasedShaderBasedMeshTool", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getImageBasedShaderBasedMeshTool_Image(), theApogyCommonImagesPackage.getAbstractEImage(), null, "image", null, 0, 1, ImageBasedShaderBasedMeshTool.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
 		initEClass(variableBasedShaderBasedMeshToolEClass, VariableBasedShaderBasedMeshTool.class, "VariableBasedShaderBasedMeshTool", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getVariableBasedShaderBasedMeshTool_VariableFeatureReference(), theApogyCoreInvocatorPackage.getVariableFeatureReference(), null, "variableFeatureReference", null, 0, 1, VariableBasedShaderBasedMeshTool.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVariableBasedShaderBasedMeshTool_UpdatePosition(), theEcorePackage.getEBoolean(), "updatePosition", "true", 0, 1, VariableBasedShaderBasedMeshTool.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getVariableBasedShaderBasedMeshTool_RelativePosition(), theApogyCommonMathPackage.getTuple3d(), null, "relativePosition", null, 0, 1, VariableBasedShaderBasedMeshTool.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getVariableBasedShaderBasedMeshTool_UpdateOrientation(), theEcorePackage.getEBoolean(), "updateOrientation", "true", 0, 1, VariableBasedShaderBasedMeshTool.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getVariableBasedShaderBasedMeshTool_RelativeRotationMatrix(), theApogyCommonMathPackage.getMatrix3x3(), null, "relativeRotationMatrix", null, 0, 1, VariableBasedShaderBasedMeshTool.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(variableBasedShaderBasedMeshToolPoseAdapterEClass, VariableBasedShaderBasedMeshToolPoseAdapter.class, "VariableBasedShaderBasedMeshToolPoseAdapter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
@@ -3017,6 +3152,13 @@
 
 		initEClass(variableAngularDisplayMeshToolEClass, VariableAngularDisplayMeshTool.class, "VariableAngularDisplayMeshTool", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 
+		initEClass(shaderBasedProjectedImageMeshToolEClass, ShaderBasedProjectedImageMeshTool.class, "ShaderBasedProjectedImageMeshTool", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getShaderBasedProjectedImageMeshTool_XDimension(), theEcorePackage.getEFloat(), "xDimension", "1.0", 0, 1, ShaderBasedProjectedImageMeshTool.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getShaderBasedProjectedImageMeshTool_YDimension(), theEcorePackage.getEFloat(), "yDimension", "1.0", 0, 1, ShaderBasedProjectedImageMeshTool.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getShaderBasedProjectedImageMeshTool_TransparentColor(), theApogyCommonEMFUIPackage.getRGBA(), "transparentColor", "255,255,255,255", 0, 1, ShaderBasedProjectedImageMeshTool.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(variableShaderBasedProjectedImageMeshToolEClass, VariableShaderBasedProjectedImageMeshTool.class, "VariableShaderBasedProjectedImageMeshTool", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
 		initEClass(cartesianTriangularMeshDerivedImageMapLayerEClass, CartesianTriangularMeshDerivedImageMapLayer.class, "CartesianTriangularMeshDerivedImageMapLayer", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEAttribute(getCartesianTriangularMeshDerivedImageMapLayer_RequiredResolution(), theEcorePackage.getEDouble(), "requiredResolution", "1.0", 0, 1, CartesianTriangularMeshDerivedImageMapLayer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getCartesianTriangularMeshDerivedImageMapLayer_CartesianTriangularMeshMapLayer(), this.getCartesianTriangularMeshMapLayer(), null, "cartesianTriangularMeshMapLayer", null, 0, 1, CartesianTriangularMeshDerivedImageMapLayer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
@@ -3223,6 +3365,7 @@
 		addEEnumLiteral(shaderBasedMeshToolTypeEEnum, ShaderBasedMeshToolType.GRID);
 		addEEnumLiteral(shaderBasedMeshToolTypeEEnum, ShaderBasedMeshToolType.BULLSEYE);
 		addEEnumLiteral(shaderBasedMeshToolTypeEEnum, ShaderBasedMeshToolType.ANGULAR);
+		addEEnumLiteral(shaderBasedMeshToolTypeEEnum, ShaderBasedMeshToolType.IMAGE);
 
 		// Initialize data types
 		initEDataType(iProgressMonitorEDataType, IProgressMonitor.class, "IProgressMonitor", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
@@ -3730,6 +3873,18 @@
 			   "documentation", "*\nTool Type used in shader. Note that the enm value are used to switch between the function used to generate the visual in the fragment shader,"
 		   });
 		addAnnotation
+		  (imageBasedShaderBasedMeshToolEClass,
+		   source,
+		   new String[] {
+			   "documentation", "*\n Shader based tool that uses an image to its rendering."
+		   });
+		addAnnotation
+		  (getImageBasedShaderBasedMeshTool_Image(),
+		   source,
+		   new String[] {
+			   "documentation", "*\nThe image."
+		   });
+		addAnnotation
 		  (variableBasedShaderBasedMeshToolEClass,
 		   source,
 		   new String[] {
@@ -3860,7 +4015,7 @@
 		  (variablePoseBullseyeToolEClass,
 		   source,
 		   new String[] {
-			   "documentation", "*\nSpecialisation of ShaderBasedBullseyeTool which centre coordinates are updates to reflect the location\nof a Variable on that mesh."
+			   "documentation", "*\nSpecialisation of ShaderBasedBullseyeTool which centre coordinates are updated to reflect the location\nof a Variable on that mesh."
 		   });
 		addAnnotation
 		  (shaderBasedAngularDisplayMeshToolEClass,
@@ -3915,7 +4070,38 @@
 		  (variableAngularDisplayMeshToolEClass,
 		   source,
 		   new String[] {
-			   "documentation", "*\nShader based tool that displays angles as radial lines."
+			   "documentation", "*\nShader based tool that displays angles as radial lines which centre coordinates are updated to reflect the location\nof a Variable on that mesh."
+		   });
+		addAnnotation
+		  (shaderBasedProjectedImageMeshToolEClass,
+		   source,
+		   new String[] {
+			   "documentation", "*\nShader based tool that displays an image on top of the mesh."
+		   });
+		addAnnotation
+		  (getShaderBasedProjectedImageMeshTool_XDimension(),
+		   source,
+		   new String[] {
+			   "documentation", "*\nSize of the projected image along the X axis"
+		   });
+		addAnnotation
+		  (getShaderBasedProjectedImageMeshTool_YDimension(),
+		   source,
+		   new String[] {
+			   "documentation", "*\nSize of the projected image along the Y axis"
+		   });
+		addAnnotation
+		  (getShaderBasedProjectedImageMeshTool_TransparentColor(),
+		   source,
+		   new String[] {
+			   "documentation", "The color that is interpreted as transparent.",
+			   "property", "Editable"
+		   });
+		addAnnotation
+		  (variableShaderBasedProjectedImageMeshToolEClass,
+		   source,
+		   new String[] {
+			   "documentation", "*\nShader based tool that displays an image on top of the mesh which centre coordinates are updated to reflect the location\nof a Variable on that mesh."
 		   });
 		addAnnotation
 		  (cartesianTriangularMeshDerivedImageMapLayerEClass,
@@ -4689,6 +4875,32 @@
 			   "hasCustomItemProvider", "true"
 		   });
 		addAnnotation
+		  (shaderBasedProjectedImageMeshToolEClass,
+		   source,
+		   new String[] {
+			   "hasCustomClass", "true",
+			   "hasCustomItemProvider", "true"
+		   });
+		addAnnotation
+		  (getShaderBasedProjectedImageMeshTool_XDimension(),
+		   source,
+		   new String[] {
+			   "units", "m"
+		   });
+		addAnnotation
+		  (getShaderBasedProjectedImageMeshTool_YDimension(),
+		   source,
+		   new String[] {
+			   "units", "m"
+		   });
+		addAnnotation
+		  (variableShaderBasedProjectedImageMeshToolEClass,
+		   source,
+		   new String[] {
+			   "hasCustomClass", "true",
+			   "hasCustomItemProvider", "true"
+		   });
+		addAnnotation
 		  (cartesianTriangularMeshDerivedImageMapLayerEClass,
 		   source,
 		   new String[] {
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/ImageBasedShaderBasedMeshToolImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/ImageBasedShaderBasedMeshToolImpl.java
new file mode 100644
index 0000000..fc1afe6
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/ImageBasedShaderBasedMeshToolImpl.java
@@ -0,0 +1,190 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2020 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *      Pierre Allard - initial API and implementation    
+ *         
+ * SPDX-License-Identifier: EPL-1.0    
+ * *******************************************************************************
+ */
+package org.eclipse.apogy.core.environment.surface.impl;
+
+import org.eclipse.apogy.common.images.AbstractEImage;
+
+import org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage;
+import org.eclipse.apogy.core.environment.surface.ImageBasedShaderBasedMeshTool;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Image Based Shader Based Mesh Tool</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.ImageBasedShaderBasedMeshToolImpl#getImage <em>Image</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class ImageBasedShaderBasedMeshToolImpl extends ShaderBasedMeshToolCustomImpl implements ImageBasedShaderBasedMeshTool {
+	/**
+	 * The cached value of the '{@link #getImage() <em>Image</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getImage()
+	 * @generated
+	 * @ordered
+	 */
+	protected AbstractEImage image;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ImageBasedShaderBasedMeshToolImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ApogySurfaceEnvironmentPackage.Literals.IMAGE_BASED_SHADER_BASED_MESH_TOOL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public AbstractEImage getImage() {
+		return image;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetImage(AbstractEImage newImage, NotificationChain msgs) {
+		AbstractEImage oldImage = image;
+		image = newImage;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE, oldImage, newImage);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setImage(AbstractEImage newImage) {
+		if (newImage != image) {
+			NotificationChain msgs = null;
+			if (image != null)
+				msgs = ((InternalEObject)image).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ApogySurfaceEnvironmentPackage.IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE, null, msgs);
+			if (newImage != null)
+				msgs = ((InternalEObject)newImage).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ApogySurfaceEnvironmentPackage.IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE, null, msgs);
+			msgs = basicSetImage(newImage, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE, newImage, newImage));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ApogySurfaceEnvironmentPackage.IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE:
+				return basicSetImage(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ApogySurfaceEnvironmentPackage.IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE:
+				return getImage();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ApogySurfaceEnvironmentPackage.IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE:
+				setImage((AbstractEImage)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ApogySurfaceEnvironmentPackage.IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE:
+				setImage((AbstractEImage)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ApogySurfaceEnvironmentPackage.IMAGE_BASED_SHADER_BASED_MESH_TOOL__IMAGE:
+				return image != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ImageBasedShaderBasedMeshToolImpl
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/ShaderBasedProjectedImageMeshToolImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/ShaderBasedProjectedImageMeshToolImpl.java
new file mode 100644
index 0000000..a40bd50
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/ShaderBasedProjectedImageMeshToolImpl.java
@@ -0,0 +1,293 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2020 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *      Pierre Allard - initial API and implementation    
+ *         
+ * SPDX-License-Identifier: EPL-1.0    
+ * *******************************************************************************
+ */
+package org.eclipse.apogy.core.environment.surface.impl;
+
+import org.eclipse.apogy.common.emf.ui.ApogyCommonEMFUIFactory;
+import org.eclipse.apogy.common.emf.ui.ApogyCommonEMFUIPackage;
+
+import org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage;
+import org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.swt.graphics.RGBA;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Shader Based Projected Image Mesh Tool</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.ShaderBasedProjectedImageMeshToolImpl#getXDimension <em>XDimension</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.ShaderBasedProjectedImageMeshToolImpl#getYDimension <em>YDimension</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.ShaderBasedProjectedImageMeshToolImpl#getTransparentColor <em>Transparent Color</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class ShaderBasedProjectedImageMeshToolImpl extends ImageBasedShaderBasedMeshToolImpl implements ShaderBasedProjectedImageMeshTool {
+	/**
+	 * The default value of the '{@link #getXDimension() <em>XDimension</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getXDimension()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final float XDIMENSION_EDEFAULT = 1.0F;
+
+	/**
+	 * The cached value of the '{@link #getXDimension() <em>XDimension</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getXDimension()
+	 * @generated
+	 * @ordered
+	 */
+	protected float xDimension = XDIMENSION_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getYDimension() <em>YDimension</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getYDimension()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final float YDIMENSION_EDEFAULT = 1.0F;
+
+	/**
+	 * The cached value of the '{@link #getYDimension() <em>YDimension</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getYDimension()
+	 * @generated
+	 * @ordered
+	 */
+	protected float yDimension = YDIMENSION_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getTransparentColor() <em>Transparent Color</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTransparentColor()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final RGBA TRANSPARENT_COLOR_EDEFAULT = (RGBA)ApogyCommonEMFUIFactory.eINSTANCE.createFromString(ApogyCommonEMFUIPackage.eINSTANCE.getRGBA(), "255,255,255,255");
+
+	/**
+	 * The cached value of the '{@link #getTransparentColor() <em>Transparent Color</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getTransparentColor()
+	 * @generated
+	 * @ordered
+	 */
+	protected RGBA transparentColor = TRANSPARENT_COLOR_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ShaderBasedProjectedImageMeshToolImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ApogySurfaceEnvironmentPackage.Literals.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public float getXDimension() {
+		return xDimension;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setXDimension(float newXDimension) {
+		float oldXDimension = xDimension;
+		xDimension = newXDimension;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__XDIMENSION, oldXDimension, xDimension));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public float getYDimension() {
+		return yDimension;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setYDimension(float newYDimension) {
+		float oldYDimension = yDimension;
+		yDimension = newYDimension;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__YDIMENSION, oldYDimension, yDimension));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public RGBA getTransparentColor() {
+		return transparentColor;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setTransparentColor(RGBA newTransparentColor) {
+		RGBA oldTransparentColor = transparentColor;
+		transparentColor = newTransparentColor;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__TRANSPARENT_COLOR, oldTransparentColor, transparentColor));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__XDIMENSION:
+				return getXDimension();
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__YDIMENSION:
+				return getYDimension();
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__TRANSPARENT_COLOR:
+				return getTransparentColor();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__XDIMENSION:
+				setXDimension((Float)newValue);
+				return;
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__YDIMENSION:
+				setYDimension((Float)newValue);
+				return;
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__TRANSPARENT_COLOR:
+				setTransparentColor((RGBA)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__XDIMENSION:
+				setXDimension(XDIMENSION_EDEFAULT);
+				return;
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__YDIMENSION:
+				setYDimension(YDIMENSION_EDEFAULT);
+				return;
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__TRANSPARENT_COLOR:
+				setTransparentColor(TRANSPARENT_COLOR_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__XDIMENSION:
+				return xDimension != XDIMENSION_EDEFAULT;
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__YDIMENSION:
+				return yDimension != YDIMENSION_EDEFAULT;
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__TRANSPARENT_COLOR:
+				return TRANSPARENT_COLOR_EDEFAULT == null ? transparentColor != null : !TRANSPARENT_COLOR_EDEFAULT.equals(transparentColor);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuilder result = new StringBuilder(super.toString());
+		result.append(" (xDimension: ");
+		result.append(xDimension);
+		result.append(", yDimension: ");
+		result.append(yDimension);
+		result.append(", transparentColor: ");
+		result.append(transparentColor);
+		result.append(')');
+		return result.toString();
+	}
+
+} //ShaderBasedProjectedImageMeshToolImpl
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariableAngularDisplayMeshToolImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariableAngularDisplayMeshToolImpl.java
index 79b47e2..2fa102c 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariableAngularDisplayMeshToolImpl.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariableAngularDisplayMeshToolImpl.java
@@ -40,7 +40,9 @@
  * </p>
  * <ul>
  *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableAngularDisplayMeshToolImpl#getVariableFeatureReference <em>Variable Feature Reference</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableAngularDisplayMeshToolImpl#isUpdatePosition <em>Update Position</em>}</li>
  *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableAngularDisplayMeshToolImpl#getRelativePosition <em>Relative Position</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableAngularDisplayMeshToolImpl#isUpdateOrientation <em>Update Orientation</em>}</li>
  *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableAngularDisplayMeshToolImpl#getRelativeRotationMatrix <em>Relative Rotation Matrix</em>}</li>
  * </ul>
  *
@@ -58,6 +60,26 @@
 	protected VariableFeatureReference variableFeatureReference;
 
 	/**
+	 * The default value of the '{@link #isUpdatePosition() <em>Update Position</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdatePosition()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean UPDATE_POSITION_EDEFAULT = true;
+
+	/**
+	 * The cached value of the '{@link #isUpdatePosition() <em>Update Position</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdatePosition()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean updatePosition = UPDATE_POSITION_EDEFAULT;
+
+	/**
 	 * The cached value of the '{@link #getRelativePosition() <em>Relative Position</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -68,6 +90,26 @@
 	protected Tuple3d relativePosition;
 
 	/**
+	 * The default value of the '{@link #isUpdateOrientation() <em>Update Orientation</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdateOrientation()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean UPDATE_ORIENTATION_EDEFAULT = true;
+
+	/**
+	 * The cached value of the '{@link #isUpdateOrientation() <em>Update Orientation</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdateOrientation()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean updateOrientation = UPDATE_ORIENTATION_EDEFAULT;
+
+	/**
 	 * The cached value of the '{@link #getRelativeRotationMatrix() <em>Relative Rotation Matrix</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -147,6 +189,29 @@
 	 * @generated
 	 */
 	@Override
+	public boolean isUpdatePosition() {
+		return updatePosition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setUpdatePosition(boolean newUpdatePosition) {
+		boolean oldUpdatePosition = updatePosition;
+		updatePosition = newUpdatePosition;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_POSITION, oldUpdatePosition, updatePosition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Tuple3d getRelativePosition() {
 		return relativePosition;
 	}
@@ -192,6 +257,29 @@
 	 * @generated
 	 */
 	@Override
+	public boolean isUpdateOrientation() {
+		return updateOrientation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setUpdateOrientation(boolean newUpdateOrientation) {
+		boolean oldUpdateOrientation = updateOrientation;
+		updateOrientation = newUpdateOrientation;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_ORIENTATION, oldUpdateOrientation, updateOrientation));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Matrix3x3 getRelativeRotationMatrix() {
 		return relativeRotationMatrix;
 	}
@@ -259,8 +347,12 @@
 		switch (featureID) {
 			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__VARIABLE_FEATURE_REFERENCE:
 				return getVariableFeatureReference();
+			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_POSITION:
+				return isUpdatePosition();
 			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_POSITION:
 				return getRelativePosition();
+			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_ORIENTATION:
+				return isUpdateOrientation();
 			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
 				return getRelativeRotationMatrix();
 		}
@@ -278,9 +370,15 @@
 			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__VARIABLE_FEATURE_REFERENCE:
 				setVariableFeatureReference((VariableFeatureReference)newValue);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_POSITION:
+				setUpdatePosition((Boolean)newValue);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_POSITION:
 				setRelativePosition((Tuple3d)newValue);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_ORIENTATION:
+				setUpdateOrientation((Boolean)newValue);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
 				setRelativeRotationMatrix((Matrix3x3)newValue);
 				return;
@@ -299,9 +397,15 @@
 			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__VARIABLE_FEATURE_REFERENCE:
 				setVariableFeatureReference((VariableFeatureReference)null);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_POSITION:
+				setUpdatePosition(UPDATE_POSITION_EDEFAULT);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_POSITION:
 				setRelativePosition((Tuple3d)null);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_ORIENTATION:
+				setUpdateOrientation(UPDATE_ORIENTATION_EDEFAULT);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
 				setRelativeRotationMatrix((Matrix3x3)null);
 				return;
@@ -319,8 +423,12 @@
 		switch (featureID) {
 			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__VARIABLE_FEATURE_REFERENCE:
 				return variableFeatureReference != null;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_POSITION:
+				return updatePosition != UPDATE_POSITION_EDEFAULT;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_POSITION:
 				return relativePosition != null;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_ORIENTATION:
+				return updateOrientation != UPDATE_ORIENTATION_EDEFAULT;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
 				return relativeRotationMatrix != null;
 		}
@@ -337,7 +445,9 @@
 		if (baseClass == VariableBasedShaderBasedMeshTool.class) {
 			switch (derivedFeatureID) {
 				case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__VARIABLE_FEATURE_REFERENCE: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION;
 				case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_ORIENTATION: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION;
 				case ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_ROTATION_MATRIX: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX;
 				default: return -1;
 			}
@@ -355,7 +465,9 @@
 		if (baseClass == VariableBasedShaderBasedMeshTool.class) {
 			switch (baseFeatureID) {
 				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE: return ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__VARIABLE_FEATURE_REFERENCE;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_POSITION;
 				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_POSITION;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION: return ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__UPDATE_ORIENTATION;
 				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX: return ApogySurfaceEnvironmentPackage.VARIABLE_ANGULAR_DISPLAY_MESH_TOOL__RELATIVE_ROTATION_MATRIX;
 				default: return -1;
 			}
@@ -363,4 +475,22 @@
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuilder result = new StringBuilder(super.toString());
+		result.append(" (updatePosition: ");
+		result.append(updatePosition);
+		result.append(", updateOrientation: ");
+		result.append(updateOrientation);
+		result.append(')');
+		return result.toString();
+	}
+
 } //VariableAngularDisplayMeshToolImpl
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariableBasedShaderBasedMeshToolImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariableBasedShaderBasedMeshToolImpl.java
index 5e6a808..3c85a84 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariableBasedShaderBasedMeshToolImpl.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariableBasedShaderBasedMeshToolImpl.java
@@ -39,7 +39,9 @@
  * </p>
  * <ul>
  *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableBasedShaderBasedMeshToolImpl#getVariableFeatureReference <em>Variable Feature Reference</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableBasedShaderBasedMeshToolImpl#isUpdatePosition <em>Update Position</em>}</li>
  *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableBasedShaderBasedMeshToolImpl#getRelativePosition <em>Relative Position</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableBasedShaderBasedMeshToolImpl#isUpdateOrientation <em>Update Orientation</em>}</li>
  *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableBasedShaderBasedMeshToolImpl#getRelativeRotationMatrix <em>Relative Rotation Matrix</em>}</li>
  * </ul>
  *
@@ -57,6 +59,26 @@
 	protected VariableFeatureReference variableFeatureReference;
 
 	/**
+	 * The default value of the '{@link #isUpdatePosition() <em>Update Position</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdatePosition()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean UPDATE_POSITION_EDEFAULT = true;
+
+	/**
+	 * The cached value of the '{@link #isUpdatePosition() <em>Update Position</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdatePosition()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean updatePosition = UPDATE_POSITION_EDEFAULT;
+
+	/**
 	 * The cached value of the '{@link #getRelativePosition() <em>Relative Position</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -67,6 +89,26 @@
 	protected Tuple3d relativePosition;
 
 	/**
+	 * The default value of the '{@link #isUpdateOrientation() <em>Update Orientation</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdateOrientation()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean UPDATE_ORIENTATION_EDEFAULT = true;
+
+	/**
+	 * The cached value of the '{@link #isUpdateOrientation() <em>Update Orientation</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdateOrientation()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean updateOrientation = UPDATE_ORIENTATION_EDEFAULT;
+
+	/**
 	 * The cached value of the '{@link #getRelativeRotationMatrix() <em>Relative Rotation Matrix</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -146,6 +188,29 @@
 	 * @generated
 	 */
 	@Override
+	public boolean isUpdatePosition() {
+		return updatePosition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setUpdatePosition(boolean newUpdatePosition) {
+		boolean oldUpdatePosition = updatePosition;
+		updatePosition = newUpdatePosition;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION, oldUpdatePosition, updatePosition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Tuple3d getRelativePosition() {
 		return relativePosition;
 	}
@@ -191,6 +256,29 @@
 	 * @generated
 	 */
 	@Override
+	public boolean isUpdateOrientation() {
+		return updateOrientation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setUpdateOrientation(boolean newUpdateOrientation) {
+		boolean oldUpdateOrientation = updateOrientation;
+		updateOrientation = newUpdateOrientation;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION, oldUpdateOrientation, updateOrientation));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Matrix3x3 getRelativeRotationMatrix() {
 		return relativeRotationMatrix;
 	}
@@ -258,8 +346,12 @@
 		switch (featureID) {
 			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE:
 				return getVariableFeatureReference();
+			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION:
+				return isUpdatePosition();
 			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION:
 				return getRelativePosition();
+			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION:
+				return isUpdateOrientation();
 			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
 				return getRelativeRotationMatrix();
 		}
@@ -277,9 +369,15 @@
 			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE:
 				setVariableFeatureReference((VariableFeatureReference)newValue);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION:
+				setUpdatePosition((Boolean)newValue);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION:
 				setRelativePosition((Tuple3d)newValue);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION:
+				setUpdateOrientation((Boolean)newValue);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
 				setRelativeRotationMatrix((Matrix3x3)newValue);
 				return;
@@ -298,9 +396,15 @@
 			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE:
 				setVariableFeatureReference((VariableFeatureReference)null);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION:
+				setUpdatePosition(UPDATE_POSITION_EDEFAULT);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION:
 				setRelativePosition((Tuple3d)null);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION:
+				setUpdateOrientation(UPDATE_ORIENTATION_EDEFAULT);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
 				setRelativeRotationMatrix((Matrix3x3)null);
 				return;
@@ -318,12 +422,34 @@
 		switch (featureID) {
 			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE:
 				return variableFeatureReference != null;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION:
+				return updatePosition != UPDATE_POSITION_EDEFAULT;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION:
 				return relativePosition != null;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION:
+				return updateOrientation != UPDATE_ORIENTATION_EDEFAULT;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
 				return relativeRotationMatrix != null;
 		}
 		return super.eIsSet(featureID);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuilder result = new StringBuilder(super.toString());
+		result.append(" (updatePosition: ");
+		result.append(updatePosition);
+		result.append(", updateOrientation: ");
+		result.append(updateOrientation);
+		result.append(')');
+		return result.toString();
+	}
+
 } //VariableBasedShaderBasedMeshToolImpl
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariablePoseBullseyeToolImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariablePoseBullseyeToolImpl.java
index ae19ffd..0ebc8e5 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariablePoseBullseyeToolImpl.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariablePoseBullseyeToolImpl.java
@@ -40,7 +40,9 @@
  * </p>
  * <ul>
  *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariablePoseBullseyeToolImpl#getVariableFeatureReference <em>Variable Feature Reference</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariablePoseBullseyeToolImpl#isUpdatePosition <em>Update Position</em>}</li>
  *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariablePoseBullseyeToolImpl#getRelativePosition <em>Relative Position</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariablePoseBullseyeToolImpl#isUpdateOrientation <em>Update Orientation</em>}</li>
  *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariablePoseBullseyeToolImpl#getRelativeRotationMatrix <em>Relative Rotation Matrix</em>}</li>
  * </ul>
  *
@@ -58,6 +60,26 @@
 	protected VariableFeatureReference variableFeatureReference;
 
 	/**
+	 * The default value of the '{@link #isUpdatePosition() <em>Update Position</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdatePosition()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean UPDATE_POSITION_EDEFAULT = true;
+
+	/**
+	 * The cached value of the '{@link #isUpdatePosition() <em>Update Position</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdatePosition()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean updatePosition = UPDATE_POSITION_EDEFAULT;
+
+	/**
 	 * The cached value of the '{@link #getRelativePosition() <em>Relative Position</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -68,6 +90,26 @@
 	protected Tuple3d relativePosition;
 
 	/**
+	 * The default value of the '{@link #isUpdateOrientation() <em>Update Orientation</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdateOrientation()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean UPDATE_ORIENTATION_EDEFAULT = true;
+
+	/**
+	 * The cached value of the '{@link #isUpdateOrientation() <em>Update Orientation</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdateOrientation()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean updateOrientation = UPDATE_ORIENTATION_EDEFAULT;
+
+	/**
 	 * The cached value of the '{@link #getRelativeRotationMatrix() <em>Relative Rotation Matrix</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -147,6 +189,29 @@
 	 * @generated
 	 */
 	@Override
+	public boolean isUpdatePosition() {
+		return updatePosition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setUpdatePosition(boolean newUpdatePosition) {
+		boolean oldUpdatePosition = updatePosition;
+		updatePosition = newUpdatePosition;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_POSITION, oldUpdatePosition, updatePosition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Tuple3d getRelativePosition() {
 		return relativePosition;
 	}
@@ -192,6 +257,29 @@
 	 * @generated
 	 */
 	@Override
+	public boolean isUpdateOrientation() {
+		return updateOrientation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setUpdateOrientation(boolean newUpdateOrientation) {
+		boolean oldUpdateOrientation = updateOrientation;
+		updateOrientation = newUpdateOrientation;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_ORIENTATION, oldUpdateOrientation, updateOrientation));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Matrix3x3 getRelativeRotationMatrix() {
 		return relativeRotationMatrix;
 	}
@@ -259,8 +347,12 @@
 		switch (featureID) {
 			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__VARIABLE_FEATURE_REFERENCE:
 				return getVariableFeatureReference();
+			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_POSITION:
+				return isUpdatePosition();
 			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_POSITION:
 				return getRelativePosition();
+			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_ORIENTATION:
+				return isUpdateOrientation();
 			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_ROTATION_MATRIX:
 				return getRelativeRotationMatrix();
 		}
@@ -278,9 +370,15 @@
 			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__VARIABLE_FEATURE_REFERENCE:
 				setVariableFeatureReference((VariableFeatureReference)newValue);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_POSITION:
+				setUpdatePosition((Boolean)newValue);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_POSITION:
 				setRelativePosition((Tuple3d)newValue);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_ORIENTATION:
+				setUpdateOrientation((Boolean)newValue);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_ROTATION_MATRIX:
 				setRelativeRotationMatrix((Matrix3x3)newValue);
 				return;
@@ -299,9 +397,15 @@
 			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__VARIABLE_FEATURE_REFERENCE:
 				setVariableFeatureReference((VariableFeatureReference)null);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_POSITION:
+				setUpdatePosition(UPDATE_POSITION_EDEFAULT);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_POSITION:
 				setRelativePosition((Tuple3d)null);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_ORIENTATION:
+				setUpdateOrientation(UPDATE_ORIENTATION_EDEFAULT);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_ROTATION_MATRIX:
 				setRelativeRotationMatrix((Matrix3x3)null);
 				return;
@@ -319,8 +423,12 @@
 		switch (featureID) {
 			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__VARIABLE_FEATURE_REFERENCE:
 				return variableFeatureReference != null;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_POSITION:
+				return updatePosition != UPDATE_POSITION_EDEFAULT;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_POSITION:
 				return relativePosition != null;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_ORIENTATION:
+				return updateOrientation != UPDATE_ORIENTATION_EDEFAULT;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_ROTATION_MATRIX:
 				return relativeRotationMatrix != null;
 		}
@@ -337,7 +445,9 @@
 		if (baseClass == VariableBasedShaderBasedMeshTool.class) {
 			switch (derivedFeatureID) {
 				case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__VARIABLE_FEATURE_REFERENCE: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION;
 				case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_ORIENTATION: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION;
 				case ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_ROTATION_MATRIX: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX;
 				default: return -1;
 			}
@@ -355,7 +465,9 @@
 		if (baseClass == VariableBasedShaderBasedMeshTool.class) {
 			switch (baseFeatureID) {
 				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE: return ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__VARIABLE_FEATURE_REFERENCE;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_POSITION;
 				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_POSITION;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION: return ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__UPDATE_ORIENTATION;
 				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX: return ApogySurfaceEnvironmentPackage.VARIABLE_POSE_BULLSEYE_TOOL__RELATIVE_ROTATION_MATRIX;
 				default: return -1;
 			}
@@ -363,4 +475,22 @@
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuilder result = new StringBuilder(super.toString());
+		result.append(" (updatePosition: ");
+		result.append(updatePosition);
+		result.append(", updateOrientation: ");
+		result.append(updateOrientation);
+		result.append(')');
+		return result.toString();
+	}
+
 } //VariablePoseBullseyeToolImpl
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariableShaderBasedGridToolImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariableShaderBasedGridToolImpl.java
index f27b434..3ba0aaa 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariableShaderBasedGridToolImpl.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariableShaderBasedGridToolImpl.java
@@ -40,7 +40,9 @@
  * </p>
  * <ul>
  *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableShaderBasedGridToolImpl#getVariableFeatureReference <em>Variable Feature Reference</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableShaderBasedGridToolImpl#isUpdatePosition <em>Update Position</em>}</li>
  *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableShaderBasedGridToolImpl#getRelativePosition <em>Relative Position</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableShaderBasedGridToolImpl#isUpdateOrientation <em>Update Orientation</em>}</li>
  *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableShaderBasedGridToolImpl#getRelativeRotationMatrix <em>Relative Rotation Matrix</em>}</li>
  * </ul>
  *
@@ -58,6 +60,26 @@
 	protected VariableFeatureReference variableFeatureReference;
 
 	/**
+	 * The default value of the '{@link #isUpdatePosition() <em>Update Position</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdatePosition()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean UPDATE_POSITION_EDEFAULT = true;
+
+	/**
+	 * The cached value of the '{@link #isUpdatePosition() <em>Update Position</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdatePosition()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean updatePosition = UPDATE_POSITION_EDEFAULT;
+
+	/**
 	 * The cached value of the '{@link #getRelativePosition() <em>Relative Position</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -68,6 +90,26 @@
 	protected Tuple3d relativePosition;
 
 	/**
+	 * The default value of the '{@link #isUpdateOrientation() <em>Update Orientation</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdateOrientation()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean UPDATE_ORIENTATION_EDEFAULT = true;
+
+	/**
+	 * The cached value of the '{@link #isUpdateOrientation() <em>Update Orientation</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdateOrientation()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean updateOrientation = UPDATE_ORIENTATION_EDEFAULT;
+
+	/**
 	 * The cached value of the '{@link #getRelativeRotationMatrix() <em>Relative Rotation Matrix</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -147,6 +189,29 @@
 	 * @generated
 	 */
 	@Override
+	public boolean isUpdatePosition() {
+		return updatePosition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setUpdatePosition(boolean newUpdatePosition) {
+		boolean oldUpdatePosition = updatePosition;
+		updatePosition = newUpdatePosition;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_POSITION, oldUpdatePosition, updatePosition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Tuple3d getRelativePosition() {
 		return relativePosition;
 	}
@@ -192,6 +257,29 @@
 	 * @generated
 	 */
 	@Override
+	public boolean isUpdateOrientation() {
+		return updateOrientation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setUpdateOrientation(boolean newUpdateOrientation) {
+		boolean oldUpdateOrientation = updateOrientation;
+		updateOrientation = newUpdateOrientation;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_ORIENTATION, oldUpdateOrientation, updateOrientation));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Matrix3x3 getRelativeRotationMatrix() {
 		return relativeRotationMatrix;
 	}
@@ -259,8 +347,12 @@
 		switch (featureID) {
 			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__VARIABLE_FEATURE_REFERENCE:
 				return getVariableFeatureReference();
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_POSITION:
+				return isUpdatePosition();
 			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_POSITION:
 				return getRelativePosition();
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_ORIENTATION:
+				return isUpdateOrientation();
 			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_ROTATION_MATRIX:
 				return getRelativeRotationMatrix();
 		}
@@ -278,9 +370,15 @@
 			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__VARIABLE_FEATURE_REFERENCE:
 				setVariableFeatureReference((VariableFeatureReference)newValue);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_POSITION:
+				setUpdatePosition((Boolean)newValue);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_POSITION:
 				setRelativePosition((Tuple3d)newValue);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_ORIENTATION:
+				setUpdateOrientation((Boolean)newValue);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_ROTATION_MATRIX:
 				setRelativeRotationMatrix((Matrix3x3)newValue);
 				return;
@@ -299,9 +397,15 @@
 			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__VARIABLE_FEATURE_REFERENCE:
 				setVariableFeatureReference((VariableFeatureReference)null);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_POSITION:
+				setUpdatePosition(UPDATE_POSITION_EDEFAULT);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_POSITION:
 				setRelativePosition((Tuple3d)null);
 				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_ORIENTATION:
+				setUpdateOrientation(UPDATE_ORIENTATION_EDEFAULT);
+				return;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_ROTATION_MATRIX:
 				setRelativeRotationMatrix((Matrix3x3)null);
 				return;
@@ -319,8 +423,12 @@
 		switch (featureID) {
 			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__VARIABLE_FEATURE_REFERENCE:
 				return variableFeatureReference != null;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_POSITION:
+				return updatePosition != UPDATE_POSITION_EDEFAULT;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_POSITION:
 				return relativePosition != null;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_ORIENTATION:
+				return updateOrientation != UPDATE_ORIENTATION_EDEFAULT;
 			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_ROTATION_MATRIX:
 				return relativeRotationMatrix != null;
 		}
@@ -337,7 +445,9 @@
 		if (baseClass == VariableBasedShaderBasedMeshTool.class) {
 			switch (derivedFeatureID) {
 				case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__VARIABLE_FEATURE_REFERENCE: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION;
 				case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_ORIENTATION: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION;
 				case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_ROTATION_MATRIX: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX;
 				default: return -1;
 			}
@@ -355,7 +465,9 @@
 		if (baseClass == VariableBasedShaderBasedMeshTool.class) {
 			switch (baseFeatureID) {
 				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE: return ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__VARIABLE_FEATURE_REFERENCE;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_POSITION;
 				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_POSITION;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION: return ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__UPDATE_ORIENTATION;
 				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX: return ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_GRID_TOOL__RELATIVE_ROTATION_MATRIX;
 				default: return -1;
 			}
@@ -363,4 +475,22 @@
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
 	}
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuilder result = new StringBuilder(super.toString());
+		result.append(" (updatePosition: ");
+		result.append(updatePosition);
+		result.append(", updateOrientation: ");
+		result.append(updateOrientation);
+		result.append(')');
+		return result.toString();
+	}
+
 } //VariableShaderBasedGridToolImpl
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariableShaderBasedProjectedImageMeshToolImpl.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariableShaderBasedProjectedImageMeshToolImpl.java
new file mode 100644
index 0000000..408ad3a
--- /dev/null
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/impl/VariableShaderBasedProjectedImageMeshToolImpl.java
@@ -0,0 +1,496 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2020 Agence spatiale canadienne / Canadian Space Agency 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *      Pierre Allard - initial API and implementation    
+ *         
+ * SPDX-License-Identifier: EPL-1.0    
+ * *******************************************************************************
+ */
+package org.eclipse.apogy.core.environment.surface.impl;
+
+import org.eclipse.apogy.common.math.Matrix3x3;
+import org.eclipse.apogy.common.math.Tuple3d;
+
+import org.eclipse.apogy.core.environment.surface.ApogySurfaceEnvironmentPackage;
+import org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool;
+import org.eclipse.apogy.core.environment.surface.VariableShaderBasedProjectedImageMeshTool;
+
+import org.eclipse.apogy.core.invocator.VariableFeatureReference;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Variable Shader Based Projected Image Mesh Tool</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableShaderBasedProjectedImageMeshToolImpl#getVariableFeatureReference <em>Variable Feature Reference</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableShaderBasedProjectedImageMeshToolImpl#isUpdatePosition <em>Update Position</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableShaderBasedProjectedImageMeshToolImpl#getRelativePosition <em>Relative Position</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableShaderBasedProjectedImageMeshToolImpl#isUpdateOrientation <em>Update Orientation</em>}</li>
+ *   <li>{@link org.eclipse.apogy.core.environment.surface.impl.VariableShaderBasedProjectedImageMeshToolImpl#getRelativeRotationMatrix <em>Relative Rotation Matrix</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public abstract class VariableShaderBasedProjectedImageMeshToolImpl extends ShaderBasedProjectedImageMeshToolCustomImpl implements VariableShaderBasedProjectedImageMeshTool {
+	/**
+	 * The cached value of the '{@link #getVariableFeatureReference() <em>Variable Feature Reference</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getVariableFeatureReference()
+	 * @generated
+	 * @ordered
+	 */
+	protected VariableFeatureReference variableFeatureReference;
+
+	/**
+	 * The default value of the '{@link #isUpdatePosition() <em>Update Position</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdatePosition()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean UPDATE_POSITION_EDEFAULT = true;
+
+	/**
+	 * The cached value of the '{@link #isUpdatePosition() <em>Update Position</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdatePosition()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean updatePosition = UPDATE_POSITION_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getRelativePosition() <em>Relative Position</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRelativePosition()
+	 * @generated
+	 * @ordered
+	 */
+	protected Tuple3d relativePosition;
+
+	/**
+	 * The default value of the '{@link #isUpdateOrientation() <em>Update Orientation</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdateOrientation()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean UPDATE_ORIENTATION_EDEFAULT = true;
+
+	/**
+	 * The cached value of the '{@link #isUpdateOrientation() <em>Update Orientation</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpdateOrientation()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean updateOrientation = UPDATE_ORIENTATION_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getRelativeRotationMatrix() <em>Relative Rotation Matrix</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRelativeRotationMatrix()
+	 * @generated
+	 * @ordered
+	 */
+	protected Matrix3x3 relativeRotationMatrix;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected VariableShaderBasedProjectedImageMeshToolImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return ApogySurfaceEnvironmentPackage.Literals.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public VariableFeatureReference getVariableFeatureReference() {
+		return variableFeatureReference;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetVariableFeatureReference(VariableFeatureReference newVariableFeatureReference, NotificationChain msgs) {
+		VariableFeatureReference oldVariableFeatureReference = variableFeatureReference;
+		variableFeatureReference = newVariableFeatureReference;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__VARIABLE_FEATURE_REFERENCE, oldVariableFeatureReference, newVariableFeatureReference);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setVariableFeatureReference(VariableFeatureReference newVariableFeatureReference) {
+		if (newVariableFeatureReference != variableFeatureReference) {
+			NotificationChain msgs = null;
+			if (variableFeatureReference != null)
+				msgs = ((InternalEObject)variableFeatureReference).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__VARIABLE_FEATURE_REFERENCE, null, msgs);
+			if (newVariableFeatureReference != null)
+				msgs = ((InternalEObject)newVariableFeatureReference).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__VARIABLE_FEATURE_REFERENCE, null, msgs);
+			msgs = basicSetVariableFeatureReference(newVariableFeatureReference, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__VARIABLE_FEATURE_REFERENCE, newVariableFeatureReference, newVariableFeatureReference));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean isUpdatePosition() {
+		return updatePosition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setUpdatePosition(boolean newUpdatePosition) {
+		boolean oldUpdatePosition = updatePosition;
+		updatePosition = newUpdatePosition;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_POSITION, oldUpdatePosition, updatePosition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Tuple3d getRelativePosition() {
+		return relativePosition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetRelativePosition(Tuple3d newRelativePosition, NotificationChain msgs) {
+		Tuple3d oldRelativePosition = relativePosition;
+		relativePosition = newRelativePosition;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_POSITION, oldRelativePosition, newRelativePosition);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setRelativePosition(Tuple3d newRelativePosition) {
+		if (newRelativePosition != relativePosition) {
+			NotificationChain msgs = null;
+			if (relativePosition != null)
+				msgs = ((InternalEObject)relativePosition).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_POSITION, null, msgs);
+			if (newRelativePosition != null)
+				msgs = ((InternalEObject)newRelativePosition).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_POSITION, null, msgs);
+			msgs = basicSetRelativePosition(newRelativePosition, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_POSITION, newRelativePosition, newRelativePosition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean isUpdateOrientation() {
+		return updateOrientation;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setUpdateOrientation(boolean newUpdateOrientation) {
+		boolean oldUpdateOrientation = updateOrientation;
+		updateOrientation = newUpdateOrientation;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_ORIENTATION, oldUpdateOrientation, updateOrientation));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Matrix3x3 getRelativeRotationMatrix() {
+		return relativeRotationMatrix;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetRelativeRotationMatrix(Matrix3x3 newRelativeRotationMatrix, NotificationChain msgs) {
+		Matrix3x3 oldRelativeRotationMatrix = relativeRotationMatrix;
+		relativeRotationMatrix = newRelativeRotationMatrix;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_ROTATION_MATRIX, oldRelativeRotationMatrix, newRelativeRotationMatrix);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setRelativeRotationMatrix(Matrix3x3 newRelativeRotationMatrix) {
+		if (newRelativeRotationMatrix != relativeRotationMatrix) {
+			NotificationChain msgs = null;
+			if (relativeRotationMatrix != null)
+				msgs = ((InternalEObject)relativeRotationMatrix).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_ROTATION_MATRIX, null, msgs);
+			if (newRelativeRotationMatrix != null)
+				msgs = ((InternalEObject)newRelativeRotationMatrix).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_ROTATION_MATRIX, null, msgs);
+			msgs = basicSetRelativeRotationMatrix(newRelativeRotationMatrix, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_ROTATION_MATRIX, newRelativeRotationMatrix, newRelativeRotationMatrix));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__VARIABLE_FEATURE_REFERENCE:
+				return basicSetVariableFeatureReference(null, msgs);
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_POSITION:
+				return basicSetRelativePosition(null, msgs);
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
+				return basicSetRelativeRotationMatrix(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__VARIABLE_FEATURE_REFERENCE:
+				return getVariableFeatureReference();
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_POSITION:
+				return isUpdatePosition();
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_POSITION:
+				return getRelativePosition();
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_ORIENTATION:
+				return isUpdateOrientation();
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
+				return getRelativeRotationMatrix();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__VARIABLE_FEATURE_REFERENCE:
+				setVariableFeatureReference((VariableFeatureReference)newValue);
+				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_POSITION:
+				setUpdatePosition((Boolean)newValue);
+				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_POSITION:
+				setRelativePosition((Tuple3d)newValue);
+				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_ORIENTATION:
+				setUpdateOrientation((Boolean)newValue);
+				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
+				setRelativeRotationMatrix((Matrix3x3)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__VARIABLE_FEATURE_REFERENCE:
+				setVariableFeatureReference((VariableFeatureReference)null);
+				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_POSITION:
+				setUpdatePosition(UPDATE_POSITION_EDEFAULT);
+				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_POSITION:
+				setRelativePosition((Tuple3d)null);
+				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_ORIENTATION:
+				setUpdateOrientation(UPDATE_ORIENTATION_EDEFAULT);
+				return;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
+				setRelativeRotationMatrix((Matrix3x3)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__VARIABLE_FEATURE_REFERENCE:
+				return variableFeatureReference != null;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_POSITION:
+				return updatePosition != UPDATE_POSITION_EDEFAULT;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_POSITION:
+				return relativePosition != null;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_ORIENTATION:
+				return updateOrientation != UPDATE_ORIENTATION_EDEFAULT;
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_ROTATION_MATRIX:
+				return relativeRotationMatrix != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+		if (baseClass == VariableBasedShaderBasedMeshTool.class) {
+			switch (derivedFeatureID) {
+				case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__VARIABLE_FEATURE_REFERENCE: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_ORIENTATION: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_ROTATION_MATRIX: return ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX;
+				default: return -1;
+			}
+		}
+		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+		if (baseClass == VariableBasedShaderBasedMeshTool.class) {
+			switch (baseFeatureID) {
+				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__VARIABLE_FEATURE_REFERENCE: return ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__VARIABLE_FEATURE_REFERENCE;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_POSITION;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_POSITION: return ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_POSITION;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__UPDATE_ORIENTATION: return ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__UPDATE_ORIENTATION;
+				case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL__RELATIVE_ROTATION_MATRIX: return ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL__RELATIVE_ROTATION_MATRIX;
+				default: return -1;
+			}
+		}
+		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuilder result = new StringBuilder(super.toString());
+		result.append(" (updatePosition: ");
+		result.append(updatePosition);
+		result.append(", updateOrientation: ");
+		result.append(updateOrientation);
+		result.append(')');
+		return result.toString();
+	}
+
+} //VariableShaderBasedProjectedImageMeshToolImpl
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/util/ApogySurfaceEnvironmentAdapterFactory.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/util/ApogySurfaceEnvironmentAdapterFactory.java
index 14181bc..743a3de 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/util/ApogySurfaceEnvironmentAdapterFactory.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/util/ApogySurfaceEnvironmentAdapterFactory.java
@@ -170,6 +170,10 @@
 				return createShaderBasedMeshToolAdapter();
 			}
 			@Override
+			public Adapter caseImageBasedShaderBasedMeshTool(ImageBasedShaderBasedMeshTool object) {
+				return createImageBasedShaderBasedMeshToolAdapter();
+			}
+			@Override
 			public Adapter caseVariableBasedShaderBasedMeshTool(VariableBasedShaderBasedMeshTool object) {
 				return createVariableBasedShaderBasedMeshToolAdapter();
 			}
@@ -206,6 +210,14 @@
 				return createVariableAngularDisplayMeshToolAdapter();
 			}
 			@Override
+			public Adapter caseShaderBasedProjectedImageMeshTool(ShaderBasedProjectedImageMeshTool object) {
+				return createShaderBasedProjectedImageMeshToolAdapter();
+			}
+			@Override
+			public Adapter caseVariableShaderBasedProjectedImageMeshTool(VariableShaderBasedProjectedImageMeshTool object) {
+				return createVariableShaderBasedProjectedImageMeshToolAdapter();
+			}
+			@Override
 			public Adapter caseCartesianTriangularMeshDerivedImageMapLayer(CartesianTriangularMeshDerivedImageMapLayer object) {
 				return createCartesianTriangularMeshDerivedImageMapLayerAdapter();
 			}
@@ -626,6 +638,20 @@
 	}
 
 	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.apogy.core.environment.surface.ImageBasedShaderBasedMeshTool <em>Image Based Shader Based Mesh Tool</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.apogy.core.environment.surface.ImageBasedShaderBasedMeshTool
+	 * @generated
+	 */
+	public Adapter createImageBasedShaderBasedMeshToolAdapter() {
+		return null;
+	}
+
+	/**
 	 * Creates a new adapter for an object of class '{@link org.eclipse.apogy.core.environment.surface.VariableBasedShaderBasedMeshTool <em>Variable Based Shader Based Mesh Tool</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
@@ -752,6 +778,34 @@
 	}
 
 	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool <em>Shader Based Projected Image Mesh Tool</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.apogy.core.environment.surface.ShaderBasedProjectedImageMeshTool
+	 * @generated
+	 */
+	public Adapter createShaderBasedProjectedImageMeshToolAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.apogy.core.environment.surface.VariableShaderBasedProjectedImageMeshTool <em>Variable Shader Based Projected Image Mesh Tool</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.apogy.core.environment.surface.VariableShaderBasedProjectedImageMeshTool
+	 * @generated
+	 */
+	public Adapter createVariableShaderBasedProjectedImageMeshToolAdapter() {
+		return null;
+	}
+
+	/**
 	 * Creates a new adapter for an object of class '{@link org.eclipse.apogy.core.environment.surface.CartesianTriangularMeshDerivedImageMapLayer <em>Cartesian Triangular Mesh Derived Image Map Layer</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
diff --git a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/util/ApogySurfaceEnvironmentSwitch.java b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/util/ApogySurfaceEnvironmentSwitch.java
index 342340a..b39df50 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/util/ApogySurfaceEnvironmentSwitch.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.surface/src-gen/org/eclipse/apogy/core/environment/surface/util/ApogySurfaceEnvironmentSwitch.java
@@ -270,6 +270,18 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case ApogySurfaceEnvironmentPackage.IMAGE_BASED_SHADER_BASED_MESH_TOOL: {
+				ImageBasedShaderBasedMeshTool imageBasedShaderBasedMeshTool = (ImageBasedShaderBasedMeshTool)theEObject;
+				T result = caseImageBasedShaderBasedMeshTool(imageBasedShaderBasedMeshTool);
+				if (result == null) result = caseShaderBasedMeshTool(imageBasedShaderBasedMeshTool);
+				if (result == null) result = caseNamedDescribedElement(imageBasedShaderBasedMeshTool);
+				if (result == null) result = caseStartable(imageBasedShaderBasedMeshTool);
+				if (result == null) result = caseDisposable(imageBasedShaderBasedMeshTool);
+				if (result == null) result = caseNamed(imageBasedShaderBasedMeshTool);
+				if (result == null) result = caseDescribed(imageBasedShaderBasedMeshTool);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			case ApogySurfaceEnvironmentPackage.VARIABLE_BASED_SHADER_BASED_MESH_TOOL: {
 				VariableBasedShaderBasedMeshTool variableBasedShaderBasedMeshTool = (VariableBasedShaderBasedMeshTool)theEObject;
 				T result = caseVariableBasedShaderBasedMeshTool(variableBasedShaderBasedMeshTool);
@@ -379,6 +391,34 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case ApogySurfaceEnvironmentPackage.SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL: {
+				ShaderBasedProjectedImageMeshTool shaderBasedProjectedImageMeshTool = (ShaderBasedProjectedImageMeshTool)theEObject;
+				T result = caseShaderBasedProjectedImageMeshTool(shaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseImageBasedShaderBasedMeshTool(shaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseShaderBasedMeshTool(shaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseNamedDescribedElement(shaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseStartable(shaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseDisposable(shaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseNamed(shaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseDescribed(shaderBasedProjectedImageMeshTool);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case ApogySurfaceEnvironmentPackage.VARIABLE_SHADER_BASED_PROJECTED_IMAGE_MESH_TOOL: {
+				VariableShaderBasedProjectedImageMeshTool variableShaderBasedProjectedImageMeshTool = (VariableShaderBasedProjectedImageMeshTool)theEObject;
+				T result = caseVariableShaderBasedProjectedImageMeshTool(variableShaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseShaderBasedProjectedImageMeshTool(variableShaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseVariableBasedShaderBasedMeshTool(variableShaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseImageBasedShaderBasedMeshTool(variableShaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseShaderBasedMeshTool(variableShaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseNamedDescribedElement(variableShaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseStartable(variableShaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseDisposable(variableShaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseNamed(variableShaderBasedProjectedImageMeshTool);
+				if (result == null) result = caseDescribed(variableShaderBasedProjectedImageMeshTool);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			case ApogySurfaceEnvironmentPackage.CARTESIAN_TRIANGULAR_MESH_DERIVED_IMAGE_MAP_LAYER: {
 				CartesianTriangularMeshDerivedImageMapLayer cartesianTriangularMeshDerivedImageMapLayer = (CartesianTriangularMeshDerivedImageMapLayer)theEObject;
 				T result = caseCartesianTriangularMeshDerivedImageMapLayer(cartesianTriangularMeshDerivedImageMapLayer);
@@ -932,6 +972,21 @@
 	}
 
 	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Image Based Shader Based Mesh Tool</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Image Based Shader Based Mesh Tool</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseImageBasedShaderBasedMeshTool(ImageBasedShaderBasedMeshTool object) {
+		return null;
+	}
+
+	/**
 	 * Returns the result of interpreting the object as an instance of '<em>Variable Based Shader Based Mesh Tool</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
@@ -1067,6 +1122,36 @@
 	}
 
 	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Shader Based Projected Image Mesh Tool</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Shader Based Projected Image Mesh Tool</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseShaderBasedProjectedImageMeshTool(ShaderBasedProjectedImageMeshTool object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Variable Shader Based Projected Image Mesh Tool</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Variable Shader Based Projected Image Mesh Tool</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseVariableShaderBasedProjectedImageMeshTool(VariableShaderBasedProjectedImageMeshTool object) {
+		return null;
+	}
+
+	/**
 	 * Returns the result of interpreting the object as an instance of '<em>Cartesian Triangular Mesh Derived Image Map Layer</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;