#ifndef __SIM_SolverSNOW_h__
#define __SIM_SolverSNOW_h__
#include <UT/UT_HashTable.h>
#include <UT/UT_Hash.h>
#include <UT/UT_IStream.h>
#include <UT/UT_VoxelArray.h>
#include <GU/GU_DetailHandle.h>
#include <SIM/SIM_OptionsUser.h>
#include <SIM/SIM_SingleSolver.h>
#include <SIM/SIM_Geometry.h>
#define SIM_NAME_SOURCEOBJECTS "sourceobjects"
#define SIM_NAME_BIRTHRATE "birthrate"
#define SIM_NAME_DIVISIONS "divisions"
#define SIM_NAME_ORIGINALDEPTH "originaldepth"
class SIM_Object;
class GEO_Point;
class SIM_Random;
typedef unsigned char u8;
namespace HDK_Sample {
class SNOW_VoxelArray;
class SIM_SolverSNOW : public SIM_SingleSolver,
public SIM_OptionsUser
{
public:
GETSET_DATA_FUNCS_F(SIM_NAME_BIRTHRATE, BirthRate);
GETSET_DATA_FUNCS_I(SIM_NAME_DIVISIONS, Divisions);
GETSET_DATA_FUNCS_I(SIM_NAME_ORIGINALDEPTH, OriginalDepth);
protected:
explicit SIM_SolverSNOW(const SIM_DataFactory *factory);
virtual ~SIM_SolverSNOW();
SIM_Random *createRandomData(SIM_Object *obj) const;
virtual SIM_Result solveSingleObjectSubclass(SIM_Engine &engine,
SIM_Object &object,
SIM_ObjectArray &feedbacktoobjects,
const SIM_Time ×tep,
bool newobject);
int rand_choice(int numchoice, SIM_Random *rand) const;
bool brownianize(int &v, int dv, int max,
SIM_Random *rand) const;
int clearInDirection(const SNOW_VoxelArray &snow,
int sx, int sy, int sz,
int dx, int dy, int dz,
int &rx, int &ry, int &rz,
int maxdist,
SIM_Random *rand) const;
void clearSnow(SNOW_VoxelArray &snow,
int x, int y, int z,
SIM_Random *rand) const;
void fillRow(SNOW_VoxelArray &snow,
fpreal startx, fpreal endx,
int y, int z,
u8 voxeltype,
SIM_Random *rand) const;
void applyGeometry(SNOW_VoxelArray &snow,
const GU_ConstDetailHandle &gdh,
const UT_DMatrix4 &xform,
u8 voxletype,
SIM_Random *rand) const;
private:
static const SIM_DopDescription *getSolverSNOWDopDescription();
void solveForObject(SIM_Object &object,
SNOW_VoxelArray &snow,
const SIM_Time ×tep) const;
void setVoxelArrayAttributes(
SNOW_VoxelArray *voxelarray) const;
DECLARE_STANDARD_GETCASTTOTYPE();
DECLARE_DATAFACTORY(SIM_SolverSNOW,
SIM_SingleSolver,
"SNOW Solver",
getSolverSNOWDopDescription());
};
#define VOXEL_EMPTY 0
#define VOXEL_SNOW 1
#define VOXEL_COMPRESSED 2
#define VOXEL_WALL 3
#define VOXEL_OBJECT 4
class SNOW_VoxelArray : public SIM_Geometry
{
public:
int getXDivisions() const;
void setXDivisions(int divisions);
int getYDivisions() const;
void setYDivisions(int divisions);
int getZDivisions() const;
void setZDivisions(int divisions);
u8 getVoxel(int x, int y, int z) const;
void setVoxel(u8 voxel, int x, int y, int z);
void collapseAllTiles();
void pubHandleModification()
{ handleModification(); }
protected:
explicit SNOW_VoxelArray(const SIM_DataFactory *factory);
virtual ~SNOW_VoxelArray();
virtual void initializeSubclass();
virtual void makeEqualSubclass(const SIM_Data *source);
virtual void saveSubclass(ostream &os) const;
virtual bool loadSubclass(UT_IStream &is);
virtual void handleModificationSubclass(int code);
virtual GU_ConstDetailHandle getGeometrySubclass() const;
private:
GEO_Point *createOrFindPoint(GU_Detail *gdp, int x, int y, int z);
void buildFace(GU_Detail *gdp,
int x0, int y0, int z0,
int x1, int y1, int z1,
int x2, int y2, int z2,
int x3, int y3, int z3);
void buildGeometryFromArray();
void freeArray() const;
void allocateArray() const;
mutable GU_DetailHandle myDetailHandle;
mutable UT_VoxelArray<u8> *myVoxelArray;
int myXDivisions;
int myYDivisions;
int myZDivisions;
UT_HashTable myPointHash;
DECLARE_STANDARD_GETCASTTOTYPE();
DECLARE_DATAFACTORY(SNOW_VoxelArray,
SIM_Geometry,
"Voxel Array",
getEmptyDopDescription());
};
}
#endif