#include "Stdafx.h" #include "EtCamera.h" #include "EtLight.h" #include "EtShadowMap.h" #include "EtObject.h" #include "EtAniObject.h" #include "EtEffectObject.h" #include "EtBillboardEffect.h" #include "EtTerrainArea.h" #include "EtWater.h" #include "EtOptionController.h" #include "EtBackBufferMng.h" #include "EtMergedSkin.h" #include "EtSkyBoxRTT.h" #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif struct PCEmissiveInfo { EmissiveParam Param[ 5 ]; int nArrayCount; }; struct CoefficientInfo { float fA[4]; float fB[4]; float fC[4]; float fD[4]; }; #define EMISSIVE_INDEX 0 #define COEFFICIENT_INDEX 1 extern float g_fTotalElapsedTime; int VariableCountOne( void *pDummy, void *pDummy2 ) { return 1; } int VariableCountEmissive( void *pMaterialPtr, void *pCustomParamList ) { if( ( !pCustomParamList ) || ( !pMaterialPtr ) ) { return 0; } CEtMaterial *pMaterial = (CEtMaterial*)pMaterialPtr; std::vector< SCustomParam > &vecCustomParam = *(std::vector< SCustomParam > *)pCustomParamList; if( vecCustomParam.size() <= EMISSIVE_INDEX ) { return 0; } PCEmissiveInfo *pPCEmissiveInfo = (PCEmissiveInfo *)vecCustomParam[ EMISSIVE_INDEX ].pUserStruct; if( pPCEmissiveInfo != NULL ) { return pPCEmissiveInfo->nArrayCount | 0x80000000; } for( int i = 0; i < (int)vecCustomParam.size(); i++) { EtParameterHandle hParamHandle = vecCustomParam[ i ].hParamHandle; if( pMaterial->IsParameterName( hParamHandle, "g_EmissiveColor" ) ) { return vecCustomParam[ i ].nVariableCount | 0x80000000; } } return 0; } int VariableCountDirLight( void *pDummy, void *pDummy2 ) { int nCount = GetEtOptionController()->GetMaxDirLightCount(); // ÆÄ¶ó¸ÞÅÍÀÇ Å¸ÀÔÀÌ ArrayÀ϶§¸¦ ±¸º°Çϱâ À§ÇØ ÃÖ»óÀ§ ºñÆ®¸¦ 1·Î ¼¼ÆÃÇØÁØ´Ù nCount |= 0x80000000; return nCount; } int VariableCountPointLight( void *pDummy, void *pDummy2 ) { int nCount = GetEtOptionController()->GetMaxPointLightCount(); nCount |= 0x80000000; return nCount; } int VariableCountSpotLight( void *pDummy, void *pDummy2 ) { int nCount = GetEtOptionController()->GetMaxSpotLightCount(); nCount |= 0x80000000; return nCount; } void *GetProjectionMat( void *pDummy, void *pDummy2 ) { return CEtCamera::GetActiveCamera()->GetProjMat(); } void *GetViewMat( void *pDummy, void *pDummy2 ) { return CEtCamera::GetActiveCamera()->GetViewMat(); } void *GetViewRotProjMat( void *pDummy, void *pDummy2 ) { static EtMatrix ViewRotProjMat; EtCameraHandle hCamera; hCamera = CEtCamera::GetActiveCamera(); ViewRotProjMat = *hCamera->GetViewMat(); ViewRotProjMat._41 = 0.0f; ViewRotProjMat._42 = 0.0f; ViewRotProjMat._43 = 0.0f; return EtMatrixMultiply( &ViewRotProjMat, &ViewRotProjMat, hCamera->GetProjMat() ); } void *GetPrevViewRotProjMat( void *pDummy, void *pDummy2 ) { static EtMatrix ViewRotProjMat; EtCameraHandle hCamera; hCamera = CEtCamera::GetActiveCamera(); ViewRotProjMat = *hCamera->GetPrevViewMat(); ViewRotProjMat._41 = 0.0f; ViewRotProjMat._42 = 0.0f; ViewRotProjMat._43 = 0.0f; return EtMatrixMultiply( &ViewRotProjMat, &ViewRotProjMat, hCamera->GetProjMat() ); } void *GetViewPosition( void *pDummy, void *pDummy2 ) { static EtVector3 ViewPosition; ViewPosition = *CEtCamera::GetActiveCamera()->GetPosition(); return &ViewPosition; } void *GetFogFactor( void *pDummy, void *pDummy2 ) { static EtVector4 FogVector; float fFogNear = CEtCamera::GetActiveCamera()->GetFogNear(); float fFogFar = CEtCamera::GetActiveCamera()->GetFogFar(); float fCamFar = CEtCamera::GetActiveCamera()->GetCameraFar(); FogVector.x = 1.0f / ( fFogFar - fFogNear ); FogVector.y = -1.0f / ( fCamFar - fFogFar ); FogVector.z = fFogFar; return &FogVector; } void *GetFogColor( void *pDummy, void *pDummy2 ) { return CEtCamera::GetActiveCamera()->GetFogColor(); } void *GetFogSkyBoxTex( void *pDummy, void *pDummy2 ) { EtTextureHandle hTexture = CEtSkyBoxRTT::GetInstance().GetRTT(); if( hTexture ) { return hTexture->GetTexturePtr(); } return NULL; } void *GetScreenSizeScale( void *pDummy, void *pDummy2 ) { static EtVector4 vResult(0, 0, 0, 0); vResult.x = 0.5f + 0.5f / GetEtDevice()->Width(); vResult.y = 0.5f - 0.5f / GetEtDevice()->Height(); return &vResult; } static EtVector4 g_ReturnVector4[ 5 ]; int g_nReturnValue; void *GetLightAmbient( void *pDummy, void *pDummy2 ) { return CEtLight::GetGlobalAmbient(); } void *GetDirLightCount( void *pDummy, void *pDummy2 ) { g_nReturnValue = min( CEtLight::GetDirLightCount(), GetEtOptionController()->GetMaxDirLightCount() ); return &g_nReturnValue; } void *GetDirLightDirection( void *pDummy, void *pDummy2 ) { int i, nLightCount; SLightInfo *pSLightInfo; nLightCount = min( 5, CEtLight::GetDirLightCount() ); for( i = 0; i < nLightCount; i++ ) { pSLightInfo = CEtLight::GetDirLightInfo( i ); EtVec3TransformNormal( ( EtVector3 * )( g_ReturnVector4 + i ), &pSLightInfo->Direction, CEtCamera::GetActiveCamera()->GetViewMat() ); EtVec3Normalize( ( EtVector3 * )( g_ReturnVector4 + i ), ( EtVector3 * )( g_ReturnVector4 + i ) ); } return g_ReturnVector4; } void *GetDirLightDiffuse( void *pDummy, void *pDummy2 ) { int i, nLightCount; SLightInfo *pSLightInfo; nLightCount = min( 5, CEtLight::GetDirLightCount() ); for( i = 0; i < nLightCount; i++ ) { pSLightInfo = CEtLight::GetDirLightInfo( i ); g_ReturnVector4[ i ] = *( EtVector4 * )&pSLightInfo->Diffuse; if( i == 0 ) { g_ReturnVector4[ i ] *= CEtLight::GetDirLightAttenuation(); } } return g_ReturnVector4; } void *GetDirLightSpecular( void *pDummy, void *pDummy2 ) { int i, nLightCount; SLightInfo *pSLightInfo; nLightCount = min( 5, CEtLight::GetDirLightCount() ); for( i = 0; i < nLightCount; i++ ) { pSLightInfo = CEtLight::GetDirLightInfo( i ); g_ReturnVector4[ i ] = *( EtVector4 * )&pSLightInfo->Specular; if( i == 0 ) { g_ReturnVector4[ i ] *= CEtLight::GetDirLightAttenuation(); } } return g_ReturnVector4; } void *GetPointLightCount( void *pDummy, void *pDummy2 ) { g_nReturnValue = min( CEtLight::GetInfluencePointLightCount(), GetEtOptionController()->GetMaxPointLightCount() ); return &g_nReturnValue; } void *GetPointLightPosition( void *pDummy, void *pDummy2 ) { int i, nLightCount; SLightInfo *pSLightInfo; nLightCount = min( 5, CEtLight::GetInfluencePointLightCount() ); for( i = 0; i < nLightCount; i++ ) { pSLightInfo = CEtLight::GetInfluencePointLightInfo( i ); EtVec3TransformCoord( ( EtVector3 * )( g_ReturnVector4 + i ), &pSLightInfo->Position, CEtCamera::GetActiveCamera()->GetViewMat() ); g_ReturnVector4[ i ].w = 1.0f / pSLightInfo->fRange; } return g_ReturnVector4; } void *GetPointLightDiffuse( void *pDummy, void *pDummy2 ) { int i, nLightCount; SLightInfo *pSLightInfo; nLightCount = min( 5, CEtLight::GetInfluencePointLightCount() ); for( i = 0; i < nLightCount; i++ ) { pSLightInfo = CEtLight::GetInfluencePointLightInfo( i ); g_ReturnVector4[ i ] = *( EtVector4 * )&pSLightInfo->Diffuse; } return g_ReturnVector4; } void *GetPointLightSpecular( void *pDummy, void *pDummy2 ) { int i, nLightCount; SLightInfo *pSLightInfo; nLightCount = min( 5, CEtLight::GetInfluencePointLightCount() ); for( i = 0; i < nLightCount; i++ ) { pSLightInfo = CEtLight::GetInfluencePointLightInfo( i ); g_ReturnVector4[ i ] = *( EtVector4 * )&pSLightInfo->Specular; } return g_ReturnVector4; } void *GetSpotLightCount( void *pDummy, void *pDummy2 ) { g_nReturnValue = min( CEtLight::GetInfluenceSpotLightCount(), GetEtOptionController()->GetMaxSpotLightCount() ); return &g_nReturnValue; } void *GetSpotLightDirection( void *pDummy, void *pDummy2 ) { int i, nLightCount; SLightInfo *pSLightInfo; nLightCount = min( 5, CEtLight::GetInfluenceSpotLightCount() ); for( i = 0; i < nLightCount; i++ ) { pSLightInfo = CEtLight::GetInfluenceSpotLightInfo( i ); EtVec3TransformNormal( ( EtVector3 * )( g_ReturnVector4 + i ), &pSLightInfo->Direction, CEtCamera::GetActiveCamera()->GetViewMat() ); EtVec3Normalize( ( EtVector3 * )( g_ReturnVector4 + i ), ( EtVector3 * )( g_ReturnVector4 + i ) ); g_ReturnVector4[ i ].w = pSLightInfo->fFalloff; } return g_ReturnVector4; } void *GetSpotLightPosition( void *pDummy, void *pDummy2 ) { int i, nLightCount; SLightInfo *pSLightInfo; nLightCount = min( 5, CEtLight::GetInfluenceSpotLightCount() ); for( i = 0; i < nLightCount; i++ ) { pSLightInfo = CEtLight::GetInfluenceSpotLightInfo( i ); EtVec3TransformCoord( ( EtVector3 * )( g_ReturnVector4 + i ), &pSLightInfo->Position, CEtCamera::GetActiveCamera()->GetViewMat() ); g_ReturnVector4[ i ].w = pSLightInfo->fRange; // ½ºÆý ¶óÀÌÆ®´Â °¨¼â ¾ÈÇϱ⠶§¹®¿¡.. range°ªÀ» Á÷Á¢ ³Ñ±ä´Ù. } return g_ReturnVector4; } void *GetSpotLightDiffuse( void *pDummy, void *pDummy2 ) { int i, nLightCount; SLightInfo *pSLightInfo; nLightCount = min( 5, CEtLight::GetInfluenceSpotLightCount() ); for( i = 0; i < nLightCount; i++ ) { pSLightInfo = CEtLight::GetInfluenceSpotLightInfo( i ); g_ReturnVector4[ i ] = *( EtVector4 * )&pSLightInfo->Diffuse; if( pSLightInfo->fTheta <= pSLightInfo->fPhi ) // 0À̳ª -°ªÀÌ ³ª¿ÀÁö ¾Êµµ·Ï.. { g_ReturnVector4[ i ].w = 0.0000001f; } else { g_ReturnVector4[ i ].w = pSLightInfo->fTheta - pSLightInfo->fPhi; } } return g_ReturnVector4; } void *GetSpotLightSpecular( void *pDummy, void *pDummy2 ) { int i, nLightCount; SLightInfo *pSLightInfo; nLightCount = min( 5, CEtLight::GetInfluenceSpotLightCount() ); for( i = 0; i < nLightCount; i++ ) { pSLightInfo = CEtLight::GetInfluenceSpotLightInfo( i ); g_ReturnVector4[ i ] = *( EtVector4 * )&pSLightInfo->Specular; g_ReturnVector4[ i ].w = pSLightInfo->fPhi; } return g_ReturnVector4; } void *GetShadowMap( void *pDummy, void *pDummy2 ) { return GetEtShadowMap()->GetShadowMapTexture(); } void *GetShadowDensity( void *pDummy, void *pDummy2 ) { float fMaterialAmbient = 0.682f; // ÁöÇüÀ̶û ÇÁ¶ø¿¡ Áö´Â ±×¸²ÀÚ¶û »ö±ò ¸ÂÃá´Ù. g_ReturnVector4[0] = EtVector4( CEtLight::GetGlobalAmbient()->r * fMaterialAmbient, CEtLight::GetGlobalAmbient()->g * fMaterialAmbient, CEtLight::GetGlobalAmbient()->b * fMaterialAmbient, 1.0f ); return &g_ReturnVector4[0]; } void *GetShadowFetchDistance( void *pDummy, void *pDummy2 ) { static float s_fFetchDist = 0.8f; return &s_fFetchDist; }; void *GetElapsedTime( void *pDummy, void *pDummy2 ) { return &g_fTotalElapsedTime; } void *GetEnvTexture( void *pDummy, void *pDummy2 ) { return CEtTexture::GetEnvTexture(); } void *GetBackBuffer( void *pDummy, void *pDummy2 ) { return GetEtBackBufferMng()->GetBackBuffer()->GetTexturePtr(); } void *GetWorldMat( void *pWorldMat, void *pPrevWorldMat ) { return pWorldMat; } void *GetInvViewMat( void *pDummy, void *pDummy2 ) { return CEtCamera::GetActiveCamera()->GetInvViewMat(); } void *GetWorldViewMat( void *pWorldMat, void *pPrevWorldMat ) { static EtMatrix WorldViewMat; return EtMatrixMultiply( &WorldViewMat, ( EtMatrix * )pWorldMat, CEtCamera::GetActiveCamera()->GetViewMat() ); } void *GetViewProjMat( void *pWorldMat, void *pPrevWorldMat ) { static EtMatrix ViewProjMat; EtCameraHandle hCamera; hCamera = CEtCamera::GetActiveCamera(); memcpy( &ViewProjMat, hCamera->GetViewProjMat(), sizeof( EtMatrix ) ); return &ViewProjMat; } void *GetWorldViewProjMat( void *pWorldMat, void *pPrevWorldMat ) { static EtMatrix WorldViewProjMat; EtCameraHandle hCamera; hCamera = CEtCamera::GetActiveCamera(); EtMatrixMultiply( &WorldViewProjMat, ( EtMatrix * )pWorldMat, hCamera->GetViewMat() ); return EtMatrixMultiply( &WorldViewProjMat, &WorldViewProjMat, hCamera->GetProjMat() ); } void *GetPrevWorldViewProjMat( void *pWorldMat, void *pPrevWorldMat ) { static EtMatrix WorldViewProjMat; EtCameraHandle hCamera; hCamera = CEtCamera::GetActiveCamera(); EtMatrixMultiply( &WorldViewProjMat, ( EtMatrix * )pPrevWorldMat, hCamera->GetPrevViewMat() ); return EtMatrixMultiply( &WorldViewProjMat, &WorldViewProjMat, hCamera->GetProjMat() ); } void *GetInvWorldViewPrevWorldViewProjMat( void *pWorldMat, void *pPrevWorldMat ) { static EtMatrix InvWorldViewMat; EtCameraHandle hCamera; hCamera = CEtCamera::GetActiveCamera(); EtMatrixMultiply( &InvWorldViewMat, ( EtMatrix * )pWorldMat, hCamera->GetViewMat() ); EtMatrixInverse( &InvWorldViewMat, NULL, &InvWorldViewMat ); EtMatrixMultiply( &InvWorldViewMat, &InvWorldViewMat, ( EtMatrix * )pPrevWorldMat ); EtMatrixMultiply( &InvWorldViewMat, &InvWorldViewMat, hCamera->GetPrevViewMat() ); return EtMatrixMultiply( &InvWorldViewMat, &InvWorldViewMat, hCamera->GetProjMat() ); } void *GetModelViewMat( void *pWorldMat, void *pPrevWorldMat ) { static EtMatrix ModelViewMat; EtCameraHandle hCamera; hCamera = CEtCamera::GetActiveCamera(); return EtMatrixLookAtLH( &ModelViewMat, hCamera->GetPosition(), ( EtVector3 * )&( ( EtMatrix * )pWorldMat )->_41, &EtVector3( 0.0f, 1.0f, 0.0f ) ); } void *GetInvViewModelViewMat( void *pWorldMat, void *pPrevWorldMat ) { static EtMatrix InvViewModelViewMat; EtCameraHandle hCamera; hCamera = CEtCamera::GetActiveCamera(); EtMatrixLookAtLH( &InvViewModelViewMat, hCamera->GetPosition(), ( EtVector3 * )&( ( EtMatrix * )pWorldMat )->_41, &EtVector3( 0.0f, 1.0f, 0.0f ) ); return EtMatrixMultiply( &InvViewModelViewMat, hCamera->GetInvViewMat(), &InvViewModelViewMat ); } void *GetWorldLightViewProjMat( void *pWorldMat, void *pPrevWorldMat ) { static EtMatrix WorldLightViewProjMat; EtMatrixMultiply( &WorldLightViewProjMat, ( EtMatrix * )pWorldMat, GetEtShadowMap()->GetLightViewMat() ); return EtMatrixMultiply( &WorldLightViewProjMat, &WorldLightViewProjMat, GetEtShadowMap()->GetLightProjMat() ); } void *GetInvViewLightViewProjMat( void *pWorldMat, void *pPrevWorldMat ) { static EtMatrix InvViewLightViewProjMat; EtMatrixMultiply( &InvViewLightViewProjMat, CEtCamera::GetActiveCamera()->GetInvViewMat(), GetEtShadowMap()->GetLightViewMat() ); return EtMatrixMultiply( &InvViewLightViewProjMat, &InvViewLightViewProjMat, GetEtShadowMap()->GetLightProjMat() ); } void *GetWorldLightViewProjDepth( void *pWorldMat, void *pPrevWorldMat ) { EtMatrix WorldLightViewProjMat; static EtVector4 WorldLightViewProjDepth; EtMatrixMultiply( &WorldLightViewProjMat, ( EtMatrix * )pWorldMat, GetEtShadowMap()->GetLightViewMat() ); EtMatrixMultiply( &WorldLightViewProjMat, &WorldLightViewProjMat, GetEtShadowMap()->GetLightProjDepthMat() ); WorldLightViewProjDepth = EtVector4( WorldLightViewProjMat._13, WorldLightViewProjMat._23, WorldLightViewProjMat._33, WorldLightViewProjMat._43); return &WorldLightViewProjDepth; } void *GetInvViewLightViewProjDepth( void *pWorldMat, void *pPrevWorldMat ) { EtMatrix InvViewLightViewProjMat; static EtVector4 InvViewLightViewProjDepth; EtMatrixMultiply( &InvViewLightViewProjMat, CEtCamera::GetActiveCamera()->GetInvViewMat(), GetEtShadowMap()->GetLightViewMat() ); EtMatrixMultiply( &InvViewLightViewProjMat, &InvViewLightViewProjMat, GetEtShadowMap()->GetLightProjDepthMat() ); InvViewLightViewProjDepth = EtVector4( InvViewLightViewProjMat._13, InvViewLightViewProjMat._23, InvViewLightViewProjMat._33, InvViewLightViewProjMat._43); return &InvViewLightViewProjDepth; } void *ComputeEmissive( void *pMaterialPtr, void *pCustomParamList ) { static EtColor EmissiveResult[5]; if( ( !pCustomParamList ) || ( !pMaterialPtr ) ) { memset( EmissiveResult, 0, sizeof(EtColor)*5 ); return EmissiveResult; } CEtMaterial *pMaterial = (CEtMaterial*)pMaterialPtr; std::vector< SCustomParam > &vecCustomParam = *(std::vector< SCustomParam > *)pCustomParamList; if( vecCustomParam.size() <= EMISSIVE_INDEX ) { memset( EmissiveResult, 0, sizeof(EtColor)*5 ); return EmissiveResult; } PCEmissiveInfo *pPCEmissiveInfo = (PCEmissiveInfo *)vecCustomParam[ EMISSIVE_INDEX ].pUserStruct; if( pPCEmissiveInfo == NULL ) { vecCustomParam[ EMISSIVE_INDEX ].pUserStruct = pPCEmissiveInfo = (PCEmissiveInfo *)::malloc( sizeof(PCEmissiveInfo) ); pMaterial->AddUserAllocMem( pPCEmissiveInfo ); pPCEmissiveInfo->nArrayCount = 0; for( int i = 0; i < (int)vecCustomParam.size(); i++) { EtParameterHandle hParamHandle = vecCustomParam[ i ].hParamHandle; if( vecCustomParam[ i ].nVariableCount == 1 ) { if( pMaterial->IsParameterName( hParamHandle, "g_EmissivePower" ) ) { pPCEmissiveInfo->Param[ 0 ].fPower = vecCustomParam[ i ].fFloat; } else if( pMaterial->IsParameterName( hParamHandle, "g_EmissivePowerRange" ) ) { pPCEmissiveInfo->Param[ 0 ].fRange = vecCustomParam[ i ].fFloat; } else if( pMaterial->IsParameterName( hParamHandle, "g_EmissiveAniSpeed" ) ) { pPCEmissiveInfo->Param[ 0 ].fAniSpeed = vecCustomParam[ i ].fFloat; } else if( pMaterial->IsParameterName( hParamHandle, "g_EmissiveColor" ) ) { memcpy(&pPCEmissiveInfo->Param[ 0 ].Color, vecCustomParam[ i ].fFloat4, sizeof(EtColor)); pPCEmissiveInfo->nArrayCount = 1; } } else { if( pMaterial->IsParameterName( hParamHandle, "g_EmissiveColor" ) ) { pPCEmissiveInfo->nArrayCount = vecCustomParam[ i ].nVariableCount; memcpy(pPCEmissiveInfo->Param, vecCustomParam[ i ].pPointer, sizeof(EmissiveParam) * pPCEmissiveInfo->nArrayCount ); } } } } for( int i = 0; i < pPCEmissiveInfo->nArrayCount; i++) { EmissiveResult[ i ] = pPCEmissiveInfo->Param[ i ].Color * (pPCEmissiveInfo->Param[ i ].fPower + pPCEmissiveInfo->Param[ i ].fRange * cosf( g_fTotalElapsedTime * pPCEmissiveInfo->Param[ i ].fAniSpeed ) ); } return EmissiveResult; } void ComputeCoefficient( void *pMaterialPtr, void *pCustomParamList ) { const float fMaxRadiusSq = 400.0f; CEtMaterial *pMaterial = (CEtMaterial*)pMaterialPtr; std::vector< SCustomParam > &vecCustomParam = *(std::vector< SCustomParam > *)pCustomParamList; CoefficientInfo *pCoefficientInfo = (CoefficientInfo *)vecCustomParam[ COEFFICIENT_INDEX ].pUserStruct; if( pCoefficientInfo == NULL ) { vecCustomParam[ COEFFICIENT_INDEX ].pUserStruct = pCoefficientInfo = (CoefficientInfo *)::malloc( sizeof(CoefficientInfo) ); pMaterial->AddUserAllocMem( pCoefficientInfo ); EtColor SkinColor(0.5f, 0.5f, 0.5f, 1.0f); for( int i = 0; i < (int)vecCustomParam.size(); i++) { EtParameterHandle hParamHandle = vecCustomParam[ i ].hParamHandle; if( vecCustomParam[ i ].nVariableCount == 1 && vecCustomParam[ i ].Type == EPT_VECTOR ) { if( pMaterial->IsParameterName( hParamHandle, "g_SkinColor" ) ) { SkinColor = *(EtColor*)vecCustomParam[ i ].fFloat4; break; } } } /* ¿øÀÇ ¹æÁ¤½Ä (x-a)^2 + (y-b)^2 = r^2 ¿¡¼­ Ä÷¯ ä³Îº° SkinColorÀÇ °­µµ¿¡ µû¶ó ¹ÝÁö¸§ r À» 1 ~ 20 »çÀÌÀÇ °ªÀ» ¼±ÅÃÇÑ´Ù. ¹ÝÁö¸§ÀÌ 1ÀÎ °æ¿ì ÃÖ´ë °­µµÀÌ¸ç ¹ÝÁö¸§ÀÌ Å¬¼ö·Ï f(x) = x ÀÇ ±×·¡ÇÁ¿¡ ¼ö·ÅÇÏ°Ô µÈ´Ù. ±×ÈÄ f(0) = 0, f(1) = 1 À» ¸¸Á·ÇÏ´Â Àû´çÇÑ a,b ¸¦ 2Â÷¹æÁ¤½ÄÀÇ ±ÙÀÇ °ø½ÄÀ» ÀÌ¿ëÇØ ±¸ÇÑÈÄ ÃÖÁ¾ÀûÀ¸·Î ½¦ÀÌ´õ¿¡ ³Ñ°ÜÁú ¹æÁ¤½ÄÀÇ °è¼öµéÀ» ±¸ÇÑ´Ù. */ for( int i = 0; i < 3; i++) { float *pColors = SkinColor; pCoefficientInfo->fC[ i ] = powf( fMaxRadiusSq, ((0.5f - fabsf( pColors[ i ] - 0.5f )) * 2.0f )); if( pColors[ i ] > 0.5f ) { pCoefficientInfo->fB[ i ] = -1.0f; pCoefficientInfo->fD[ i ] = 0.5f * ( sqrtf( 2.0f * pCoefficientInfo->fC[ i ] - 1.0f ) + 1 ); pCoefficientInfo->fA[ i ] = 1.0f - pCoefficientInfo->fD[ i ]; } else { pCoefficientInfo->fB[ i ] = 1.0f; pCoefficientInfo->fD[ i ] = -0.5f * ( sqrtf( 2.0f * pCoefficientInfo->fC[ i ] - 1.0f ) - 1 ); pCoefficientInfo->fA[ i ] = 1.0f - pCoefficientInfo->fD[ i ]; } } pCoefficientInfo->fA[3] = SkinColor.a; // fA ¿¡ Intensity °ªÀ» ³Ö¾îÁØ´Ù... pCoefficientInfo->fB[3] = pCoefficientInfo->fC[3] = pCoefficientInfo->fD[3] = 0.0f; } } void *GetCoefficientA( void *pMaterialPtr, void *pCustomParamList ) { ComputeCoefficient( pMaterialPtr, pCustomParamList ); std::vector< SCustomParam > &vecCustomParam = *(std::vector< SCustomParam > *)pCustomParamList; CoefficientInfo *pCoefficientInfo = (CoefficientInfo *)vecCustomParam[ COEFFICIENT_INDEX ].pUserStruct; ASSERT( pCoefficientInfo != NULL ); return pCoefficientInfo->fA; } void *GetCoefficientB( void *pMaterialPtr, void *pCustomParamList ) { ComputeCoefficient( pMaterialPtr, pCustomParamList ); std::vector< SCustomParam > &vecCustomParam = *(std::vector< SCustomParam > *)pCustomParamList; CoefficientInfo *pCoefficientInfo = (CoefficientInfo *)vecCustomParam[ COEFFICIENT_INDEX ].pUserStruct; ASSERT( pCoefficientInfo != NULL ); return pCoefficientInfo->fB; } void *GetCoefficientC( void *pMaterialPtr, void *pCustomParamList ) { ComputeCoefficient( pMaterialPtr, pCustomParamList ); std::vector< SCustomParam > &vecCustomParam = *(std::vector< SCustomParam > *)pCustomParamList; CoefficientInfo *pCoefficientInfo = (CoefficientInfo *)vecCustomParam[ COEFFICIENT_INDEX ].pUserStruct; ASSERT( pCoefficientInfo != NULL ); return pCoefficientInfo->fC; } void *GetCoefficientD( void *pMaterialPtr, void *pCustomParamList ) { ComputeCoefficient( pMaterialPtr, pCustomParamList ); std::vector< SCustomParam > &vecCustomParam = *(std::vector< SCustomParam > *)pCustomParamList; CoefficientInfo *pCoefficientInfo = (CoefficientInfo *)vecCustomParam[ COEFFICIENT_INDEX ].pUserStruct; ASSERT( pCoefficientInfo != NULL ); return pCoefficientInfo->fD; } void *GetAniTime( void *pMaterialPtr, void *pCustomParamList ) { static FLOAT fResult = 0.0f; CEtMaterial *pMaterial = (CEtMaterial*)pMaterialPtr; std::vector< SCustomParam > &vecCustomParam = *(std::vector< SCustomParam > *)pCustomParamList; for( int i = 0; i < (int)vecCustomParam.size(); i++) { EtParameterHandle hParamHandle = vecCustomParam[ i ].hParamHandle; if( vecCustomParam[ i ].nVariableCount == 1 && vecCustomParam[ i ].Type == EPT_FLOAT ) { if( pMaterial->IsParameterName( hParamHandle, "g_AniTime" ) ) { fResult = fmodf( g_fTotalElapsedTime, vecCustomParam[ i ].fFloat ) / vecCustomParam[ i ].fFloat; break; } } } return &fResult; } // ¾ËÆÄÅ×½ºÆ®½Ã¿£ ¿¹Àüó·³ 0.5¸¦ ¸®ÅÏÇÏ°í ¾ËÆÄ ºí·£µù½Ã¿¡´Â (255 / 256) À» ¸®ÅÏÇØ ¿ÏÀü ºÒÅõ¸íÇÑ ºÎºÐ¸¸ ‰X½º¸¦ ±×¸°´Ù. void *GetDepthAlphaRef( void *pDummy, void *pDummy2 ) { /*static */const float fAlphaMax = 255.5f; /*static */const float fAlphaDivisor = 256.0f; static FLOAT fResult = 0.f; fResult = (GetEtDevice()->GetAlphaRef()+1.5f) / fAlphaDivisor; return &fResult; }