As I promised to Norm earlier, here's how I think the interface for
the new viewer module should look.  The viewer would be configurable
for three situations:

1. looking from a known position outwards
2. looking at a known position from an offset
3. looking at one known position from another

The main input vectors are as follow:

- geodetic position of viewer (used by 1 and 3)
- geodetic position of target (used by 2 and 3)
- Euler angles for viewer orientation (used by 1, 2, and 3)
- position offsets (distance from viewpoint in 1 and 3 and from target
  in 2)
- Euler angle offsets (used by 1, 2, and 3)

Undoubtedly, I've confused or missed something.  Code speaks louder
than words, so here's a hack-up of the interface:

  class FGViewer : public FGSubsystem
  {
  public:

    enum Type {
      FROM_POINT,
      TO_POINT,
      POINT_TO_POINT
    };

    FGViewer ();
    virtual ~FGViewer ();

    //////////////////////////////////////////////////////////////////////
    // Part 1: standard FGSubsystem implementation.
    //////////////////////////////////////////////////////////////////////

    virtual void init ();
    virtual void bind ();
    virtual void unbind ();
    virtual void update (int dt);

    //////////////////////////////////////////////////////////////////////
    // Part 2: user settings.
    //////////////////////////////////////////////////////////////////////

    virtual Type getType () const;
    virtual void setType (Type type);

                             // Reference geodetic position
    virtual double getLongitude_deg () const;
    virtual double getLatitude_deg () const;
    virtual double getAltitude_ft () const;
    virtual void setLongitude_deg (double lon);
    virtual void setLatitude_deg (double lat);
    virtual void setAltitude_ft (double alt);
    virtual void setPosition (double lon, double lat, double alt);

                             // Reference geodetic target position
    virtual double getTargetLongitude_deg () const;
    virtual double getTargetLatitude_deg () const;
    virtual double getTargetAltitude_ft () const;
    virtual void setTargetLongitude_deg (double lon);
    virtual void setTargetLatitude_deg (double lat);
    virtual void setTargetAltitude_ft (double alt);
    virtual void setTargetPosition (double lon, double lat, double alt);

                             // Reference orientation
    virtual double getRoll_deg () const;
    virtual double getPitch_deg () const;
    virtual double getHeading_deg () const;
    virtual void setRoll_deg (double roll);
    virtual void setPitch_deg (double pitch);
    virtual void setHeading_deg (double heading);
    virtual void setOrientation (double roll, double pitch, double heading);

                             // Position offsets from reference
                             // (axes rotated by ref orientation)
    virtual double getXOffset_m () const;
    virtual double getYOffset_m () const;
    virtual double getZOffset_m () const;
    virtual void setXOffset_m (x_offset);
    virtual void setYOffset_m (y_offset);
    virtual void setZOffset_m (z_offset);
    virtual void setPositionOffsets (double x_offset,
                                     double y_offset,
                                     double z_offset);

                             // Orientation offsets from reference
    virtual double getRollOffset_deg () const;                             
    virtual double getPitchOffset_deg () const;                             
    virtual double getHeadingOffset_deg () const;
    virtual void setRollOffset_deg (double roll_offset);
    virtual void setPitchOffset_deg (double pitch_offset);
    virtual void setHeadingOffset_deg (double heading_offset);
    virtual void setOrientationOffsets (double roll_offset,
                                        double pitch_offset,
                                        double heading_offset);

    //////////////////////////////////////////////////////////////////////
    // Part 3: output vectors and matrices in FlightGear coordinates.
    //////////////////////////////////////////////////////////////////////

                              // Vectors and positions
    virtual const float * get_view_pos () const;
    virtual const float * get_absolute_view_pos () const;
    virtual const float * get_zero_elev () const;
    virtual const float * get_world_up () const;
    virtual const float * get_surface_east () const;
    virtual const float * get_surface_south () const;

                              // Matrices
    virtual const sgVec4 * get_VIEW () const;
    virtual const sgVec4 * get_VIEW_ROT () const;
    virtual const sgVec4 * get_UP () const;

  private:

    // whatever we decide to put here
  };


All the best,


David

-- 
David Megginson
[EMAIL PROTECTED]


_______________________________________________
Flightgear-devel mailing list
[EMAIL PROTECTED]
http://mail.flightgear.org/mailman/listinfo/flightgear-devel

Reply via email to