Files
2022-10-26 12:25:11 +08:00

317 lines
11 KiB
C++

// managervertexshader.h
#ifndef _3DRENDERER_MANAGERVERTEXSHADER_H_
#define _3DRENDERER_MANAGERVERTEXSHADER_H_
#include "managerbase.h"
#include "managerd3d.h"
#include <fvec.h>
enum ENUM_VERTEX_SHADER_TYPE
{
VST_NONE = 0,
// --- Unit 관련
VST_NLINK_BONETRANSFORM_FIRST,
VST_BONETRANSFORM_FIRST = VST_NLINK_BONETRANSFORM_FIRST,
//{ -------------------------------------------------------------
VST_BONETRANSFORM = VST_BONETRANSFORM_FIRST, // 유닛
VST_BONETRANSFORM_2L,
VST_BONETRANSFORM_UVNORMAL, // Normal 을 참조해서 uv 적용
VST_BONETRANSFORM_UV1DNORMAL,
VST_BONETRANSFORM_MEMBRANE, // Membrane
VST_BONETRANSFORM_UVLIGHT, // Light 방향 를 참조해서 uv 적용
VST_BONETRANSFORM_UVCHAOS, //
VST_BONETRANSFORM_SPECULAR, // 스페큘러 적용
VST_BONETRANSFORM_SPECULAR_2L,
VST_BONETRANSFORM_PSPECULAR, // 픽셀당 스페큘러맵 적용
VST_BONETRANSFORM_PSPECULAR_2L,
VST_BONETRANSFORM_FOR_NORMALMAP, // Normal map 사용
VST_BONETRANSFORM_FOR_NORMALMAP_2L, // Normal map 사용 ( Light 2 개 )
VST_BONETRANSFORM_FOR_INORMALMAP, // Normal map with Irradiance 사용
VST_BONETRANSFORM_FOR_INORMALMAP_2L,// ( Light 2 개 )
VST_BONETRANSFORM_PHONG, // Phong shading 용
VST_BONETRANSFORM_HAZE,
VST_BONETRANSFORM_REFRACTION_MASK,
VST_BONETRANSFORM_INFLATION,
VST_BONETRANSFORM_INFLATION_2L,
//} -------------------------------------------------------------
VST_BONETRANSFORM_LAST = VST_BONETRANSFORM_INFLATION_2L,
// --- Unit 2-Link 관련
VST_2BONETRANSFORM,
VST_2BONETRANSFORM_2L,
VST_2BONETRANSFORM_UVNORMAL,
VST_2BONETRANSFORM_UV1DNORMAL,
VST_2BONETRANSFORM_MEMBRANE,
VST_2BONETRANSFORM_UVLIGHT,
VST_2BONETRANSFORM_UVCHAOS, //
VST_2BONETRANSFORM_SPECULAR, // 스페큘러 적용
VST_2BONETRANSFORM_SPECULAR_2L,
VST_2BONETRANSFORM_PSPECULAR, // 픽셀당 스페큘러맵 적용
VST_2BONETRANSFORM_PSPECULAR_2L,
VST_2BONETRANSFORM_FOR_NORMALMAP,
VST_2BONETRANSFORM_FOR_NORMALMAP_2L,
VST_2BONETRANSFORM_FOR_INORMALMAP,
VST_2BONETRANSFORM_FOR_INORMALMAP_2L,
VST_2BONETRANSFORM_PHONG, // Phong shading 용
VST_2BONETRANSFORM_HAZE,
VST_2BONETRANSFORM_REFRACTION_MASK,
VST_2BONETRANSFORM_INFLATION,
VST_2BONETRANSFORM_INFLATION_2L,
// --- Unit 2-Link 관련
VST_3BONETRANSFORM,
VST_3BONETRANSFORM_2L,
VST_3BONETRANSFORM_UVNORMAL,
VST_3BONETRANSFORM_UV1DNORMAL,
VST_3BONETRANSFORM_MEMBRANE,
VST_3BONETRANSFORM_UVLIGHT,
VST_3BONETRANSFORM_UVCHAOS, //
VST_3BONETRANSFORM_SPECULAR, // 스페큘러 적용
VST_3BONETRANSFORM_SPECULAR_2L,
VST_3BONETRANSFORM_PSPECULAR, // 픽셀당 스페큘러맵 적용
VST_3BONETRANSFORM_PSPECULAR_2L,
VST_3BONETRANSFORM_FOR_NORMALMAP,
VST_3BONETRANSFORM_FOR_NORMALMAP_2L,
VST_3BONETRANSFORM_FOR_INORMALMAP,
VST_3BONETRANSFORM_FOR_INORMALMAP_2L,
VST_3BONETRANSFORM_PHONG, // Phong shading 용
VST_3BONETRANSFORM_HAZE,
VST_3BONETRANSFORM_REFRACTION_MASK,
VST_3BONETRANSFORM_INFLATION,
VST_3BONETRANSFORM_INFLATION_2L,
VST_NLINK_BONETRANSFORM_LAST = VST_3BONETRANSFORM_INFLATION_2L,
VST_BONETRANSFORM_LIGHTMAP,
VST_BONETRANSFORM_LIGHTMAP_2L,
VST_BONETRANSFORM_REFRACTION_GLASS, // 굴절용 - 유리
VST_BONETRANSFORM_REFRACTION_GLASS_2L,
VST_BONETRANSFORM_REFRACTION_CHAOS, // 굴절용 - 울렁울렁
VST_BONETRANSFORM_REFRACTION_INVERSE, // 굴절용 - 반전
VST_BONETRANSFORM_FOR_NORMALMAP_REFRACTION_GLASS, // 노말맵 굴절용(NoSunLight) - 유리
VST_BONETRANSFORM_FOR_INORMALMAP_REFRACTION_GLASS,
VST_BONETRANSFORM_FOR_INORMALMAP_REFRACTION_GLASS_2L,
// --- 그림자 관련
VST_SHADOW_MAP_FIRST,
//{ -------------------------------------------------------------
VST_BONETRANSFORM_SHADOW_MAP = VST_SHADOW_MAP_FIRST,
VST_BONETRANSFORM_SHADOW_MAP_DRAW,
VST_BONETRANSFORM_SHADOW_MAP_DRAW_H,
//{ -------------------------------------------------------------
VST_SHADOW_MAP_LAST,
VST_2BONETRANSFORM_SHADOW_MAP = VST_SHADOW_MAP_LAST,
VST_2BONETRANSFORM_SHADOW_MAP_DRAW,
VST_2BONETRANSFORM_SHADOW_MAP_DRAW_H,
VST_3BONETRANSFORM_SHADOW_MAP,
VST_3BONETRANSFORM_SHADOW_MAP_DRAW,
VST_3BONETRANSFORM_SHADOW_MAP_DRAW_H,
VST_OCCLUSION_CULL,
// --- Instancing 관련
VST_INSTANCING,
// --- Effect 관련
VST_EFFECT_REFRACTION_GLASS, // 효과(검기) 굴절
// --- 2D 관련
VST_2D_PCT, // 2D Position/Color/Texture
VST_2D_REFRACTION_PCT, // 2D 굴절용 Position/Color/Texture
// --- Terrain 관련
VST_TERRAIN, // 지형
VST_TERRAIN_LIGHTMAP, // 지형 + 라이트맵
VST_TERRAIN_SHADOW_MAP_DRAW,
VST_TERRAIN_SHADOW_MAP_DRAW_PROJECTED,
VST_TERRAIN_WATER,
VST_TERRAIN_WATER11,
VST_TERRAIN_SPECULAR,
VST_TERRAIN_DETAIL,
VST_TERRAIN_SPECULAR_DETAIL,
VST_TERRAIN_HAZE,
VST_TERRAIN_GLOW,
VST_TERRAIN_NORMALMAP,
// --- Post Effect 관련
// glow
VST_POSTEFF_GLOW_COPY_FROM_BACKBUFFER, // Back buffer 에서 얻어옴
VST_POSTEFF_GLOW_MIXANDMIX, // 두 버퍼를 통해 섞기
VST_POSTEFF_GLOW_APPLY_TO_BACKBUFFER, // 섞은 결과를 Back buffer 에 적용
// motion blur
VST_POSTEFF_MOTION_BLUR_COPY_TO_PREVBUFFER, // 이전 프레임버퍼에 현재 프레임 복사
VST_POSTEFF_MOTION_BLUR_BLENDING, // 이전프레임과 현재프레임의 블렌딩
// gray scale
VST_POSTEFF_GRAYSCALE_FINAL, // 전 처리 없이 바로 Back buffer 에 적용
VST_POSTEFF_UNIT_MOTIONBLUR_BLENDING, // 유닛단위로 이전 프레임과 현재 프레임의 블렌딩
VST_POSTEFF_DOF, // vertex shader for DOF
VST_SUN_MASKING,
VST_STREE_BRANCH,
VST_STREE_BRANCH_SHADOW,
VST_STREE_LEAF,
VST_STREE_LEAF_SHADOW,
VST_STREE_BILLBOARD,
VST_STREE_BRANCH_SHADOW_MAP_DRAW,
#ifdef _NA_007863_20141203_VOLUME_LIGHT_SCATTERING
VST_POSTEFF_SUNLIGHT, // 볼륨라이트 Scattering
#endif // _NA_007863_20141203_VOLUME_LIGHT_SCATTERING
NUM_VST
};
const int NUM_BONETRANSFORM = (VST_BONETRANSFORM_LAST - VST_BONETRANSFORM_FIRST + 1);
const int NUM_NLINK_BONETRANSFORM = (VST_NLINK_BONETRANSFORM_LAST - VST_NLINK_BONETRANSFORM_FIRST + 1);
#define IS_BONETRANSFORM( vst ) \
( VST_BONETRANSFORM_FIRST <= (vst) && VST_BONETRANSFORM_LAST >= (vst) )
#define IS_NLINK_BONETRANSFORM( vst ) \
( VST_NLINK_BONETRANSFORM_FIRST <= (vst) && VST_NLINK_BONETRANSFORM_LAST >= (vst) )
typedef struct
{
LPDIRECT3DVERTEXSHADER9 m_lpVS; // vertex shader
LPDIRECT3DVERTEXDECLARATION9 m_lpVD; // vertex declaration
LPD3DXCONSTANTTABLE m_lpCT; // constant table
} St_VertexShaderObject;
/// @name Default Vertex Shader Constants
#define DVSC_CLIPMATRIX ( 0x00000001)
#define DVSC_LIGHT ( 0x00000002)
#define DVSC_COLOR ( 0x00000004)
#define DVSC_CAMERA ( 0x00000008)
#define DVSC_FOG ( 0x00000010)
#define DVSC_OTHERS ( 0x00000020)
#define DVSC_ALL ( 0x000000FF)
class CManagerVertexShader : public CManagerBase, CManagerD3D
{
public:
CManagerVertexShader(void);
virtual ~CManagerVertexShader(void);
virtual void Clear();
virtual BOOL Create( CDrawBase *pParentDraw, void *pParam);
virtual void Destroy();
virtual void OnLostDevice();
virtual void OnResetDevice();
// 초기화
protected:
DWORD m_dwVertexShaderVersion;
BOOL m_bShaderVersion11;
BOOL m_bShaderVersion20;
DWORD m_dwNumConstant;
BOOL m_bUseFog;
BOOL m_bInstancing;
public:
virtual BOOL CheckShaderVersion( DWORD dwMajor, DWORD dwMinor);
//! 빠른체크 - 상수형 인자값에 대한 CheckShaderVersion() 함수 리턴값일 미리 저장해서 사용.
virtual BOOL CheckShaderVersion11() const { return m_bShaderVersion11; } // 1.1 지원여부
virtual BOOL CheckShaderVersion20() const { return m_bShaderVersion20; } // 2.0 지원여부
virtual BOOL CheckBoneTransform( int iNumBone);
virtual int GetMaxNumBoneToTransform();
virtual BOOL CheckInstancing(){ return m_bInstancing;} // Instancing 지원 여부
// Vertex Shader Object 관리
protected:
St_VertexShaderObject m_vsoList[NUM_VST];
int m_iVSVersionNumberToUse; // 사용할 VS 버전 ( 0 - 1.1, 1 - 2.0)
void CreateVos( char *lpszShaderPath);
void DestroyVos();
void CheckVSVersionNumberToUse();
BOOL CatShaderFileName( char *lpszFilePath, int iIndex, BOOL bHLSL, int iTrial = 0);
BOOL CreateVSFromAscii( int iIndex, char *lpszFileName, BOOL bHLSL);
BOOL CreateVSFromBinary( int iIndex, char *lpszFileName, BOOL bHLSL);
public:
virtual BOOL UseVos( int iVst, void* pParam = NULL) { return ( UseVos( ( ENUM_VERTEX_SHADER_TYPE)iVst, pParam)); }
BOOL CheckVos( int iVst) { return ( CheckVos( ( ENUM_VERTEX_SHADER_TYPE)iVst)); }
virtual BOOL CheckVos( ENUM_VERTEX_SHADER_TYPE eVst);
void SetBoneMatrixOnConstant( WzMatrix *pwmTransform, int iNumBone, void* pvParam=NULL);
void SetWorldMatrixOnConstantForInstancing( CWzArray<St_InstancingInfo*>* parInstancingInfo, int iArraySize, int iStartIndex );
// 설정값
protected:
WzVector m_wvFactorForUVNormal[2];
WzUVVert m_wuvShift;
ENUM_SHADING_TYPE m_eShadingType;
WzColor m_wcDrawColor;
WzColor m_wcAmbient;
float m_fSpecular[4];
float m_fRefractionRate;
float m_fInflationFactor;
float m_fDetailTextureScale;
float m_fTweeningFactor[2];
float m_fHazeDist;
public:
void SetFactorForUVNormal( WzVector *pwvFactorForUVNormal);
void SetUVShift( WzUVVert *pwuvShift = NULL);
void SetShadingType( ENUM_SHADING_TYPE eShadingType) { m_eShadingType = eShadingType; }
void SetDiffuseColor( WzColor wcDrawColor) { m_wcDrawColor = wcDrawColor; }
void SetSpecularColor( WzColor wcColor, float fIntensity);
void SetAmbientColor( WzColor wcColor) { m_wcAmbient = wcColor; }
void SetRefractionRate( float fRefractionRate) { m_fRefractionRate = fRefractionRate; }
void SetInflationFector( float fInflationFactor) { m_fInflationFactor = fInflationFactor; }
void SetDetailTextureScale( float fScale ){ m_fDetailTextureScale = fScale; }
void SetTweeningFactor( int index, float fWeight ) { m_fTweeningFactor[index] = fWeight; }
void SetHazeDist( float fHazeDist){ m_fHazeDist = fHazeDist; }
public:
enum { MAX_DEFAULT_CONSTANT = 20 };
// 표준 Shader 처리
virtual BOOL UseVos( ENUM_VERTEX_SHADER_TYPE eVst, void* pParam = NULL) { return UseDefaultVos(eVst); }
// 표준 외 Shader 처리를 위한 함수
BOOL SetFog( ENUM_VERTEX_SHADER_TYPE eVst);
BOOL SetShaderConstants( const float* pConstants, int iStartIndex, int iVec4Count);
BOOL SetShaderConstantsMatrix( const WzMatrix* pwmConstants, int iStartIndex);
BOOL SetShaderDeclaration( ENUM_VERTEX_SHADER_TYPE eVst);
BOOL SetShader( ENUM_VERTEX_SHADER_TYPE eVst);
const float* FillDefaultConstants( DWORD dwFlags = DVSC_ALL, BOOL bHlsl = TRUE);
const float* GetDefaultConstants(int iIndex=0) const { return m_fDefaultConstant[iIndex]; }
enum { MAX_2D_CONSTANTS = 256 };
int GetNumberOf2DConstants() const { return m_iNum2DConstant; }
float* Get2DConstants(int iIndex=0) { return &m_f2DConstant[iIndex][0]; }
protected:
BOOL UseDefaultVos( ENUM_VERTEX_SHADER_TYPE eVst);
protected:
union
{
__m128 m_fDefaultConstantA16[MAX_DEFAULT_CONSTANT];
float m_fDefaultConstant[MAX_DEFAULT_CONSTANT][4];
};
float m_f2DConstant[MAX_2D_CONSTANTS][4];
int m_iNum2DConstant;
protected:
WzDeclare_Sync( VertexShader);
};
#endif // _3DRENDERER_MANAGERVERTEXSHADER_H_