#ifndef __SNOW_Solver_h__
#define __SNOW_Solver_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_BIRTHRATE "birthrate"
#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 SNOW_Solver : public SIM_SingleSolver,
public SIM_OptionsUser
{
public:
GETSET_DATA_FUNCS_F(SIM_NAME_BIRTHRATE, BirthRate);
GETSET_DATA_FUNCS_I(SIM_NAME_ORIGINALDEPTH, OriginalDepth);
protected:
explicit SNOW_Solver(const SIM_DataFactory *factory);
virtual ~SNOW_Solver();
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(SNOW_Solver,
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
#define SNOW_NAME_DIVISIONS "div"
#define SNOW_NAME_CENTER "t"
#define SNOW_NAME_SIZE "size"
class SNOW_VoxelArray : public SIM_Geometry
{
public:
GETSET_DATA_FUNCS_V3(SNOW_NAME_DIVISIONS, Divisions);
GETSET_DATA_FUNCS_V3(SNOW_NAME_SIZE, Size);
GETSET_DATA_FUNCS_V3(SNOW_NAME_CENTER, Center);
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 int64 getMemorySizeSubclass() const;
virtual void optionChangedSubclass(const char *name);
virtual GU_ConstDetailHandle getGeometrySubclass() const;
private:
static const SIM_DopDescription *getVoxelArrayDopDescription();
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;
UT_HashTable myPointHash;
DECLARE_STANDARD_GETCASTTOTYPE();
DECLARE_DATAFACTORY(SNOW_VoxelArray,
SIM_Geometry,
"hdk_VoxelArray",
getVoxelArrayDopDescription()
);
};
class SNOW_Visualize : public SIM_Data,
public SIM_OptionsUser
{
public:
GET_GUIDE_FUNC_B(SIM_NAME_SHOWGUIDE, ShowGuide, true);
GET_GUIDE_FUNC_V3(SIM_NAME_COLOR, Color, (1, 1, 1));
GET_GUIDE_FUNC_B("usebox", UseBox, false);
protected:
explicit SNOW_Visualize(const SIM_DataFactory *factory);
virtual ~SNOW_Visualize();
virtual void initializeSubclass();
virtual bool getIsAlternateRepresentationSubclass() const;
virtual void initAlternateRepresentationSubclass(const SIM_Data &);
virtual SIM_Guide *createGuideObjectSubclass() const;
virtual void buildGuideGeometrySubclass(const SIM_RootData &root,
const SIM_Options &options,
const GU_DetailHandle &gdh,
UT_DMatrix4 *xform,
const SIM_Time &t) const;
static void createBoundingBoxGuide(GU_Detail *gdp,
const UT_BoundingBox &bbox,
const UT_Vector3 &color);
private:
static const SIM_DopDescription *getVisualizeDopDescription();
const SNOW_VoxelArray *myArray;
DECLARE_STANDARD_GETCASTTOTYPE();
DECLARE_DATAFACTORY(SNOW_Visualize,
SIM_Data,
"hdk_SnowVisualize",
getVisualizeDopDescription()
);
};
}
#endif