doors { name: "Red Puzzles" type: LOCATION_ONLY panels { room: "Main Area" name: "SUN" } panels { room: "Main Area" name: "KOI" } panels { room: "Main Area" name: "SUN KOI" } location_room: "Main Area" } doors { name: "Yellow Puzzles" type: LOCATION_ONLY panels { room: "Main Area" name: "CHOP" } panels { room: "Main Area" name: "YOU" } panels { room: "Main Area" name: "PLOT" } panels { room: "Main Area" name: "CHOP YOU PLOT" } location_room: "Main Area" } doors { name: "Green Puzzles" type: LOCATION_ONLY panels { room: "Main Area" name: "OUT" } panels { room: "Main Area" name: "SEW" } panels { room: "Main Area" name: "NEAR" } panels { room: "Main Area" name: "OUT SEW NEAR" } location_room: "Main Area" } doors { name: "Orange Puzzles" type: LOCATION_ONLY panels { room: "Main Area" name: "SHINE" } panels { room: "Main Area" name: "CURTSY" } panels { room: "Main Area" name: "SHINE CURTSY" } location_room: "Main Area" } doors { name: "Brown Puzzles" type: LOCATION_ONLY panels { room: "Main Area" name: "NEW" } panels { room: "Main Area" name: "DOLLARS" } panels { room: "Main Area" name: "NEW DOLLARS" } location_room: "Main Area" } doors { name: "Gray Puzzles" type: LOCATION_ONLY panels { room: "Main Area" name: "FOUR" } panels { room: "Main Area" name: "CAUGHT" } panels { room: "Main Area" name: "NET" } panels { room: "Main Area" name: "FOUR CAUGHT NET" } location_room: "Main Area" } doors { name: "Purple Puzzles" type: LOCATION_ONLY panels { room: "Main Area" name: "GREEN" } panels { room: "Main Area" name: "THINK" } panels { room: "Main Area" name: "LION" } panels { room: "Main Area" name: "GREEN THINK LION" } location_room: "Main Area" } doors { name: "Blue Puzzles" type: LOCATION_ONLY panels { room: "Main Area" name: "MOON" } panels { room: "Main Area" name: "POWER" } panels { room: "Main Area" name: "MOON POWER" } location_room: "Main Area" } doors { name: "Control Center Entrance" type: ITEM_ONLY receivers: "Components/Doors/entry_3" panels { room: "Main Area" name: "SUN" } panels { room: "Main Area" name: "KOI" } panels { room: "Main Area" name: "SUN KOI" } panels { room: "Main Area" name: "CHOP" } panels { room: "Main Area" name: "YOU" } panels { room: "Main Area" name: "PLOT" } panels { room: "Main Area" name: "CHOP YOU PLOT" } panels { room: "Main Area" name: "OUT" } panels { room: "Main Area" name: "SEW" } panels { room: "Main Area" name: "NEAR" } panels { room: "Main Area" name: "OUT SEW NEAR" } panels { room: "Main Area" name: "SHINE" } panels { room: "Main Area" name: "CURTSY" } panels { room: "Main Area" name: "SHINE CURTSY" } panels { room: "Main Area" name: "NEW" } panels { room: "Main Area" name: "DOLLARS" } panels { room: "Main Area" name: "NEW DOLLARS" } panels { room: "Main Area" name: "FOUR" } panels { room: "Main Area" name: "CAUGHT" } panels { room: "Main Area" name: "NET" } panels { room: "Main Area" name: "FOUR CAUGHT NET" } panels { room: "Main Area" name: "GREEN" } panels { room: "Main Area" name: "THINK" } panels { room: "Main Area" name: "LION" } panels { room: "Main Area" name: "GREEN THINK LION" } panels { room: "Main Area" name: "MOON" } panels { room: "Main Area" name: "POWER" } panels { room: "Main Area" name: "MOON POWER" } panels { room: "Control Center Side" name: "RIGHT" } complete_at: 10 } doors { name: "Plaza Entrance" type: ITEM_ONLY receivers: "Components/Doors/entry_4" panels { room: "Main Area" name: "SUN" } panels { room: "Main Area" name: "KOI" } panels { room: "Main Area" name: "SUN KOI" } panels { room: "Main Area" name: "CHOP" } panels { room: "Main Area" name: "YOU" } panels { room: "Main Area" name: "PLOT" } panels { room: "Main Area" name: "CHOP YOU PLOT" } panels { room: "Main Area" name: "OUT" } panels { room: "Main Area" name: "SEW" } panels { room: "Main Area" name: "NEAR" } panels { room: "Main Area" name: "OUT SEW NEAR" } panels { room: "Main Area" name: "SHINE" } panels { room: "Main Area" name: "CURTSY" } panels { room: "Main Area" name: "SHINE CURTSY" } panels { room: "Main Area" name: "NEW" } panels { room: "Main Area" name: "DOLLARS" } panels { room: "Main Area" name: "NEW DOLLARS" } panels { room: "Main Area" name: "FOUR" } panels { room: "Main Area" name: "CAUGHT" } panels { room: "Main Area" name: "NET" } panels { room: "Main Area" name: "FOUR CAUGHT NET" } panels { room: "Main Area" name: "GREEN" } panels { room: "Main Area" name: "THINK" } panels { room: "Main Area" name: "LION" } panels { room: "Main Area" name: "GREEN THINK LION" } panels { room: "Main Area" name: "MOON" } panels { room: "Main Area" name: "POWER" } panels { room: "Main Area" name: "MOON POWER" } panels { room: "Control Center Side" name: "RIGHT" } complete_at: 20 } doors { name: "B2 Door" type: ITEM_ONLY receivers: "Components/Doors/entry_1" panels { room: "Main Area" name: "SUN" } panels { room: "Main Area" name: "KOI" } panels { room: "Main Area" name: "SUN KOI" } panels { room: "Main Area" name: "CHOP" } panels { room: "Main Area" name: "YOU" } panels { room: "Main Area" name: "PLOT" } panels { room: "Main Area" name: "CHOP YOU PLOT" } panels { room: "Main Area" name: "OUT" } panels { room: "Main Area" name: "SEW" } panels { room: "Main Area" name: "NEAR" } panels { room: "Main Area" name: "OUT SEW NEAR" } panels { room: "Main Area" name: "SHINE" } panels { room: "Main Area" name: "CURTSY" } panels { room: "Main Area" name: "SHINE CURTSY" } panels { room: "Main Area" name: "NEW" } panels { room: "Main Area" name: "DOLLARS" } panels { room: "Main Area" name: "NEW DOLLARS" } panels { room: "Main Area" name: "FOUR" } panels { room: "Main Area" name: "CAUGHT" } panels { room: "Main Area" name: "NET" } panels { room: "Main Area" name: "FOUR CAUGHT NET" } panels { room: "Main Area" name: "GREEN" } panels { room: "Main Area" name: "THINK" } panels { room: "Main Area" name: "LION" } panels { room: "Main Area" name: "GREEN THINK LION" } panels { room: "Main Area" name: "MOON" } panels { room: "Main Area" name: "POWER" } panels { room: "Main Area" name: "MOON POWER" } panels { room: "Control Center Side" name: "RIGHT" } } 119 120 121 122 123 124 125 126 127 128 129 130
#ifndef VECTOR3D_H_26B75ED0
#define VECTOR3D_H_26B75ED0

