/**************************************************************************\
 *
 *  This file is part of the Coin 3D visualization library.
 *  Copyright (C) 1998-2002 by Systems in Motion. All rights reserved.
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public License
 *  version 2.1 as published by the Free Software Foundation. See the
 *  file LICENSE.LGPL at the root directory of the distribution for
 *  more details.
 *
 *  If you want to use Coin for applications not compatible with the
 *  LGPL, please contact SIM to acquire a Professional Edition license.
 *
 *  Systems in Motion, Prof Brochs gate 6, 7030 Trondheim, NORWAY
 *  http://www.sim.no support@sim.no Voice: +47 22114160 Fax: +47 22207097
 *
\**************************************************************************/

#ifndef COIN_SOOVERRIDEELEMENT_H
#define COIN_SOOVERRIDEELEMENT_H

#include <Inventor/elements/SoSubElement.h>
#include <Inventor/system/inttypes.h>

class SoType; // lame doxygen "fix"


class COIN_DLL_API SoOverrideElement : public SoElement {
  typedef SoElement inherited;

  SO_ELEMENT_HEADER(SoOverrideElement);
public:
  static void initClass(void);
protected:
  virtual ~SoOverrideElement();

public:
  enum FlagBits {
    AMBIENT_COLOR    = 0x00000001,
    COLOR_INDEX      = 0x00000002,
    COMPLEXITY       = 0x00000004,
    COMPLEXITY_TYPE  = 0x00000008,
    CREASE_ANGLE     = 0x00000010,
    DIFFUSE_COLOR    = 0x00000020,
    DRAW_STYLE       = 0x00000040,
    EMISSIVE_COLOR   = 0x00000080,
    FONT_NAME        = 0x00000100,
    FONT_SIZE        = 0x00000200,
    LIGHT_MODEL      = 0x00000400,
    LINE_PATTERN     = 0x00000800,
    LINE_WIDTH       = 0x00001000,
    MATERIAL_BINDING = 0x00002000,
    POINT_SIZE       = 0x00004000,
    PICK_STYLE       = 0x00008000,
    SHAPE_HINTS      = 0x00010000,
    SHININESS        = 0x00020000,
    SPECULAR_COLOR   = 0x00040000,
    POLYGON_OFFSET   = 0x00080000,
    TRANSPARENCY     = 0x00100000
  };

  virtual void init(SoState * state);

  virtual void push(SoState * state);

  virtual SbBool matches(const SoElement * element) const;
  virtual SoElement * copyMatchInfo(void) const;

  static uint32_t getFlags(SoState * const state) {
    return ((SoOverrideElement*)getConstElement(state, classStackIndex))->flags;
  }

  static SbBool getAmbientColorOverride(SoState * const state);
  static SbBool getColorIndexOverride(SoState * const state);
  static SbBool getComplexityOverride(SoState * const state);
  static SbBool getComplexityTypeOverride(SoState * const state);
  static SbBool getCreaseAngleOverride(SoState * const state);
  static SbBool getDiffuseColorOverride(SoState * const state);
  static SbBool getDrawStyleOverride(SoState * const state);
  static SbBool getEmissiveColorOverride(SoState * const state);
  static SbBool getFontNameOverride(SoState * const state);
  static SbBool getFontSizeOverride(SoState * const state);
  static SbBool getLightModelOverride(SoState * const state);
  static SbBool getLinePatternOverride(SoState * const state);
  static SbBool getLineWidthOverride(SoState * const state);
  static SbBool getMaterialBindingOverride(SoState * const state);
  static SbBool getPickStyleOverride(SoState * const state);
  static SbBool getPointSizeOverride(SoState * const state);
  static SbBool getPolygonOffsetOverride(SoState * const state);
  static SbBool getShapeHintsOverride(SoState * const state);
  static SbBool getShininessOverride(SoState * const state);
  static SbBool getSpecularColorOverride(SoState * const state);
  static SbBool getTransparencyOverride(SoState * const state);

  static void setAmbientColorOverride(SoState * const state,
                                      SoNode * const node,
                                      const SbBool override);
  static void setColorIndexOverride(SoState * const state,
                                    SoNode * const node,
                                    const SbBool override);
  static void setComplexityOverride(SoState * const state,
                                    SoNode * const node,
                                    const SbBool override);
  static void setComplexityTypeOverride(SoState * const state,
                                        SoNode * const node,
                                        const SbBool override);
  static void setCreaseAngleOverride(SoState * const state,
                                     SoNode * const node,
                                     const SbBool override);
  static void setDiffuseColorOverride(SoState * const state,
                                      SoNode * const node,
                                      const SbBool override);
  static void setDrawStyleOverride(SoState * const state,
                                   SoNode * const node,
                                   const SbBool override);
  static void setEmissiveColorOverride(SoState * const state,
                                       SoNode * const node,
                                       const SbBool override);
  static void setFontNameOverride(SoState * const state,
                                  SoNode * const node,
                                  const SbBool override);
  static void setFontSizeOverride(SoState * const state,
                                  SoNode * const node,
                                  const SbBool override);
  static void setLightModelOverride(SoState * const state,
                                    SoNode * const node,
                                    const SbBool override);
  static void setLinePatternOverride(SoState * const state,
                                     SoNode * const node,
                                     const SbBool override);
  static void setLineWidthOverride(SoState * const state,
                                   SoNode * const node,
                                   const SbBool override);
  static void setMaterialBindingOverride(SoState * const state,
                                         SoNode * const node,
                                         const SbBool override);
  static void setPickStyleOverride(SoState * const state,
                                   SoNode * const node,
                                   const SbBool override);
  static void setPointSizeOverride(SoState * const state,
                                   SoNode * const node,
                                   const SbBool override);
  static void setPolygonOffsetOverride(SoState * const state,
                                       SoNode * const node,
                                       const SbBool override);
  static void setShapeHintsOverride(SoState * const state,
                                    SoNode * const node,
                                    const SbBool override);
  static void setShininessOverride(SoState * const state,
                                   SoNode * const node,
                                   const SbBool override);
  static void setSpecularColorOverride(SoState * const state,
                                       SoNode * const node,
                                       const SbBool override);
  static void setTransparencyOverride(SoState * const state,
                                      SoNode * const node,
                                      const SbBool override);

  virtual void print(FILE * file) const;

private:

  uint32_t flags;
};

#endif // !COIN_SOOVERRIDEELEMENT_H
