//////////////////////////////////////
// START of File: CO1_VOBJ.HPP
//////////////////////////////////////

#ifndef NULL    // If a compiler is dim-witted...
#define NULL 0  // ...try to bring it up to speed!  
#endif          // This (hopefuly) should NOT happen a lot!
                     
#ifndef CO1_VOBJ_HPP
#define CO1_VOBJ_HPP

//===================================================================
//
// COPYRIGHT NOTICE:  This code is protected by Copyright!
//
// Copyright (c) 1994 through 1997 by DPC Technology Corporation.
// All rights reserved by DPC Technology Corporation.
//
// See files "cf_copyr.txt" and "cf_licen.txt" for details of
// copyright and license specifications, and contact information.
//
//===================================================================

// Master Header File Listing:
// Usage:   #include    <cf_api/c1_vobj.hpp>
            // Chart Framework Virtual (base-class)
            // "2D/3D Geometric Chart Object".

//--------------------------------------------------------------------
// Include Chart Framework class or ID defs/headers this file needs.
// Paths are relative to the IDE's (global) include path: ~/cfrz
//--------------------------------------------------------------------
#include    <cf_api/cf_defs.h>
            // Platform-Independent Chart Framework Typedefs...

class       bf_Display;
class       cf_DispAttribs;
#include    <cf_api/c0_datb.hpp>

class       cf_TextAttribs;
#include    <cf_api/c0_tatb.hpp>

class       cf_Kernel;
#include    <cf_api/c1_kernl.hpp>

//==============================================================
// Declare a Chart FrameWork "Virtual 3D Object" class.
// This class is a BASE class for all other Chart FrameWork
// geometric objects.
//
// Chart FrameWork cf_Virt3DObj objects have the ability to
// apply transforms to themselves, (using a given cf_Kernel)
// with either a GEOMETRIC or a PROJECTION transform.
// They also have the ability to SCALE and TRANSLATE by
// a set of X, Y and Z factors in their virtual 3D space.
//
// Chart FrameWork cf_Virt3DObj objects must have the ability
// to perform HSE (Hidden-Surface Elimination) and DSORT
// (Depth Sorting) comparisons to sort themselves
// in 3D space.
//
// This functionality must be performed in a polymorphic
// manner across a disparate set of object classes, (e.g.
// points, line segments, poly-lines, polygons, and surfaces.
//
// Chart FrameWork object classes also have the ability to DRAW
// themselves, provided the proper device context is available,
// (achieved by passing a pointer to a bf_Display "display"
// object).
//==============================================================
class CF_EXPORT   cf_Virt3DObj

{

public: // member methods

    cf_Virt3DObj(); // Default c-tor.

    cf_Virt3DObj(   cf_DispAttribs *p_attrToDrawWith );
                    // Std c-tor lets user assign display attribs

    virtual         ~cf_Virt3DObj();
                    // A Virtual D-tor is VERY important for this "class tree"

    cf_Virt3DObj&   operator=( const cf_Virt3DObj &cr_cf_vobjSource );
                    // VERY important to define an "=" operator
                    // for dynamic array ops, etc.!


    //------------------------------------------------
    // Control the Virtual-Object's Text-Attributes:
    //------------------------------------------------
    cf_TextAttribs* attribTextCurrent();
                    // Get whatever set of display attributes we're pointing at.
                    // Note that it is VERY wise to preceed this by a call to
                    // attribsTextValid() to insure we are not pointed to NULL!

    virtual
    cf_TextAttribs* attribTextNew();
                    // Create a New set of "Text-Attribs" to be the
                    // target for this object's Text-Attribs pointer!
                    // Any current new()ed allocation will be deleted.
                    // D-tor will be notified to delete these current
                    // new()-ed "Disp Attribs" object.

    virtual
    void            attribTextUsing( cf_TextAttribs *p_cf_tatbSource );
                    // Set this object's display attribute pointer. D-tor
                    // will know NOT to delete these BORROWED text-attribs!

