OZ++ Class: ColorEyeLightPositioner
/******************************************************************************
 *
 * Copyright (c) 2016 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions, and the following disclaimer.
 *
 * 2. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 *  ColorEyeLightPositioner.h
 *
 *****************************************************************************/


#include <oz++/motif/BulletinBoard.h>
#include <oz++/motif/ColorPositioner.h>
#include <oz++/motif/EyePositioner.h>
#include <oz++/motif/LightPositioner.h>
#include <oz++/motif/Color.h>

namespace OZ {

const char* XmNeyePositionerMinimum = "eyePositionerMinimum";
const char* XmNeyePositionerMaximum = "eyePositionerMaximum";

const char* XmNlightPositionerMinimum = "lightPositionerMinimum";
const char* XmNlightPositionerMaximum = "lightPositionerMaximum";

class ColorEyeLightPositioner: public BulletinBoard {

private:
  SmartPtr<ColorPositioner> colorPositioner;
  SmartPtr<EyePositioner>   eyePositioner;
  SmartPtr<LightPositioner> lightPositioner;

public:
  ColorEyeLightPositioner(View* parent, const char* name, Args& args)
  :BulletinBoard(parent, name, args)
  {
    Args ar;
    ar.reset();
    ar.set(XmNx, 2);
    ar.set(XmNy, 2);
    colorPositioner = new ColorPositioner(this, "", ar);

    int eMin = -20;
    if (args.has(XmNeyePositionerMinimum)) {
      eMin = (int)args.get(XmNeyePositionerMinimum);
    }

    int eMax = 20;
    if (args.has(XmNeyePositionerMaximum)) {
      eMax = (int)args.get(XmNeyePositionerMaximum);
    }
    ar.reset();
    ar.set(XmNx, 2);
    ar.set(XmNy, 2+ 110);
    ar.set(XmNminimum, eMin);
    ar.set(XmNmaximum, eMax);
    eyePositioner = new EyePositioner(this, "", ar);
    
    int lMin = -20;
    if (args.has(XmNlightPositionerMinimum)) {
      lMin = (int)args.get(XmNlightPositionerMinimum);
    }

    int lMax = 20;
    if (args.has(XmNlightPositionerMaximum)) {
      lMax = (int)args.get(XmNlightPositionerMaximum);
    }

    ar.reset();
    ar.set(XmNx, 2);
    ar.set(XmNy, 2+ 110*2);
    ar.set(XmNminimum, lMin);
    ar.set(XmNmaximum, lMax);
    lightPositioner = new LightPositioner(this, "", ar);
  }
  
  ~ColorEyeLightPositioner() 
  {
  }

  void setExposeEventListener(View* view)
  {
    colorPositioner->setExposeEventListener(view);
    eyePositioner  ->setExposeEventListener(view);
    lightPositioner->setExposeEventListener(view);
  }

  void getColorPosition(int& r, int& g, int& b)
  {
     colorPositioner->getPosition(r, g, b);
  }

  void getColorPosition(float& r, float& g, float& b)
  {
     int x, y, z;
     colorPositioner->getPosition(x, y, z);
     r = (float)x/(float)255.0f;
     g = (float)y/(float)255.0f;
     b = (float)z/(float)255.0f;

  }

  void getEyePosition(int& x, int& y, int& z)
  {
     eyePositioner->getPosition(x, y, z);
  }

  void getEyePosition(float& x, float& y, float& z)
  {
     int ix, iy, iz;
     eyePositioner->getPosition(ix, iy, iz);
     x = (float)ix;
     y = (float)iy;
     z = (float)iz;
  }

  void getLightPosition(int& x, int& y, int& z)
  {
     lightPositioner->getPosition(x, y, z);
  }

  void getLightPosition(float& x, float& y, float& z)
  {
     int ix, iy, iz;
     lightPositioner->getPosition(ix, iy, iz);
     x = (float)ix;
     y = (float)iy;
     z = (float)iz;
  }

  void setColorPosition(int r, int g, int b)
  {
     colorPositioner->setPosition(r, g, b);
  }

  void setEyePosition(int x, int y, int z)
  {
     eyePositioner->setPosition(x, y, z);
  }

  void setLightPosition(int x, int y, int z)
  {
     lightPositioner->setPosition(x, y, z);
  }

  ColorPositioner* getColorPositioner()
  {
    return colorPositioner;
  }
 
  EyePositioner*   getEyePositioner()
  {
    return eyePositioner;
  }
  LightPositioner*   getLightPositioner()
  {
    return lightPositioner;
  }

  int getPositionerWidth()
  {
    return colorPositioner->getPositionerWidth();
  }
};

}