#ifndef _ThreedeeP_h
#define _ThreedeeP_h

#include <X11/IntrinsicP.h>
#include <X11/ConstrainP.h>
#include "Axis3P.h"
#include "Projection.h"
#include "Threedee.h"
/* #include <X11/Xutil.h> */

#define POSSIBLEAXES 12


#define RegNONE -1
#define RegPLOT -2
#define RegX1AXIS 0
#define RegX2AXIS 1
#define RegX3AXIS 2
#define RegX4AXIS 3
#define RegY1AXIS 4
#define RegY2AXIS 5
#define RegY3AXIS 6
#define RegY4AXIS 7
#define RegZ1AXIS 8
#define RegZ2AXIS 9
#define RegZ3AXIS 10
#define RegZ4AXIS 11
  
typedef struct _CubeRec {
  int frontleft, frontright;
  int backleft, backright;
  int frontbottom, fronttop;
  int backbottom, backtop;
  int y0, y1, y2;
} CubeRec, *Cube;

#define XtRCube "Cube"

typedef struct _AtThreedeePart {
  
  /* resources */
  String fontFamily;
  String title;
  int titleSize;
  Pixel titleColor;
  int titlePosX, titlePosY;
  Boolean autoScale;
  short marginWidth;
  short marginHeight;
  XtCallbackList motionCallback;
  XtCallbackList clickCallback;
  XtCallbackList dragCallback;
  XtCallbackList selectCallback;
  XtCallbackList errorCallback;
  AtAxis3Object x1axis;
  AtAxis3Object x2axis;
  AtAxis3Object x3axis;
  AtAxis3Object x4axis;
  AtAxis3Object y1axis;
  AtAxis3Object y2axis;
  AtAxis3Object y3axis;
  AtAxis3Object y4axis;
  AtAxis3Object z1axis;
  AtAxis3Object z2axis;
  AtAxis3Object z3axis;
  AtAxis3Object z4axis;
  double downShear, leftShear;
  double xmin, xmax, ymin, ymax, zmin, zmax;
  short axisZone;
  Boolean axesShown[POSSIBLEAXES]; /* in order x1,x2,x3,x4,y1..y4,z1..z4 */

  /* private state */   
  AtFontFamily *ff;
  GC titleGC, dragGC;
  AtText  *titleText;
  int titleX, titleY;
  int xlength, zlength;
  short clickx, clicky, dragwidth, dragheight;
  Boolean dragging;
  double yAngle, costheta, sintheta;
  AtScale *xscale, *yscalex, *yscaley, *zscale;
  Projection cumProjection;
  Region plotRegion;
  AtAxis3Object *axes;
  Cube axisCube;
  short currentRegion;
  Boolean valid;

} AtThreedeePart;

typedef struct _AtThreedeeRec {
  CorePart core;
  CompositePart composite;
#ifdef CONSTR
  ConstraintPart constraint;
#endif CONSTR
  AtThreedeePart threedee;
} AtThreedeeRec;

typedef struct _AtThreedeeClassPart {
  int ignore_me;
} AtThreedeeClassPart;

typedef struct _AtThreedeeClassRec {
  CoreClassPart core_class;
  CompositeClassPart composite_class;

#ifdef CONSTR
  ConstraintClassPart constraint_class;
#endif CONSTR

  AtThreedeeClassPart threedee_class;
} AtThreedeeClassRec;

#ifdef CONSTR
typedef struct _AtThreedeeConstraintsPart {
  /* resources */
  String displayName;
  
  /* private state */
  Boolean displayed, needsRedraw;
  Region plotRegion;

} AtThreedeeConstraintsPart;

typedef struct _AtThreedeeConstraintsRec {
  AtThreedeeConstraintsPart threedee;
} AtThreedeeConstraintsRec, *AtThreedeeConstraints;
#endif CONSTR

extern AtThreedeeClassRec atThreedeeClassRec;

#endif