    BOOL            attribTextValid();
                    // Did we REMEMBER to SET the text-attribs pointer for
                    // this object?  TRUE means yes, FALSE means that...
                    // we (doo-oop!) FORGOT!




    virtual void    applyDispMetrics( cf_Kernel  *p_cf_kUseThisKernel );
    virtual void    applyGeomXform( cf_Kernel  *p_cf_kUseThisKernel );
    virtual void    applyProjXform( cf_Kernel *p_cf_kUseThisKernel );
                    // Use the Given cf_Kernel pointer to apply
                    // Transformation(s) to this cf_Virt3DObj:
                    // Called by the parent chart-engine configuration
                    // in response to display/geometry context changes
                    // (e.g. re-size, view-angle events, etc.) imposed
                    // by the chart-engine's parent chart-model/chart-view.
                    // Pure virtual implementations force any *actual*
                    // implemtations into the derived objects.

    virtual void    applyScaleOp(   double dXScaleFactor,
                                    double dYScaleFactor,
                                    double dZScaleFactor );

    virtual void    applyTranslateOp(   double dXTrans,
                                        double dYTrans,
                                        double dZTrans );
                    // Use the Given double-typed factors to apply
                    // transformation(s) to this cf_Virt3DObj:

    cf_DispAttribs* dispAttribsCurrent();
                    // Get whatever set of display attributes
                    // we're pointing at -- note that it is VERY
                    // wise to preceed this call with a call to
                    // this->dispAttribsValid() to make sure
                    // that we are not pointed to NULL, etc!!!

    virtual cf_DispAttribs* dispAttribsNewSet();
                    // Create a New set of "Display Attribs" to be the
                    // target for this object's "Display Attribs" pointer!
                    // Any current new()ed allocation will be deleted.
                    // D-tor will be notified to delete these current
                    // new()-ed "Disp Attribs" object.

    virtual  void   dispAttribsPointTo( cf_DispAttribs *p_cf_datbTarget );
                    // Set this object's display attribute pointer. D-tor
                    // will know NOT to delete these borrowed attribs.

    BOOL            dispAttribsValid();
                    // Did we REMEMBER to SET the display attribs
                    // pointer for this object?  TRUE means yes,
                    // FALSE means that... we (doo-oop!) FORGOT!

    BOOL            dispIgnorePushBrush();
    void            dispIgnorePushBrush( BOOL bNewState );

    BOOL            dispIgnorePushFont();
    void            dispIgnorePushFont( BOOL bNewState );

    BOOL            dispIgnorePushPen();
    void            dispIgnorePushPen( BOOL bNewState );
                    // Get/set the bIgnorePush BOOL vars below...
                    // Default is to pay attention to display
                    // attribute push ops.

    void            dispPushBrushAttribs( bf_Display *p_bf_dspTarget );
    void            dispPushPenAttribs( bf_Display *p_bf_dspTarget );
                    // Modularizes "new" and "push" ops
                    // for display attribs.

    void            dispPopBrushAttribs( bf_Display *p_bf_dspTarget );
    void            dispPopPenAttribs( bf_Display *p_bf_dspTarget );
                    // Modularizes "pop" and "delete" ops
                    // for display attribs.

    BOOL            dispUsingFacetSort();
    virtual void    dispUsingFacetSort( BOOL bNewState );
                    // Get/set Facet-based Depth-Sorting calcs ON/OFF.

    BOOL            dispUsingZDepthSort();
    virtual void    dispUsingZDepthSort( BOOL bNewState );
                    // Get/set Geometry-based Depth-Sorting calcs ON/OFF.

    BOOL            dispUsingHSE();
    virtual void    dispUsingHSE( BOOL bNewState );
                    // Get/set Hidden-Surface-Elimination calcs ON/OFF.

    BOOL            dispVisibleIs();
    virtual void    dispVisible( BOOL bNewState );
                    // Get/set "ignore draw-op" modes ON/OFF.

    BOOL            dispWireFrame();
    virtual void    dispWireFrame( BOOL bNewState );
                    // Get/set "wire-frame" mode ON/OFF.


