/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * 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:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.swt.opengl.examples;


import org.eclipse.opengl.*;
import org.eclipse.swt.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

class StencilTab extends OpenGLTab {
	private abstract class Shape {
		private String name;
		/**
		 * Constructor
		 * 
		 * @param name the shape's name
		 */
		Shape(String name) {
			super();
			this.name = name;
		}
		/**
		 * Draws this shape.
		 */
		abstract void draw();
		/**
		 * Returns the name.
		 * 
		 * @return String
		 */
		String getName() {
			return name;
		}
	}

	private Shape[] shapes = new Shape[5];
	private Shape currentShape;
	private float xPos = 0, yPos = 0;
	private float size = 0.45f;
	private int texture;
	private int quadratic;
	private final static String IMAGE = "images/splash.bmp";
	private final static int SLEEP_LENGTH = 50;

	/**
	 * @see OpenGLTab#createControls(Composite)
	 */
	void createControls(Composite composite) {
		Composite controls = new Composite(composite, SWT.NONE);
		GridLayout layout = new GridLayout(2, false);
		layout.marginHeight = 0;
		layout.marginWidth = 0;
		controls.setLayout(layout);
		new Label(controls, SWT.NONE).setText("Object:");
		final Combo shapeCombo = new Combo(controls, SWT.READ_ONLY);
		for (int i = 0; i < shapes.length; i++) {
			shapeCombo.add(shapes[i].getName());
		}
		shapeCombo.select(0);
		shapeCombo.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event e) {
				currentShape = shapes[shapeCombo.getSelectionIndex()];
			}
		});

		new Label(composite, SWT.NONE).setText("Size:");
		final Slider sizeSlider = new Slider(composite, SWT.HORIZONTAL);
		sizeSlider.setValues(0, 15, 75, 5, 5, 10);
		sizeSlider.setSelection(45);
		sizeSlider.addListener(SWT.Selection, new Listener() {
			public void handleEvent(Event e) {
				size = ((float) sizeSlider.getSelection()) / 100;
			}
		});
	}

	/**
	 * @see OpenGLTab#dispose()
	 */
	void dispose() {
		super.dispose();
		GLU.gluDeleteQuadric(quadratic);
	}

	/**
	 * @see OpenGLTab#getSleepLength()
	 */
	int getSleepLength() {
		return SLEEP_LENGTH;
	}
	
	/**
	 * @see OpenGLTab#getTabText()
	 */
	String getTabText() {
		return "Stencil";
	}

	/**
	 * @see OpenGLTab#init()
	 */
	void init() {
		if (!hasStencilSupport()) return;
		
		GL.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
		GL.glClearDepth(1.0f);
		int[] textureOut = new int[1];
		GL.glGenTextures(1, textureOut);
		loadTexture(getGlCanvas(), IMAGE, 0, textureOut);
		this.texture = textureOut[0];
		quadratic = GLU.gluNewQuadric();
		GLU.gluQuadricNormals(quadratic, GLU.GLU_SMOOTH);
		GL.glDepthFunc(GL.GL_LEQUAL);
		GL.glEnable(GL.GL_STENCIL_TEST);
		GL.glEnable(GL.GL_TEXTURE_2D);
		GL.glEnable(GL.GL_DEPTH_TEST);
		// create shapes
		shapes[0] = new Shape("Triangle") {
			public void draw() {
				GL.glBegin(GL.GL_TRIANGLES);
				GL.glVertex3f(0.0f, size, 0.0f);
				GL.glVertex3f(-size, -size, 0.0f);
				GL.glVertex3f(size, -size, 0.0f);
				GL.glEnd();
			}
		};

		shapes[1] = new Shape("Disk") {
			public void draw() {
				GLU.gluDisk(quadratic, 0.0f, size, 32, 32);
			}
		};

		shapes[2] = new Shape("Square") {
			public void draw() {
				GL.glRectf(-size, -size, size, size);
			}
		};

		shapes[3] = new Shape("Hour Glass") {
			public void draw() {
				GL.glBegin(GL.GL_TRIANGLES);
				GL.glVertex3f(0.0f, size, 0.0f);
				GL.glVertex3f(-size, -size, 0.0f);
				GL.glVertex3f(size, -size, 0.0f);
				GL.glVertex3f(0.0f, -size, 0.0f);
				GL.glVertex3f(size, size, 0.0f);
				GL.glVertex3f(-size, size, 0.0f);
				GL.glEnd();
			}
		};

		shapes[4] = new Shape("Star") {
			public void draw() {
				GL.glBegin(GL.GL_TRIANGLES);
				GL.glVertex3f(-0.3f, 0, 0.0f);
				GL.glVertex3f(2 * size - 0.3f, 0, 0.0f);
				GL.glVertex3f(size - 0.3f, 2 * size * 0.85f, 0.0f);
				GL.glVertex3f(2 * size - 0.3f, size, 0.0f);
				GL.glVertex3f(0 - 0.3f, size, 0.0f);
				GL.glVertex3f(size - 0.3f, -size * 0.85f, 0.0f);
				GL.glEnd();
			}
		};

		currentShape = shapes[0];
	}

	/**
	 * @see OpenGLTab#isStencilSupportNeeded
	 */
	boolean isStencilSupportNeeded() {
		return true;
	}

	/**
	 * @see OpenGLTab#renderScene()
	 */
	void renderScene() {
		GL.glClear(
			GL.GL_COLOR_BUFFER_BIT
				| GL.GL_DEPTH_BUFFER_BIT
				| GL.GL_STENCIL_BUFFER_BIT);

		GL.glLoadIdentity();
		GL.glTranslatef(
			(float) (1.5 * Math.cos(xPos)),
			(float) (1.0 * Math.sin(yPos)),
			-3.0f);
		xPos += 0.15f;
		yPos += 0.3f;

		GL.glColorMask(false, false, false, false);
		GL.glStencilFunc(GL.GL_ALWAYS, 1, 1);
		GL.glStencilOp(GL.GL_KEEP, GL.GL_KEEP, GL.GL_REPLACE);
		GL.glDisable(GL.GL_DEPTH_TEST);
		GL.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

		currentShape.draw();

		GL.glEnable(GL.GL_DEPTH_TEST);
		GL.glColorMask(true, true, true, true);
		GL.glStencilFunc(GL.GL_EQUAL, 1, 1);
		GL.glStencilOp(GL.GL_KEEP, GL.GL_KEEP, GL.GL_KEEP);

		GL.glLoadIdentity();
		// load the texture behind the stencil object
		GL.glTranslatef(0.0f, 0.0f, -3.1f);
		GL.glBindTexture(GL.GL_TEXTURE_2D, texture);
		GL.glBegin(GL.GL_QUADS);
		GL.glTexCoord2f(0.0f, 0.0f);
		GL.glVertex3f(-0.85f, -0.85f, 1.0f);
		GL.glTexCoord2f(1.0f, 0.0f);
		GL.glVertex3f(0.85f, -0.85f, 1.0f);
		GL.glTexCoord2f(1.0f, 1.0f);
		GL.glVertex3f(0.85f, 0.85f, 1.0f);
		GL.glTexCoord2f(0.0f, 1.0f);
		GL.glVertex3f(-0.85f, 0.85f, 1.0f);
		GL.glEnd();
	}
}
