This commit is contained in:
romkazvo
2023-08-07 19:29:24 +08:00
commit 34d6c5d489
4832 changed files with 1389451 additions and 0 deletions

185
CryMovie/MaterialNode.cpp Normal file
View File

@@ -0,0 +1,185 @@
////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2001-2004.
// -------------------------------------------------------------------------
// File name: MaterialNode.cpp
// Version: v1.00
// Created: 11/5/2004 by Timur.
// Compilers: Visual Studio.NET 2003
// Description:
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "MaterialNode.h"
#include "AnimTrack.h"
#include <ISystem.h>
#include <I3DEngine.h>
#include <IRenderer.h>
#include <IShader.h>
namespace
{
bool s_nodeParamsInitialized = false;
std::vector<IAnimNode::SParamInfo> s_nodeParams;
void AddSupportedParam( const char *sName,int paramId,EAnimValue valueType )
{
IAnimNode::SParamInfo param;
param.name = sName;
param.paramId = paramId;
param.valueType = valueType;
s_nodeParams.push_back( param );
}
}
enum EMaterialNodeParam
{
MTL_PARAM_OPACITY = APARAM_USER + 1,
MTL_PARAM_AMBIENT = APARAM_USER + 2,
MTL_PARAM_DIFFUSE = APARAM_USER + 3,
MTL_PARAM_SPECULAR = APARAM_USER + 4,
MTL_PARAM_EMMISION = APARAM_USER + 5,
MTL_PARAM_SHININESS = APARAM_USER + 6,
MTL_PARAM_SHADER_PARAM1 = APARAM_USER + 100,
};
//////////////////////////////////////////////////////////////////////////
CAnimMaterialNode::CAnimMaterialNode( IMovieSystem *sys )
: CAnimNode(sys)
{
SetFlags( GetFlags()|ANODE_FLAG_CAN_CHANGE_NAME );
m_dwSupportedTracks = PARAM_BIT(APARAM_FLOAT_1);
//////////////////////////////////////////////////////////////////////////
// One time initialization of material node supported params.
if (!s_nodeParamsInitialized)
{
s_nodeParamsInitialized = true;
AddSupportedParam( "Opacity",MTL_PARAM_OPACITY,AVALUE_FLOAT );
AddSupportedParam( "Ambient",MTL_PARAM_AMBIENT,AVALUE_VECTOR );
AddSupportedParam( "Diffuse",MTL_PARAM_DIFFUSE,AVALUE_VECTOR );
AddSupportedParam( "Specular",MTL_PARAM_SPECULAR,AVALUE_VECTOR );
AddSupportedParam( "Emission",MTL_PARAM_EMMISION,AVALUE_VECTOR );
AddSupportedParam( "Shininess",MTL_PARAM_SHININESS,AVALUE_FLOAT );
AddSupportedParam( "Shader Param 1",MTL_PARAM_SHADER_PARAM1,AVALUE_FLOAT );
AddSupportedParam( "Shader Param 2",MTL_PARAM_SHADER_PARAM1+1,AVALUE_FLOAT );
AddSupportedParam( "Shader Param 3",MTL_PARAM_SHADER_PARAM1+2,AVALUE_FLOAT );
AddSupportedParam( "Shader Param 4",MTL_PARAM_SHADER_PARAM1+3,AVALUE_FLOAT );
AddSupportedParam( "Shader Param 5",MTL_PARAM_SHADER_PARAM1+4,AVALUE_FLOAT );
AddSupportedParam( "Shader Param 6",MTL_PARAM_SHADER_PARAM1+5,AVALUE_FLOAT );
AddSupportedParam( "Shader Param 7",MTL_PARAM_SHADER_PARAM1+6,AVALUE_FLOAT );
AddSupportedParam( "Shader Param 8",MTL_PARAM_SHADER_PARAM1+7,AVALUE_FLOAT );
AddSupportedParam( "Shader Param 9",MTL_PARAM_SHADER_PARAM1+8,AVALUE_FLOAT );
}
}
//////////////////////////////////////////////////////////////////////////
int CAnimMaterialNode::GetParamCount() const
{
return s_nodeParams.size();
}
//////////////////////////////////////////////////////////////////////////
bool CAnimMaterialNode::GetParamInfo( int nIndex, SParamInfo &info ) const
{
if (nIndex >= 0 && nIndex < s_nodeParams.size())
{
info = s_nodeParams[nIndex];
return true;
}
return false;
}
//////////////////////////////////////////////////////////////////////////
bool CAnimMaterialNode::GetParamInfoFromId( int paramId, SParamInfo &info ) const
{
for (int i = 0; i < s_nodeParams.size(); i++)
{
if (s_nodeParams[i].paramId == paramId)
{
info = s_nodeParams[i];
return true;
}
}
return false;
}
//////////////////////////////////////////////////////////////////////////
void CAnimMaterialNode::Animate( SAnimContext &ec )
{
IAnimBlock *anim = GetAnimBlock();
if (!anim)
return;
int paramCount = anim->GetTrackCount();
if (paramCount <= 0)
return;
// Find material.
IMatInfo *pMtl = m_pMovieSystem->GetSystem()->GetI3DEngine()->FindMaterial( GetName() );
if (!pMtl)
return;
SRenderShaderResources *pShaderResources = pMtl->GetShaderItem().m_pShaderResources;
if (!pShaderResources)
return;
float fValue;
Vec3 vValue;
for (int paramIndex = 0; paramIndex < paramCount; paramIndex++)
{
int paramId;
IAnimTrack *pTrack;
if (!anim->GetTrackInfo( paramIndex,paramId,&pTrack ))
continue;
switch (paramId)
{
case MTL_PARAM_OPACITY:
pTrack->GetValue( ec.time,fValue );
pShaderResources->m_Opacity = fValue;
break;
case MTL_PARAM_AMBIENT:
pTrack->GetValue( ec.time,vValue );
if (pShaderResources->m_LMaterial)
pShaderResources->m_LMaterial->Front.m_Ambient = CFColor(vValue.x,vValue.y,vValue.z);
break;
case MTL_PARAM_DIFFUSE:
pTrack->GetValue( ec.time,vValue );
if (pShaderResources->m_LMaterial)
pShaderResources->m_LMaterial->Front.m_Diffuse = CFColor(vValue.x,vValue.y,vValue.z);
break;
case MTL_PARAM_SPECULAR:
pTrack->GetValue( ec.time,vValue );
if (pShaderResources->m_LMaterial)
pShaderResources->m_LMaterial->Front.m_Specular = CFColor(vValue.x,vValue.y,vValue.z);
break;
case MTL_PARAM_EMMISION:
pTrack->GetValue( ec.time,vValue );
if (pShaderResources->m_LMaterial)
pShaderResources->m_LMaterial->Front.m_Emission = CFColor(vValue.x,vValue.y,vValue.z);
break;
case MTL_PARAM_SHININESS:
pTrack->GetValue( ec.time,fValue );
if (pShaderResources->m_LMaterial)
pShaderResources->m_LMaterial->Front.m_SpecShininess = fValue;
break;
default:
if (paramId >= MTL_PARAM_SHADER_PARAM1)
{
int id = paramId - MTL_PARAM_SHADER_PARAM1;
if (id < pShaderResources->m_ShaderParams.size())
{
pTrack->GetValue( ec.time,fValue );
pShaderResources->m_ShaderParams[id].m_Value.m_Float = fValue;
}
}
}
}
}