OpenSubdiv/examples/mayaPtexViewer/OpenSubdivPtexShader.h

197 lines
6.0 KiB
C
Raw Normal View History

//
// Copyright 2013 Pixar
//
// Licensed under the Apache License, Version 2.0 (the "Apache License")
// with the following modification; you may not use this file except in
// compliance with the Apache License and the following modification to it:
// Section 6. Trademarks. is deleted and replaced with:
//
// 6. Trademarks. This License does not grant permission to use the trade
// names, trademarks, service marks, or product names of the Licensor
// and its affiliates, except as required to comply with Section 4(c) of
// the License and to reproduce the content of the NOTICE file.
//
// You may obtain a copy of the Apache License at
//
// http://www.apache.org/licenses/LICENSE-2.0
2013-07-18 21:19:50 +00:00
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the Apache License with the above modification is
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the Apache License for the specific
// language governing permissions and limitations under the Apache License.
//
#ifndef EXAMPLES_MAYAPTEXVIEWER_OPENSUBDIVPTEXSHADER_H_
#define EXAMPLES_MAYAPTEXVIEWER_OPENSUBDIVPTEXSHADER_H_
// full include needed for scheme/interp enums
// class OsdPtexMeshData;
#include "osdPtexMeshData.h"
#include <osd/glDrawContext.h>
#include <osd/glPtexTexture.h>
#include <maya/MPxHwShaderNode.h>
#include <maya/MViewport2Renderer.h>
#include <maya/MImage.h>
class OpenSubdivPtexShader : public MPxHwShaderNode
{
public:
OpenSubdivPtexShader();
virtual ~OpenSubdivPtexShader();
// MPxNode methods
static void *creator();
static MStatus initialize();
// MPxNode virtuals
virtual void postConstructor();
virtual MStatus compute(const MPlug &plug, MDataBlock &data);
virtual bool getInternalValueInContext(const MPlug &plug, MDataHandle &handle, MDGContext &);
virtual bool setInternalValueInContext(const MPlug &plug, const MDataHandle &handle, MDGContext &);
// MPxHwShaderNode virtuals
virtual MStatus renderSwatchImage(MImage & image);
//
// Non-Viewport 2.0 rendering: geometry/glGeometry, bind/glBind and unbind/glUnbind
// are not implemented at this time. mayaViewer must be run under Viewport 2.0.
//
void updateAttributes();
void draw(const MHWRender::MDrawContext &context, OsdPtexMeshData *data);
// Accessors
void setHbrMeshDirty(bool dirty) { _hbrMeshDirty = dirty; }
bool getHbrMeshDirty() { return _hbrMeshDirty; }
int getLevel() const { return _level; }
bool isAdaptive() const { return _adaptive; }
OsdPtexMeshData::SchemeType getScheme() const { return _scheme; }
OsdPtexMeshData::KernelType getKernel() const { return _kernel; }
OsdPtexMeshData::InterpolateBoundaryType getInterpolateBoundary() const { return _interpolateBoundary; }
// Identifiers
static MTypeId id;
static MString drawRegistrantId;
// Offsets from GL_TEXTURE0
static const int CLR_TEXTURE_UNIT = 5;
static const int DISP_TEXTURE_UNIT = 8;
static const int OCC_TEXTURE_UNIT = 11;
static const int DIFF_TEXTURE_UNIT = 14;
static const int ENV_TEXTURE_UNIT = 15;
private:
void updateRegistry();
GLuint bindTexture(const MString& filename, int textureUnit);
GLuint bindProgram(const MHWRender::MDrawContext & mDrawContext,
OpenSubdiv::OsdGLDrawContext *osdDrawContext,
const OpenSubdiv::OsdPatchArray & patch);
OpenSubdiv::OsdGLPtexTexture * loadPtex(const MString &filename);
bool bindPtexTexture(const MString& ptexFilename,
OpenSubdiv::OsdGLPtexTexture **osdPtexPtr,
int samplerUnit);
// OSD attributes
static MObject aLevel;
static MObject aTessFactor;
static MObject aScheme;
static MObject aKernel;
static MObject aInterpolateBoundary;
static MObject aAdaptive;
static MObject aWireframe;
// Material attributes
static MObject aDiffuse;
static MObject aAmbient;
static MObject aSpecular;
// Shader
static MObject aShaderSource;
// Ptex-specific attributes
static MObject aDiffuseEnvironmentMapFile;
static MObject aSpecularEnvironmentMapFile;
static MObject aColorFile;
static MObject aDisplacementFile;
static MObject aOcclusionFile;
static MObject aEnableDisplacement;
static MObject aEnableColor;
static MObject aEnableOcclusion;
static MObject aEnableNormal;
static MObject aFresnelBias;
static MObject aFresnelScale;
static MObject aFresnelPower;
private:
// OSD parameters
int _level;
int _tessFactor;
bool _adaptive;
bool _wireframe;
OsdPtexMeshData::SchemeType _scheme;
OsdPtexMeshData::KernelType _kernel;
OsdPtexMeshData::InterpolateBoundaryType _interpolateBoundary;
// Material parameters
MColor _diffuse;
MColor _ambient;
MColor _specular;
// Texture manager
MHWRender::MTextureManager *_theTextureManager;
// Ptex-specific parameters
bool _enableColor;
bool _enableDisplacement;
bool _enableOcclusion;
bool _enableNormal;
MString _ptexColorFile;
MColor _ptexDisplacementFile;
MColor _ptexOcclusionFile;
OpenSubdiv::OsdGLPtexTexture * _ptexColor;
OpenSubdiv::OsdGLPtexTexture * _ptexDisplacement;
OpenSubdiv::OsdGLPtexTexture * _ptexOcclusion;
MString _colorFile;
MString _displacementFile;
MString _occlusionFile;
MString _diffEnvMapFile;
MString _specEnvMapFile;
float _fresnelBias;
float _fresnelScale;
float _fresnelPower;
// Shader
std::string _shaderSource;
MString _shaderSourceFilename;
// Plugin flags
bool _hbrMeshDirty;
bool _adaptiveDirty;
bool _diffEnvMapDirty;
bool _specEnvMapDirty;
bool _ptexColorDirty;
bool _ptexDisplacementDirty;
bool _ptexOcclusionDirty;
bool _shaderSourceDirty;
};
#endif // EXAMPLES_MAYAPTEXVIEWER_OPENSUBDIVPTEXSHADER_H_