Package engine

Source Code of engine.EventHandler

package engine;

import java.util.List;

import org.lwjgl.input.Mouse;

import com.threed.jpct.FrameBuffer;
import com.threed.jpct.Interact2D;
import com.threed.jpct.SimpleVector;
import com.threed.jpct.World;

public class EventHandler {
  private World world;
  private FrameBuffer buffer;
  private Universe universe;
  private List<Planet> planets;
 
  private Planet selectedPlanet;
  private Planet focusedPlanet;
 
  private int srcDragId = -1;

  public EventHandler(World w, FrameBuffer b, Universe universe) {
    world = w;
    buffer = b;
    this.universe = universe;
    this.planets = universe.getPlanets();
  }

  public void handle() {
    //handleKeys();
    for(Planet planet: planets){
      if(checkVisible(planet))
        planet.onVisible();
      else
        planet.onInvisible();
    }
    checkSelectionAndFocus(planets);
    checkDragBetweenObjects();
    checkArgessivitnessChange();
  }

  private boolean checkVisible(Planet planet) {
    // TODO: Can be simply optimized by determination of a direction vector
    // that goes from center of the camera to center of the planet.
    // Next, this vector should be passed to pickPoligon method instead of
    // return value from reproject2D3D.
    SimpleVector planetProjection = Interact2D.projectCenter3D2D(
        world.getCamera(), buffer, planet.getBoundingSphere());

    if (planetProjection != null) {
      if (planet.getBoundingSphere().getID() == Interact2D.getObjectID(Interact2D.pickPolygon(
          world.getVisibilityList(), Interact2D.reproject2D3D(world.getCamera(), buffer,(int) planetProjection.x, (int) planetProjection.y))))
        return true;
    }
    return false;
  }
 
  private void checkSelectionAndFocus(List<Planet> planets){
    SimpleVector mouse3DPos = Interact2D.reproject2D3D(world.getCamera(), buffer, Mouse.getX(), Mouse.getY());
    mouse3DPos.y = -mouse3DPos.y;
    int focusedObjectID = Interact2D.getObjectID(Interact2D.pickPolygon(world.getVisibilityList(), mouse3DPos));
    if(focusedObjectID != -1){
      if(focusedPlanet == null || focusedObjectID != focusedPlanet.getBoundingSphere().getID()){
        for(Planet planet : planets){
          if(planet.getBoundingSphere().getID() == focusedObjectID){
            checkPlanetFocus(planet);
            checkPlanetSelect(planet);
          }
        }
      }
      else{
        checkPlanetSelect(focusedPlanet);
      }
    }
    else{
      if(focusedPlanet != null){
        focusedPlanet.onFocusLoss();
        focusedPlanet = null;
      }
    }
  }

  private void checkPlanetFocus(Planet planet){
    if(focusedPlanet != null){
      focusedPlanet.onFocusLoss();
    }
    focusedPlanet = planet; 
    planet.onFocus()
  }

  private void checkPlanetSelect(Planet planet){
    if(Mouse.isButtonDown(0)){
      if(selectedPlanet != null){
        selectedPlanet.onRelease();
      }
      selectedPlanet = planet;
      planet.onSelect();
    }
  }
 
  private void checkDragBetweenObjects(){
    if(Mouse.isButtonDown(0) && srcDragId == -1){
      srcDragId = getFocusedObjectId();
    }
    if(!Mouse.isButtonDown(0)){
      if(srcDragId != -1){
        int objectId = getFocusedObjectId();
        if(objectId == srcDragId || objectId == -1){
          srcDragId = -1;
        } else {
          raiseDragBetweenPlanetsEvent(srcDragId, objectId);
          srcDragId = -1;
        }
      }
    }
  }
 
  private void raiseDragBetweenPlanetsEvent(int srcDragId, int destDragId){
    Planet srcPlanet = null, destPlanet = null;
    for(Planet planet : planets){
      if(planet.getBoundingSphere().getID() == srcDragId)
        srcPlanet = planet;
      else if(planet.getBoundingSphere().getID() == destDragId)
        destPlanet = planet;
    }
   
    if(srcPlanet != null && destPlanet != null)
      universe.onDragBetweenPlanets(srcPlanet, destPlanet);
  }
 
  private int getFocusedObjectId(){
    SimpleVector mouse3DPos = Interact2D.reproject2D3D(world.getCamera(), buffer, Mouse.getX(), Mouse.getY());
    mouse3DPos.y = -mouse3DPos.y;
    return Interact2D.getObjectID(Interact2D.pickPolygon(world.getVisibilityList(), mouse3DPos));
  }
 
  private void checkArgessivitnessChange(){
    if(Keyboard.KEY_1)
      universe.onAggressivnessChange(0.1f);
    else if(Keyboard.KEY_2)
      universe.onAggressivnessChange(0.2f);
    else if(Keyboard.KEY_3)
      universe.onAggressivnessChange(0.3f);
    else if(Keyboard.KEY_4)
      universe.onAggressivnessChange(0.4f);
    else if(Keyboard.KEY_5)
      universe.onAggressivnessChange(0.5f);
    else if(Keyboard.KEY_6)
      universe.onAggressivnessChange(0.6f);
    else if(Keyboard.KEY_7)
      universe.onAggressivnessChange(0.7f);
    else if(Keyboard.KEY_8)
      universe.onAggressivnessChange(0.8f);
    else if(Keyboard.KEY_9)
      universe.onAggressivnessChange(0.9f);
    else if(Keyboard.KEY_0)
      universe.onAggressivnessChange(1.0f);
  }
}
TOP

Related Classes of engine.EventHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.