//------------------------------------------------------------
// $Id: voltravinfo.h,v 1.2.2.1 2000/06/14 15:00:11 yamauchi Exp $
//------------------------------------------------------------
//	volume traverse information
//	1998/4/9
//	(C) Copyright YAMAUCHI Hitoshi 
//	volume の通過情報
//------------------------------------------------------------
#ifndef _voltravinfo_h
#define _voltravinfo_h 1

#include <assert.h>
#include "IntVec3.h"
#include "Vector3.h"
#include "ddaInfo.h"

class volTravInfoClass {
protected:
    DDAInfoClass  mVolDinfo;	// volume の通過のための DDA 情報を保持する
    int 	  mVolID;	// volume ID
    IntVec3 	  mVoxelIdx;	// これまで通過した voxel の index
    double 	  mAccumOpacity; // これまでの volume の不透明度の積算値

public:
    volTravInfoClass(void)	{	this->invalidateInit();	}
    // ~volTravInfoClass(void);
    volTravInfoClass(const volTravInfoClass& rhs)
    {
	this->mVolDinfo		= rhs.mVolDinfo;
	this->mVolID		= rhs.mVolID;
	this->mVoxelIdx		= rhs.mVoxelIdx;	
	this->mAccumOpacity	= rhs.mAccumOpacity;
    }
    const volTravInfoClass& operator=(const volTravInfoClass& rhs)
    {
	if(this != &rhs)
	{
	    this->mVolDinfo	= rhs.mVolDinfo;
	    this->mVolID	= rhs.mVolID;
	    this->mVoxelIdx	= rhs.mVoxelIdx;
	    this->mAccumOpacity	= rhs.mAccumOpacity;
	}
	return(*this);
    }
    //----- initialize 
    void invalidateInit(void)
    {
	this->mVolDinfo.invalidateInit();
	this->mVolID		= -1;
	this->mVoxelIdx.set(-5, -6, -7);
	this->mAccumOpacity	= 0.0;
    }

    //----- volume ID
    //   ここで volume ID が初期化されていることと、DDA が初期化されて
    //   いることは相関はあるが同値ではないことに注意。DDA が初期化さ
    //   れている時には volume ID は初期化されていなくてはいけないが、
    //   volume ID があるからと言って DDA が初期化されているとは限らな
    //   い。 
    void setVolID(int vid)
    {
	assert((0 <= vid) && (vid < 1024)); // 1024 はいいかげんな数字
	this->mVolID = vid;
    }
    int getVolID(void) const 	{ return(this->mVolID);	}

    //----- volume DDA
    void setVolDDA(const DDAInfoClass& volumeDDA)
    {
	this->mVolDinfo = volumeDDA;
    }
    const DDAInfoClass getVolDDA(void) const 
    {
	return(this->mVolDinfo);
    }

    //----- volume index
    void setVolIdx(const IntVec3& volidx) 
    {
	this->mVoxelIdx = volidx;
    }
    IntVec3 getVolIdx(void) const 	{ return(this->mVoxelIdx);	} 

    //----- volume accumulate opacity
    void setAccumOpacity(double accumOpacity)
    {
	assert(accumOpacity >= 0.0);
	this->mAccumOpacity += accumOpacity;
    }
    double getAccumOpacity(void) const 	{ return(this->mAccumOpacity);	}
};


#endif				// #ifndef _voltravinfo_h
