
package Graphics;

import java.lang.*;
import java.awt.*;


public class Scene
{
  private static final int MAX_OBJECTS = 100;
  private Object objects[] = new Object[MAX_OBJECTS];
  private int nr_objects;

     // camera stuff 

     public Vector cameraLocation=new Vector();

  public Vector cameraLookat=new Vector();
  public Vector cameraDir=new Vector();

    //____For sorting the objects
    double distance[]=new double[500];
    int number[]=new int[500];

    //________Lighting stuff
  public Object lights[]=new Object[10];
    Light newlights[]=new Light[10];
  public int nr_lights;
  Vector ambient_light=new Vector(0.5,0.2,0.3);
  boolean ambient_enabled=true;
  boolean diffuse_enabled=true;
  boolean specular_enabled=true;
  boolean lights_enabled=true;
  boolean attenuation=false;
  double k_a=0.5, k_d=0.7,k_s=0.7,n_s=5;
  int wireframe=16;

  //____Animation paraneters
  int totalframes;


  public Scene()
  {
    nr_objects = 0;
  }  // constructor


  
    public Vector lighted_colour(Vector position, Vector normal, 
				Vector viewer_pos, Vector colour)
  {
    Vector result;
    if (ambient_enabled)
    {
      result = ambient_light.multiplied_by(k_a);
     result = new Vector(result.get_x() * colour.get_x(),
			       result.get_y() * colour.get_y(),
			       result.get_z() * colour.get_z());

      }

          else
      result = new Vector();

      if(lights_enabled==false)     //___ return if just ambient light
        return result;

    for(int i=0; i<nr_lights; i++) {

   /* Light newlight=new Light(lights[i].light.position,lights[i].light.colour);
    


    
    newlight.position=objects[i].anim_transform.vec_postmultiply(newlight.position);     // apply anim transform

    */

      if (diffuse_enabled)
    
  	result = result.add(
    newlights[i].diffuse_contribution(position, normal, colour, k_d, attenuation));
      if (specular_enabled)

	result = result.add(
  newlights[i].specular_contribution(position, normal, viewer_pos,
					  colour, k_s, n_s, attenuation));
    }  // for all lights

    result.clamp(0, 1);
    return result;
  }  // lighted_colour

  
  
  
  public void add_object(Object obj)
  {
    objects[nr_objects] = obj;
    nr_objects++;
  }  // add_object
  


  public int get_nr_objects()
  {
    return nr_objects;
  }  // get_nr_objects



  public Object get_object(int index)
  {
    return objects[index];
  }  // get_object



  public void set_object(int index, Object obj)
  {
    objects[index] = obj;
  }  // set_object


  public void clear_scene()
  {
    int i=0;
    for(i=0;i<nr_objects;i++)
    {
      objects[i]=null;
    }

      nr_objects=0;
      nr_lights=0;
      

  }

  public void sort(Vector cl)
  {
       //___sort the objects___


       int i,j;
    for(i=0;i<get_nr_objects();i++)
    {
        distance[i]=(cl.subtract(get_object(i).return_center())).length();
        number[i]=i;
    }

    //___Insertion sort

 
      double v;
      int v1;
     for(i=1;i<get_nr_objects();i++)
    {

        v=distance[i];j=i;
        v1=number[i];
        while(distance[j-1]<v)
        {
          distance[j]=distance[j-1];
          number[j]=number[j-1];
          j--;
          if(j<=0)
            break;
        }

        distance[j]=v;
        number[j]=v1;

    }

  }


}  // Scene class
  
