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

391 lines
11 KiB
Objective-C

// rendercommand.h
#ifndef _3DRENDERER_RENDERCOMMAND_H_
#define _3DRENDERER_RENDERCOMMAND_H_
#include "typedef.h"
#include <client/3dengine/3dfileaccess/wzdbase/wzdbase.h>
#include <client/3dengine/3dfileaccess/wzunit/wzunitdraw.h>
#define RCF_NONE (0x00000000)
#define RCF_SINGLEPASS_PHONG (0x00000001) // Single pass Phong 중 ( Shader 에 의함 )
#define RCF_ENABLE_SPECULAR (0x00000002) // Specular 사용 유무(default:FALSE)
#define RCF_ALPHATEXTURE_FILTER (0x00000004) // 알파만 사용하는 texture filter
#define RCF_WITH_IRRADIANCEMAP (0x00000008) // Irradiance를 이용한 Normap Map을 사용할 경우.
#define RCF_MODULATE2X (0x00000010) // Modulate2X(default:FALSE)
#define RCF_SHADOW_CAST (0x00000020) // Shadow Rendering 중
#define RCF_SHADOW_RECEIVE (0x00000040) // Shadow Rendering 중
#define RCF_BRIGHTNESS_FUNC_MATTER (0x00000080) // Brightness func 값이 세팅되어있는가
#define RCF_ENABLE_GLOW (0x00000100) // GlowMap 사용
#define RCF_ENABLE_HAZE (0x00000200) // Haze 사용
#define RCF_ENABLE_REFRACTION_MASK (0x00000400) // Refraction Mask 사용
#define RCF_ENABLE_CUSTOM_LIGHT (0x00000800) // Custom Light 사용
#define RCF_DEFAULT RCF_WITH_IRRADIANCEMAP
// RenderCommand로부터 소트 우선 순위
enum ENUM_SORT_PRIORITY
{
ESP_NONE = 0,
ESP_DEPTH, // 카메라와의 깊이값에 따라 알파가 아닌 Mesh를 앞에서부터 그리도록
ESP_BUFFER, // 같은 버퍼를 사용하는 Mesh끼리 모아서 그리도록
ESP_TEXTURE, // 같은 텍스처를 사용하는 Mesh끼리 모아서 그리도록
ESP_RENDERSTATE, // 같은 렌더스테이트를 사용하는 Mesh끼리 모아서 그리도록
NUM_ESP
};
//------------------------------------------------------------------------------
/**
@struct St_AlterRender
*/
struct St_AlterRender
{
ENUM_ALTERNATIVE_RENDER eRenderType;
union
{
// eRenderType이 굴절일 경우에만 유효
struct
{
float fRefractionRate;
float fRefractionAlpha;
};
};
};
//------------------------------------------------------------------------------
/**
@struct St_BaseRenderCommand
*/
struct St_BaseRenderCommand
{
enum ENUM_RENDERCOMMAND_TYPE
{
ERCT_UNIT = 0,
ERCT_TRIANGLEBASED,
ERCT_SPRITE,
ERCT_NEW_SPRITE,
ERCT_EFFECT,
ERCT_UNIT_INSTANCING,
};
ENUM_RENDERCOMMAND_TYPE m_eRCType; // Unit인지 Triangle-based인지
ENUM_ALTERNATIVE_RENDER m_eRenderType; // Unit일 경우, m_pUnitDraw 내부값으로부터 얻어온다.
union
{
// 비교 대상값
float m_fSortResult; // depth 비교시 사용
DWORD m_dwSortResult; // buffer, texture, renderstate 비교시 사용
int m_iCurSortIndex; // 현재 소트 인덱스( CManagerRenderCommand::GetFirstRender,GetNextRender에서 사용)
};
int m_iSortIndex;
};
//------------------------------------------------------------------------------
/**
@class struct St_TriRenderCommand
*/
struct St_TriRenderCommand : public St_BaseRenderCommand
{
enum ENUM_TRI_RENDERCOMMAND_TYPE
{
ETRCT_TRIINDEXED = 0,
ETRCT_TRI,
ETRCT_TRICOLORINDEXED,
ETRCT_TRIPACKED,
ETRCT_VERTEXBUFFER,
ETRCT_SIMPLEMESH,
ETRCT_NEW_TRI,
};
// 타입
ENUM_TRI_RENDERCOMMAND_TYPE m_eTriType;
// 렌더링 상태정보
St_RenderState m_RenderState;
// 위치 정보
WzVector m_wvPos;
// 굴절 정보
float m_fRefractionRate; // 외곡 율 0~1사이 값
float m_fRefractionAlpha; // 외곡 알파도 ( 0 - Diffuse 100%, 1 - 외곡 100% )
// Shader
int m_iVertexShader;
int m_iPixelShader;
// Diffuse Texture
HANDLE m_hTexture;
struct St_TriParam
{
// HANDLE hTexture;
int iNumFace;
WzVector* pwvVertex;
WzVector* pwvNormal;
WzUVVert* pwUVs;
int iDataSize;
};
struct St_TriIndexedParam
{
// HANDLE hTexture;
int iNumFace;
WzVector* pwvVertex;
int* piVertexMap;
WzVector* pwvNormal;
int* piNormalMap;
WzUVVert* pwUVs;
int* piUVMap;
int iDataSize;
};
struct St_ColorTriIndexedParam
{
// HANDLE hTexture;
int iNumFace;
WzVector* pwvVertex;
int* piVertexMap;
WzColor* pwcColor;
int* piColorMap;
WzUVVert* pwUVs;
int* piUVMap;
int iVertDataSize;
int iColorDataSize;
};
struct St_TriPackedParam
{
// HANDLE hTexture;
int iNumFace;
int* piVertexMap;
WzVector* pwvPosVert;
int* piPosVertIndex;
WzColor* pwcColor;
WzUVVert* pwUVs;
WzVector* pwvNormal;
int iVertexDataSize;
int iPosVertMapDataSize;
int iColorDataSize;
int iUVDataSize;
int iNormalDataSize;
};
struct St_VertexBufferParam
{
// HANDLE hTexture;
HANDLE hVertexBuffer;
int iNumFace;
int* piIndex;
WzUVVert* pwuvStream;
// int iVertexShader;
// int iPixelShader;
};
struct St_SimpleMeshParam
{
// WzSimpleMesh *pwsmSimpleMesh;
int iNumMesh;
WzVector* pVertices;
WzUVVert* pUVVerts;
};
struct St_NewTriParam
{
// HANDLE hTexture;
int iNumFace;
WzVector* pwvVertex;
WzColor* pwcColor;
WzUVVert* pwUVs;
int* piVertexIndex;
int* piColorIndex;
int* piUVIndex;
int iVertexSize;
int iColorSize;
int iUVSize;
DWORD dwFlags;
};
union
{
St_TriParam m_Tri;
St_TriIndexedParam m_TriIndexed;
St_ColorTriIndexedParam m_ColorTriIndexed;
St_TriPackedParam m_TriPacked;
St_VertexBufferParam m_VertBuffer;
St_SimpleMeshParam m_SimpMesh;
St_NewTriParam m_NewTri;
};
};
//------------------------------------------------------------------------------
/**
@struct St_SpriteRenderCommand
- 하나의 Sprite 정보를 render 하려는 명령을 저장
*/
struct St_SpriteRenderCommand : public St_BaseRenderCommand
{
WzColor m_wcDraw;
///< 렌더링 상태정보
St_RenderState m_RenderState;
union
{
///< RenderSprite's 인자값(St_AlphaRender 참조)
struct
{
HANDLE m_hTexture;
WzVector m_wvPos;
// ENUM_ALPHABLEND m_eabMode;
float m_fSize[2];
float m_fRotate;
float m_fDepthOffset;
BOOL m_bUVRegion;
WzUVVert m_wuvRegion[2];
};
};
float m_fRefractionRate; // 외곡 율 0~1사이 값
float m_fRefractionAlpha; // 외곡 알파도 ( 0 - Diffuse 100%, 1 - 외곡 100% )
// Shader
int m_iVertexShader;
int m_iPixelShader;
// 빌보드 타입
ENUM_BILLBOARD_TYPE m_eBillboardType;
// 결과 위치 리턴
WzVector* m_pResultPos;
};
//------------------------------------------------------------------------------
/**
@struct St_NewSpriteRenderCommand
*/
struct St_NewSpriteRenderCommand : public St_BaseRenderCommand
{
WzColor m_wcDraw;
// 렌더링 상태정보
St_RenderState m_RenderState;
union
{
// RenderSprite's 인자값(St_AlphaRender 참조)
struct
{
HANDLE m_hTexture;
SpriteVerts m_wvPos[6];
// ENUM_ALPHABLEND m_eabMode;
float m_fRotate;
float m_fDepthOffset;
BOOL m_bUVRegion;
WzUVVert m_wuvRegion[2];
WzVector m_vCenterPos;
};
};
float m_fRefractionRate; // 외곡 율 0~1사이 값
float m_fRefractionAlpha; // 외곡 알파도 ( 0 - Diffuse 100%, 1 - 외곡 100% )
// Shader
int m_iVertexShader;
int m_iPixelShader;
// 빌보드 타입
ENUM_BILLBOARD_TYPE m_eBillboardType;
// 결과 위치 리턴
WzVector* m_pResultPos;
};
//------------------------------------------------------------------------------
/**
@class struct St_RenderCommand
*/
struct St_RenderCommand : public St_BaseRenderCommand
{
// Render Flags
DWORD m_dwFlags;
// render 할 대상
CWzUnitDraw* m_pUnitDraw; // render 할 CWzUnitDraw
CWzdBase* m_pWzdMesh; // render 할 mesh
int m_iMeshGroup; // render 할 mesh group 번호
WzMatrix* m_pwmTransform; // vertex, normal 변환용 matrix - InverseAndTransformBuffer
HANDLE m_hVertexTB; // Transform 한 결과를 담는 버퍼 (Vertex 용)
HANDLE m_hNormalTB; // Transform 한 결과를 담는 버퍼 (Normal 용)
HANDLE m_hShadingBuffer; // Shading 결과를 담는 버퍼 ( Gouraud, Phong Shading )
HANDLE m_hCustomUVBuffer; // Custom UV 를 사용하는 경우 ( UVNormal, UVLight 에 사용)
// texture 관련
HANDLE m_ahTexture[NUM_TXC]; // 사용하는 texture 들 ( diffuse, specular, normalmap )
HANDLE m_hTextureFilter; // 사용하는 texture filter
BOOL m_bUVShift; // UV shift 를 쓰는가
WzUVVert m_wuvShift; // uv shift 값
St_RenderState m_RenderState; // render 시 상태로
int m_iWithAlpha; // Alpha 를 가지고 render 하는 것인가
// 조절값
float m_fBrightnessFunc[3]; // Brightness func
// on/off
int m_iUVNormal; // Normal 을 기준으로 uv 계산(0:false, 1:UVNormal, 2:UV1DNormal)
WzVector m_wvFactorForUVNormal[2]; // m_bUVNormal 가 TRUE 인 경우의 factor
BOOL m_bPhong; // Phong shading 중
BOOL m_bUVLight; // Normal 과 Light 를 기준으로 uv 계산
int m_iApplySunLight; // Sun Light 의 적용 여부 ( 0 : 적용안함, 1 : 현재 상태 적용, 2 : 무조건 적용)
float m_fSpecularIntensity; // Specular 강도값
St_OcclusionInfo* m_pOcclusion;
float m_fGlowMapFactor; // GlowMap 강도
float m_fHazeDist; // Haze 거리
float m_fHazeScale; // Haze 스케일
};
//------------------------------------------------------------------------------
/**
@struct St_InstancingRenderCommand
*/
struct St_InstancingRenderCommand : public St_RenderCommand
{
int m_iAllocInstancing;
CWzArray<St_InstancingInfo*> m_arInstancing;
};
//------------------------------------------------------------------------------
/**
*/
inline void InitRenderCommand( St_RenderCommand* prc )
{
ZeroMemory( prc, sizeof ( St_RenderCommand ) );
prc->m_hVertexTB = INVALID_HANDLE_VALUE;
prc->m_hNormalTB = INVALID_HANDLE_VALUE;
prc->m_hShadingBuffer = INVALID_HANDLE_VALUE;
prc->m_hCustomUVBuffer = INVALID_HANDLE_VALUE;
memset( prc->m_ahTexture, (int)INVALID_HANDLE_VALUE, sizeof( prc->m_ahTexture ) );
prc->m_hTextureFilter = INVALID_HANDLE_VALUE;
prc->m_iApplySunLight = 1;
WzInitFlag( prc->m_dwFlags, RCF_DEFAULT );
}
//------------------------------------------------------------------------------
/**
*/
inline void InitInstancingRenderCommand( St_InstancingRenderCommand* pirc )
{
InitRenderCommand( (St_RenderCommand*)pirc );
pirc->m_iAllocInstancing = 0;
}
#endif // _3DRENDERER_RENDERCOMMAND_H_