#include <ostream>
#include <cmath>

class Vector3D {
  public:
    double x, y, z;

    Vector3D() : x(0.0), y(0.0), z(0.0) {}
    Vector3D(double x, double y, double z) : x(x), y(y), z(z) {}
    Vector3D(double c) : x(c), y(c), z(c) {}
    Vector3D(const Vector3D& v) : x(v.x), y(v.y), z(v.z) {}

    inline double& operator[] (const int& index)
    {
      // Yuck
      return ( &x )[ index ];
    }

    inline const double& operator[] (const int& index) const
    {
      return ( &x )[ index ];
    }

    inline bool operator==(const Vector3D& v) const
    {
      return v.x == x && v.y == y && v.z == z;
    }

    inline Vector3D operator-() const
    {
      return Vector3D( -x, -y, -z );
    }

    inline Vector3D operator+(const Vector3D& v) const
    {
      return Vector3D( x + v.x, y + v.y, z + v.z );
    }

    inline Vector3D operator-(const Vector3D& v) const
    {
      return Vector3D( x - v.x, y - v.y, z - v.z );
    }

    inline Vector3D operator*(const double& c) const
    {
      return Vector3D( x * c, y * c, z * c );
    }

    inline Vector3D operator/(const double& c) const
    {
      const double rc = 1.0/c;
      return Vector3D( rc * x, rc * y, rc * z );
    }

    inline void operator+=(const Vector3D& v)
    {
      x += v.x;
      y += v.y;
      z += v.z;
    }

    inline void operator-=(const Vector3D& v)
    {
      x -= v.x;
      y -= v.y;
      z -= v.z;
    }

    inline void operator*=(const double& c)
    {
      x *= c;
      y *= c;
      z *= c;
    }

    inline void operator/=(const double& c)
    {
      (*this) *= ( 1./c );
    }

    inline double norm() const
    {
      return sqrt( x*x + y*y + z*z );
    }

    inline double norm2() const
    {
      return x*x + y*y + z*z;
    }

    inline Vector3D unit() const
    {
      double rNorm = 1. / sqrt( x*x + y*y + z*z );
      return Vector3D( rNorm*x, rNorm*y, rNorm*z );
    }

    inline void normalize()
    {
      (*this) /= norm();
    }

};

// left scalar multiplication
inline Vector3D operator* (const double& c, const Vector3D& v)
{
  return Vector3D( c * v.x, c * v.y, c * v.z );
}

// dot product (a.k.a. inner or scalar product)
inline double dot(const Vector3D& u, const Vector3D& v)
{
  return u.x*v.x + u.y*v.y + u.z*v.z ;
}

// cross product
inline Vector3D cross(const Vector3D& u, const Vector3D& v)
{
  return Vector3D( u.y*v.z - u.z*v.y,
                   u.z*v.x - u.x*v.z,
                   u.x*v.y - u.y*v.x );
}

// prints components
std::ostream& operator<<(std::ostream& os, const Vector3D& v);

#endif /* end of include guard: VECTOR3D_H_26B75ED0 */