#ifndef ShavePerVertTexInfo_h #define ShavePerVertTexInfo_h // Shave and a Haircut // (c) 2019 Epic Games // US Patent 6720962 // This class is used to store a node's per-vertex texture data. class ShavePerVertTexInfo { public: ShavePerVertTexInfo(); virtual ~ShavePerVertTexInfo(); // Only a small number of hair parameters are applied per-vertex, as // opposed to per-hair. These next three methods provide a compact // enumeration for these parameters from 0 to numParams()-1 // Returns the total number of per-vertex parameters available. static unsigned int numParams() { return mNumVertParams; } // Stores in 'paramIdx' the index from 0 to numParams()-1 of the given // parameter number and returns true. // If 'paramNumber' is not a per-vertex parameter // then false is returned and the value of 'paramIdx' is undefined. static bool getParamIdx(int paramNumber, unsigned int& paramIdx); // Returns the parameter number of the i'th per-vertex parameter. // Returns -1 if 'paramIdx' is invalid. static int getParamNumber(unsigned int paramIdx); float getValue( unsigned int paramIdx, unsigned int vertIdx ) const; // This must be called before storing any texture values. If there is // existing texture data it will be deleted. void init(unsigned int numVertices); static bool isPerVertParam(int paramNumber); bool setValue( unsigned int paramIdx, unsigned int vertIdx, float value ); protected: void clear(bool all); bool mIsInitialized; unsigned int mNumVertices; float** mTextureValues; static const int mVertParams[]; static const unsigned int mNumVertParams; }; inline bool ShavePerVertTexInfo::getParamIdx( int paramNumber, unsigned int& paramIdx ) { for (paramIdx = 0; paramIdx < mNumVertParams; ++paramIdx) if (mVertParams[paramIdx] == paramNumber) return true; paramIdx = 0; return false; } inline int ShavePerVertTexInfo::getParamNumber(unsigned int paramIdx) { if (paramIdx < mNumVertParams) return mVertParams[paramIdx]; return -1; } inline float ShavePerVertTexInfo::getValue( unsigned int paramIdx, unsigned int vertIdx ) const { if ((mTextureValues != 0) && (paramIdx < mNumVertParams) && (mTextureValues[paramIdx] != 0) && (vertIdx < mNumVertices)) { return mTextureValues[paramIdx][vertIdx]; } return 1.0f; } inline bool ShavePerVertTexInfo::isPerVertParam(int paramNum) { for (unsigned int i = 0; i < mNumVertParams; ++i) if (mVertParams[i] == paramNum) return true; return false; } #endif