package wonderlab.graphics.renderer;

import wonderlab.graphics.geometry.*;
import wonderlab.graphics.camera.*;
import wonderlab.graphics.world.*;
import java.util.ArrayList;
import java.util.Iterator;

public class Phong {

	World3D world;
	ArrayList lights;
	Vector3D [] specular_factor_array;
	Vector3D eye;	
	public Phong(World3D w) {
		world = w;
		lights = world.lights();
		reset();
	}
	
	public void reset() {
		//eye = new Vector3D(world.camera().pos());
		//eye.set(3,0);															// ensure the homogenous coordinate is zero, so it is really a normal vector
		eye = new Vector3D(0,0,1,0);
		specular_factor_array = new Vector3D[lights.size()];
		for (int i = 0; i < lights.size(); i++) {
			specular_factor_array[i] = new Vector3D(eye);
//			((Vector3D)specular_factor_array[i]).print();
			((Vector3D)specular_factor_array[i]).add(((Light)lights.get(i)).pos());
			((Light)lights.get(i)).pos().print();
			((Vector3D)specular_factor_array[i]).normalize();
//			((Vector3D)specular_factor_array[i]).print();
		}
	}
	
	public void shade(Vertex v) {
		Vector3D finalColor = new Vector3D(v.material().ambientColor());
//		Vector3D specular_sum = new Vector3D(4);
		Vector3D diffuse_sum = new Vector3D(4);
		Vector3D lightPos = new Vector3D(4);
		Vector3D lightColor = new Vector3D(4);
		for (int i = 0; i < lights.size(); i++) {
			lightPos.copy(((Light)lights.get(i)).pos());
			lightColor.copy(((Light)lights.get(i)).color());
			diffuse_sum.add(lightColor.scaleBy(Math.max(lightPos.dot(v.normal()),0)));
			lightColor.copy(((Light)lights.get(i)).color());
//			specular_sum.add(lightColor.scaleBy(Math.pow(Math.max(specular_factor_array[i].dot(v.normal()),0),v.material().specularP())));
		}
//		specular_sum.componentMultiply(v.material().specularColor());
// 		specular_sum.print();
		diffuse_sum.componentMultiply(v.material().diffuseColor());
		finalColor.add(diffuse_sum);
//		finalColor.add(specular_sum);
		v.setColor(finalColor);
	}
}