    virtual void    draw( bf_Display *p_bf_dspUseThisDisplay );
    virtual void    draw2D( bf_Display *p_bf_dspUseThisDisplay );
    virtual void    draw3D( bf_Display *p_bf_dspUseThisDisplay );
                    // Render this virtual object into a display.


    virtual double  dataXMin() const;
    virtual double  dataXMax() const;
    virtual double  dataYMin() const;
    virtual double  dataYMax() const;
    virtual double  dataZMin() const;
    virtual double  dataZMax() const;
                    // Get data references for various ops.
                    // (e.g. Tick Mark Range ops.)

    virtual double  virtXMin() const;
    virtual double  virtXMax() const;
    virtual double  virtYMin() const;
    virtual double  virtYMax() const;
    virtual double  virtZMin() const;
    virtual double  virtZMax() const;
                    // Get data references for various ops.
                    // (e.g. Virtual Scaling/Translation ops.)

    virtual double  xformXMin() const;
    virtual double  xformXMax() const;
    virtual double  xformYMin() const;
    virtual double  xformYMax() const;
    virtual double  xformZMin() const;
    virtual double  xformZMax() const;
                    // Get data references for various ops .
                    // (e.g. Geometry/Depth-Sorting ops.)


protected:  // member vars accessible to DERIVED objects ONLY !

    cf_DispAttribs  *p_cf_datbForDrawOps_;
    BOOL            bWereDispAttribsSet_;
    BOOL    		bWereDispAttribsNewed_;
            		// A POINTER to an Encapuslated set of Display Attributes.
            		// Unless paremeterized by the c-tor, this will be NULL
                    // until set with a call to the set-member dispAttibs(...)

    cf_TextAttribs  *p_cf_tatbForTextOps_;
    BOOL            bWereTextAttribsSet_;
    BOOL    		bWereTextAttribsNewed_;
            		// A POINTER to an Encapuslated set of Text Attributes.
            		// Unless paremeterized by the c-tor, this will be NULL
                    // until set with a call to the set-member textAttibs(...)

    BOOL    bIgnorePushBrush_;
    BOOL    bIgnorePushFont_;
    BOOL    bIgnorePushPen_;
            // Sometimes we want to IGNORE pushing a set of
            // display attributes during draw ops.  An example
            // of this would be a series of points -- instead
            // of pushing/popping a set of display attribs
            // for EACH point, it's faster and cheaper to
            // push ONE set, and use this ONE set for ALL the
            // points.  The c-tor inits these to FALSE, so
            // we DO pay attention to Pen and Brush attribs
            // unless told otherwise...

    BOOL    bDispUsingFacetSort_;
    BOOL    bDispUsingZDepthSort_;
    BOOL    bDispUsingHSE_;
            // Using HSE (Hidden Surface Elimination) calcs
            // and DSORT (Depth Sorting) calcs during rendering
            // and/or geometric and/or projection calcs is
            // *expensive*, and most objects -- at least most 2D
            // objects -- do NOT need these vars to be set = TRUE.
            // Therefore, the default c-tor init state is FALSE.

    BOOL    bDispWireFrame_;
            // If TRUE, we skip certain "expensive" draw ops
            // (like disp attrib push/pops) and "expensive" geom
            // xform ops (like DSORT/HSE ops). C-tor inits to FALSE.

    BOOL    bAppliedKernelDispMetrics_;
            // To allow queries at this->applyProjXform( ... )-time
            // to see if we need to synchronize this object with the
            // kernel's display metrics.  C-tor inits FALSE.

    BOOL    bDispVisible_;
            // Some geometry-objects (e.g. the centroid of a chart-engine)
            // do NOT normally need to be rendered.  BUT, because almost
            // EVERY 3D-object "wants to" be rendered c-tor inits = TRUE !!!

private:


};  // End of cf_Virt3DObj declaration.

#endif      // Terminates include re-definition protection

//////////////////////////////////////
// END of File: CO1_VOBJ.HPP
//////////////////////////////////////


