diff options
Diffstat (limited to 'mayaPlug/shaveHairUI.h')
| -rw-r--r-- | mayaPlug/shaveHairUI.h | 713 |
1 files changed, 713 insertions, 0 deletions
diff --git a/mayaPlug/shaveHairUI.h b/mayaPlug/shaveHairUI.h new file mode 100644 index 0000000..739d37f --- /dev/null +++ b/mayaPlug/shaveHairUI.h @@ -0,0 +1,713 @@ +#ifndef shaveHairUI_h +#define shaveHairUI_h + +// Shave and a Haircut +// (c) 2019 Epic Games +// US Patent 6720962 + +#include <maya/MPxSurfaceShapeUI.h> + +#ifdef OSMac_MachO_ +# include <OpenGL/gl.h> +# include <OpenGL/glu.h> +#elif defined LINUX +# include <GL/gl.h> +# include <GL/glu.h> +//# include <GL/glext.h> +# include <GL/glx.h> +#else +# include <GL/gl.h> +# include <GL/glu.h> +#endif + +#if MAYA_API_VERSION < 20180000 +class M3dView; +class MDrawInfo; +class MDrawRequest; +#endif + +#define NEW_DISPLAY +#define NEW_INSTNACE_DISPLAY + +#ifndef GL_CLAMP_TO_EDGE +#define GL_CLAMP_TO_EDGE 0x812F +#endif + +#ifndef GL_REPEAT +#define GL_REPEAT 0x2901 +#endif + +#ifndef GL_TEXTURE0 +#define GL_TEXTURE0 0x84C0 +#endif + +/// glsl defines + +#ifndef GL_VERTEX_SHADER +#define GL_VERTEX_SHADER 0x8B31 +#endif + +#ifndef GL_FRAGMENT_SHADER +#define GL_FRAGMENT_SHADER 0x8B30 +#endif + +#ifndef GL_COMPILE_STATUS +#define GL_COMPILE_STATUS 0x8B81 +#endif + +#ifndef GL_VALIDATE_STATUS +#define GL_VALIDATE_STATUS 0x8B83 +#endif + +#ifndef GL_INFO_LOG_LENGTH +#define GL_INFO_LOG_LENGTH 0x8B84 +#endif + +#ifndef GL_LINK_STATUS +#define GL_LINK_STATUS 0x8B82 +#endif + +//BFO defines + +#ifndef GL_FRAMEBUFFER_EXT +#define GL_FRAMEBUFFER_EXT 0x8D40 +#endif + +#ifndef GL_RENDERBUFFER_EXT +#define GL_RENDERBUFFER_EXT 0x8D41 +#endif + +#ifndef GL_COLOR_ATTACHMENT0_EXT +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#endif + +#ifndef GL_COLOR_ATTACHMENT1_EXT +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#endif + +#ifndef GL_COLOR_ATTACHMENT2_EXT +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#endif + +#ifndef GL_COLOR_ATTACHMENT3_EXT +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#endif + +#ifndef GL_COLOR_ATTACHMENT4_EXT +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#endif + +#ifndef GL_DEPTH_ATTACHMENT_EXT +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#endif + +#ifndef GL_STENCIL_ATTACHMENT_EXT +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#endif + +#ifndef GL_MAX_COLOR_ATTACHMENTS_EXT +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#endif + +#ifndef GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#endif + +#ifndef GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#endif + +#ifndef GL_RENDERBUFFER_WIDTH_EXT +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#endif + +#ifndef GL_RENDERBUFFER_HEIGHT_EXT +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#endif + +#ifndef GL_RENDERBUFFER_INTERNAL_FORMAT_EXT +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#endif + +#ifndef GL_FRAMEBUFFER_COMPLETE_EXT +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#endif + +#ifndef GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#endif + +#ifndef GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#endif + +#ifndef GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#endif + +#ifndef GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#endif + +#ifndef GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#endif + +#ifndef GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#endif + +#ifndef GL_FRAMEBUFFER_UNSUPPORTED_EXT +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#endif + +#ifndef GL_READ_FRAMEBUFFER_EXT +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#endif + +#ifndef GL_DRAW_FRAMEBUFFER_EXT +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#endif + +#ifdef NEW_INSTNACE_DISPLAY + +#if defined(WIN32) || defined(LINUX) +#ifndef GL_ACTIVE_TEXTURE +typedef void (APIENTRY * PFNGLATCIVETEXTUREPROC) (GLenum texture); +extern PFNGLATCIVETEXTUREPROC glActiveTexture; +#endif +#endif + +#if defined WIN32 +# define getGlFncPtr(name) wglGetProcAddress((LPCSTR)name) +#elif defined OSMac_ +// nothing is defined for osx +// # define getGlFncPtr(name) aglGetProcAddress(name) +#elif defined LINUX +# ifdef GLX_GLXEXT_LEGACY +# define getGlFncPtr(name) (*glXGetProcAddressARB)((const GLubyte*)name) +# else +# define getGlFncPtr(name) (*glXGetProcAddress)((const GLubyte*)name) +# endif +#endif + +#endif + +///////////////////////////// Profiling ////////////////////////////////////// + +//#define DO_PROFILE + +#ifdef DO_PROFILE +namespace Profile { +class LStrFile; +LStrFile* OpenDiagFile(); +LStrFile* GetDiagFile(); +void ProfileStart(LStrFile* f); +void ProfileDump(char* msg, LStrFile* f); +void ProfileEnd(LStrFile* f); +} +#endif +///////////////////////////////////////////////////////////////////////////// + +bool GLFunctionsInited(); +bool InitGLFunctionPointers(); + +////////////////////////////// GLSL /////////////////////////////////////////// + +class glslShader { +public: + virtual ~glslShader(){} + + virtual bool LoadShaders() = 0; + virtual void UnLoadShaders() = 0; + + virtual bool UseProgram() = 0; + virtual bool UnUseProgram() = 0; +}; + +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/ +| glslGenericProgram - generic glsl shader program | +/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +class glslGenericProgram : public glslShader { +public: + + + glslGenericProgram(); + virtual ~glslGenericProgram(); + + bool IsVadlid() const; + + //loads shaders from external files and preparing the stuff for run + bool LoadShaders(char* vShaderFile, char* fShaderFile); + + //loads build-in shaders and prepares stuff for run; + bool LoadShaders(); + void UnLoadShaders(); + + bool UseProgram(); + bool UnUseProgram(); + + //misc parameters + bool AddLight(); + bool SetLightDir(int idx, float x, float y, float z); + bool SetLightDir(int idx, const MVector& p); + bool SetLightPos(int idx, float x, float y, float z); + bool SetLightPos(int idx, const MVector& p); + + int GetNumLigths() const; + const MVector& GetLightDir(int idx) const; + const MVector& GetLightPos(int idx) const; + + GLuint GetProgram() const {return program();} + + enum _e_parameters + { + eMaxNumLights = 6 + }; + +protected: + + bool s_vertexErrDumped; + bool s_fragErrDumped; + bool s_linkErrDumped; + bool s_varErrDumped; + + + //shader and program generation + + enum + { + eVertShader, + eFragShader + }; + bool loadShader( GLuint shader, char* fn); //loades shader from external file + bool compileShader(GLuint shader, int vert_or_frag);//vert_or_frags is used to reduce error dumps + bool linkProgram (GLuint glprog); + + virtual void loadVertShader(GLuint shader) = 0; //loads internal vert shader + virtual void loadFragShader(GLuint shader) = 0; //loads internal frag shader + + //setups + virtual bool setupUniformVariables() = 0; + + + //const member acces + inline const MVector& lightDir(int i) const {return m_lightDir[i];} + inline int numLights() const {return m_numLights;} + inline const MVector& lightPos(int i) const {return m_lightPos[i];} + inline GLuint vShader() const {return m_vShader;} + inline GLuint fShader() const {return m_fShader;} + inline GLuint program() const {return m_program;} + + //member access + inline MVector& _lightDir(int i) {return m_lightDir[i];} + inline int& _numLights() {return m_numLights;} + inline MVector& _lightPos(int i) {return m_lightPos[i];} + inline GLuint& _vShader() {return m_vShader;} + inline GLuint& _fShader() {return m_fShader;} + inline GLuint& _program() {return m_program;} + +private: + + GLuint m_vShader; //view render shader + GLuint m_fShader; //view render shader + GLuint m_program; //veiw render program + + MVector m_lightDir[eMaxNumLights]; + int m_numLights; + + MVector m_lightPos[eMaxNumLights]; +}; + + +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/ +| glslHairProgram - default glsl shader program | +/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +class glslHairProgram : public glslGenericProgram { +public: + glslHairProgram(); + ~glslHairProgram(); + + inline GLint GetTangentLoc() const {return tangentLoc();} + + void SetSpecularTint(const MColor& c) {_specTint() = c;} + void SetSpecularTint2(const MColor& c) {_specTint2() = c;} + + //void SetUseSpecular2 (bool b) {_useSpec2() = b;} + //bool GetUseSpecular2() {return useSpec2();} + + void SetAmbDiff (float f) {_ambdiff() = f;} + float GetAmbDiff() {return ambdiff();} + + void SetSpecular (float f) { + _specular() = f; + //printf("specular (glossines) %f\n",f);fflush(stdout); + } + float GetSpecular() {return specular();} + + void SetSpecularAmt (float f) { + _specAmt() = f; + //printf("specularAmt %f\n",f);fflush(stdout); + } + float GetSpecularAmt() {return specAmt();} + + inline void SetUseSSAO(bool use){_useSSAO() = use;} + inline bool GetUseSSAO() const { return useSSAO(); } + + inline void SetViewSize(int w, int h){_viewWidth()=(float)w; _viewHeight()=(float)h;} + inline void SetUseLights(bool use, int num) {_useLights() = use; _numLights() = num;} + +protected: + //from glslGenericProgram + + void loadVertShader(GLuint shader); //loads internal vert shader + void loadFragShader(GLuint shader); //loads internal frag shader + void loadVertShadowShader(GLuint shader); //loads internal vert shader + void loadFragShadowShader(GLuint shader); //loads internal frag shader + + bool setupUniformVariables(); + + inline const MColor& specTint() const {return m_specTint;} + inline const MColor& specTint2() const {return m_specTint2;} + inline bool useSpec2() const {return m_useSpec2;} + inline float ambdiff() const {return m_ambdiff;} + inline float specular() const {return m_specular;} + inline float specAmt() const {return m_specAmt;} + inline bool useSSAO() const {return m_useSSAO;} + inline float viewWidth() const {return m_viewWidth;} + inline float viewHeight() const {return m_viewHeight;} + inline bool useLights() const {return m_useLights;} + inline int numLights() const {return m_numLights;} + + inline GLint tangentLoc() const {return m_tangentLoc;} + + inline MColor& _specTint() {return m_specTint;} + inline MColor& _specTint2() {return m_specTint2;} + inline bool& _useSpec2() {return m_useSpec2;} + inline float& _ambdiff() {return m_ambdiff;} + inline float& _specular() {return m_specular;} + inline float& _specAmt() {return m_specAmt;} + inline bool& _useSSAO() {return m_useSSAO;} + inline float& _viewWidth() {return m_viewWidth;} + inline float& _viewHeight(){return m_viewHeight;} + inline bool& _useLights() {return m_useLights;} + inline int& _numLights() {return m_numLights;} + inline GLint& _tangentLoc() {return m_tangentLoc;} + +private: + MColor m_specTint; + MColor m_specTint2; + bool m_useSpec2; + float m_ambdiff; + float m_specular; + float m_specAmt; + bool m_useSSAO; + float m_viewWidth; + float m_viewHeight; + bool m_useLights; + int m_numLights; + GLint m_tangentLoc; +}; + + +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/ +| glslSSAOdepthShader - SSAO pass 1 | +/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +class glslSSAOdepthShader : public glslGenericProgram { +public: + glslSSAOdepthShader(){} + virtual ~glslSSAOdepthShader(){} + + void SetFarNear(GLfloat f, GLfloat n){_zfar() = f; _znear() = n;} + +protected: + //from glslGenericProgram + // + void loadVertShader(GLuint shader); //loads internal vert shader + void loadFragShader(GLuint shader); //loads internal frag shader + + bool setupUniformVariables(); + + //const member access + inline GLfloat zfar() const {return m_zfar;} + inline GLfloat znear() const {return m_znear;} + + //member access + inline GLfloat& _zfar() {return m_zfar;} + inline GLfloat& _znear() {return m_znear;} + +private: + GLfloat m_zfar; + GLfloat m_znear; +}; + +/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/ +| glslSSAOshader - for ssao pass 2 | +/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + +class glslSSAOshader : public glslGenericProgram { +public: + glslSSAOshader(); + virtual ~glslSSAOshader(){} + + void SetRadius (GLfloat r) {_radius() = r;} + void SetSamples(GLint s) {_samples() = s;} + +protected: + //from glslGenericProgram + // + void loadVertShader(GLuint shader); //loads internal vert shader + void loadFragShader(GLuint shader); //loads internal frag shader + + bool setupUniformVariables(); + + ////const member accesss + inline GLfloat radius() const {return m_radius;} + inline GLint samples()const {return m_samples;} + + ////member access + inline GLfloat& _radius() {return m_radius;} + inline GLint& _samples(){return m_samples;} + +private: + GLfloat m_radius; + GLint m_samples; +}; + +//////////////////////////// SSAO //////////////////////////////////////////// + +class Matrix4 { +public: + float entries[16]; + + Matrix4(){ LoadIdentity(); } + Matrix4(float e0, float e1, float e2, float e3, + float e4, float e5, float e6, float e7, + float e8, float e9, float e10, float e11, + float e12, float e13, float e14, float e15) + { + entries[0]=e0; + entries[1]=e1; + entries[2]=e2; + entries[3]=e3; + entries[4]=e4; + entries[5]=e5; + entries[6]=e6; + entries[7]=e7; + entries[8]=e8; + entries[9]=e9; + entries[10]=e10; + entries[11]=e11; + entries[12]=e12; + entries[13]=e13; + entries[14]=e14; + entries[15]=e15; + } + Matrix4(const float * rhs) + { + memcpy(entries, rhs, 16*sizeof(float)); + } + Matrix4(const Matrix4& rhs) + { + memcpy(entries, rhs.entries, 16*sizeof(float)); + } + void LoadIdentity() + { + memset(entries, 0, 16*sizeof(float)); + entries[0]=1.0f; + entries[5]=1.0f; + entries[10]=1.0f; + entries[15]=1.0f; + } + void LoadZero() + { + memset(entries, 0, 16*sizeof(float)); + } + //cast to pointer to a (float *) for glGetFloatv etc + operator float* () const {return (float*) this;} + operator const float* () const {return (const float*) this;} +}; + +class ssaoFBO { +public: + ssaoFBO(unsigned int w = 512, unsigned int h = 512); + ~ssaoFBO(); + + void Init(); + + bool MakeCurrent(); + + bool ResetCurrent(); + bool ActivateTexture(int samplerIdx); + + void Destroy(); + + GLuint GetTexHandle() const { return texid(); } + unsigned int GetWidth() const { return width(); } + unsigned int GetHeight() const { return height(); } + bool IsInitOK() const { return initOK(); } + +protected: + + //const membe access + inline unsigned int width() const {return m_width;} + inline unsigned int height() const {return m_height;} + inline GLuint texid() const {return m_texid;} + inline GLuint fboid() const {return m_fboid;} + inline GLuint rboid() const {return m_rboid;} + + inline const Matrix4& cameraProjectionMatrix()const {return m_cameraProjectionMatrix; } + inline const Matrix4& cameraViewMatrix() const {return m_cameraViewMatrix; } + inline GLint* origView() const {return m_origView;} + inline bool initOK() const {return m_initOK;} + + //member access + inline unsigned int& _width() {return m_width;} + inline unsigned int& _height() {return m_height;} + inline GLuint& _texid() {return m_texid;} + inline GLuint& _fboid() {return m_fboid;} + inline GLuint& _rboid() {return m_rboid;} + + inline Matrix4& _cameraProjectionMatrix(){return m_cameraProjectionMatrix; } + inline Matrix4& _cameraViewMatrix() {return m_cameraViewMatrix; } + inline GLint*& _origView() {return m_origView;} + inline bool& _initOK() {return m_initOK;} + +private: + + unsigned int m_width; + unsigned int m_height; + GLuint m_texid; + GLuint m_fboid; //frame buffer object id + GLuint m_rboid; //render buffer object id + + GLuint m_depthRB; //render buffer object id + GLuint m_colorRB; //render buffer object id + GLuint m_resolveFB; //render buffer object id + + + Matrix4 m_cameraProjectionMatrix; + Matrix4 m_cameraViewMatrix; + + GLint* m_origView; + bool m_initOK; + +}; + + + +////////////////////// LEGACY DISPLAY STUFF ////////////////////////////////// +extern bool incrementaldraw; + +class shaveHairUI : public MPxSurfaceShapeUI +{ +public: + enum + { + kDrawNone, + kDrawBBox, + kDrawGuides, + kDrawActiveGuides, + kDrawInactiveGuides, + kDrawHairs, + kDrawActiveShadedHairs, + kDrawInactiveShadedHairs, + kDrawActiveRoots, + kDrawInactiveRoots, + kDrawActiveTips, + kDrawInactiveTips, + kDrawActiveVerts, + kDrawInactiveVerts, + kDrawInstancedWire, + kDrawInstancedShaded, + kDrawInstancedShadedOffset, + //////// incremental update trick /////// + kFirstCacheUpdate, + kNextCacheUpdate + }; + + static void* creator() + { + InitGlsl(); + return new shaveHairUI; + } + static bool InitGlsl(); + + + virtual void draw(const MDrawRequest& request, M3dView& view) const; + + virtual void getDrawRequests( + const MDrawInfo& drawInfo, + bool objAndActive, + MDrawRequestQueue& requests + ); + + virtual bool select( + MSelectInfo &selectInfo, + MSelectionList &selectionList, + MPointArray &worldSpaceSelectPts + ) const; + + static void setBrushActive(bool isActive); + +protected: + // + // Utility Methods + // + void drawBoundingBox() const; + void drawGuides(int drawToken, M3dView& view) const; + void drawHairs(int drawToken, M3dView& view) const; + //ssao passes + void drawSsaoDepth( int drawToken, M3dView& view, const shaveHairShape::DisplayHairCache& cache, const MVector& viewDir) const; + void drawSsao( int drawToken, M3dView& view, const shaveHairShape::DisplayHairCache& cache, const MVector& viewDir ) const ; +#ifdef NEW_INSTNACE_DISPLAY + void drawInstances(int drawToken, M3dView& view) const; +#endif + void drawVerts(int drawToken) const; + + bool selectGuides( + MSelectInfo& selectInfo, + MSelectionList& selectionList, + MPointArray& worldSpaceSelectPts + ) const; + + bool selectObjByGuides( + MSelectInfo& selectInfo, + MSelectionList& selectionList, + MPointArray& worldSpaceSelectPts + ) const; + + bool selectObjByHairs( + MSelectInfo& selectInfo, + MSelectionList& selectionList, + MPointArray& worldSpaceSelectPts + ) const; + + bool selectObjByGeom( + MSelectInfo& selectInfo, + MSelectionList& selectionList, + MPointArray& worldSpaceSelectPts + ) const; + + bool selectVerts( + MString selectMode, + MSelectInfo& selectInfo, + MSelectionList& selectionList, + MPointArray& worldSpaceSelectPts + ) const; + + void setWireframeColor( + MDrawRequest& request, + M3dView& view, + M3dView::DisplayStatus dStatus + ) const; + + static bool mBrushIsActive; + + +}; + +#endif |