deargui-vpl/ref/virtools/Samples/Behaviors/Shader/Sources/RCKShaderWrapper.cpp

269 lines
8.8 KiB
C++

#include "stdafx.h"
#include "RCKShaderWrapper.h"
//-----------------------------------------------------------------------------
RCKShaderWrapper::RCKShaderWrapper(ShaderManagerWrapper *man, XArray<WCKShader>& WCKShaderArray) :
m_ShaderManagerWrapper(man)
{
m_CurrentShaderManager = m_ShaderManagerWrapper->GetCurrentShaderManager();
m_CurrentRCKShader = NULL;
m_WCKShaderArray = WCKShaderArray;
int shaderNum = WCKShaderArray.Size();
for (int i = 0 ; i < shaderNum ; i++) {
switch(WCKShaderArray[i].type) {
#ifndef macintosh
case CKSM_HLSL:
((RCKShader*)WCKShaderArray[i].shader)->m_ShaderName = &m_ShaderName;
if (m_CurrentShaderManager->m_Type == CKSM_HLSL)
m_CurrentRCKShader = WCKShaderArray[i].shader;
break;
#endif
case CKSM_CGFX:
#if defined(MULTIPLESHADERMANAGER) // !macintosh
((RCKShaderCG*)WCKShaderArray[i].shader)->m_ShaderName = &m_ShaderName;
#else
((RCKShaderCG*)WCKShaderArray[i].shader)->SetName(m_ShaderName);
#endif
if (m_CurrentShaderManager->m_Type == CKSM_CGFX)
m_CurrentRCKShader = WCKShaderArray[i].shader;
break;
default:
XASSERT(WCKShaderArray[i].type != CKSM_HLSL && WCKShaderArray[i].type != CKSM_CGFX);
break;
}
}
XASSERT(m_CurrentRCKShader);
m_Save = TRUE;
m_ListInEditor = TRUE;
}
//-----------------------------------------------------------------------------
RCKShaderWrapper::~RCKShaderWrapper()
{
for (int i=0 ; i < m_WCKShaderArray.Size() ; i++) {
delete m_WCKShaderArray[i].shader;
}
m_WCKShaderArray.Clear();
}
//-----------------------------------------------------------------------------
CKBOOL RCKShaderWrapper::IsSupported() const
{
return m_CurrentRCKShader->IsSupported();
}
//-----------------------------------------------------------------------------
int RCKShaderWrapper::Begin( CKRenderContext* rc )
{
PIXE("RCKShaderWrapper::Begin");
return m_CurrentRCKShader->Begin(rc);
}
//-----------------------------------------------------------------------------
void RCKShaderWrapper::BeginPass( CKDWORD Num, CKRenderContext* rc )
{
PIXE("RCKShaderWrapper::BeginPass");
m_CurrentRCKShader->BeginPass(Num, rc);
}
//-----------------------------------------------------------------------------
void RCKShaderWrapper::EndPass( CKRenderContext* rc )
{
PIXE("RCKShaderWrapper::EndPass");
m_CurrentRCKShader->EndPass(rc);
}
//-----------------------------------------------------------------------------
void RCKShaderWrapper::CommitChanges( CKRenderContext* rc )
{
PIXE("RCKShaderWrapper::CommitChanges");
m_CurrentRCKShader->CommitChanges(rc);
}
//-----------------------------------------------------------------------------
void RCKShaderWrapper::End( CKRenderContext* rc )
{
PIXE("RCKShaderWrapper::End");
m_CurrentRCKShader->End(rc);
}
//-----------------------------------------------------------------------------
void RCKShaderWrapper::SetTechnique( const XString& iTechName )
{
PIXE("RCKShaderWrapper::SetTechnique");
m_CurrentRCKShader->SetTechnique(iTechName);
}
//-----------------------------------------------------------------------------
void RCKShaderWrapper::SetTechnique( int iTechIndex )
{
PIXE("RCKShaderWrapper::SetTechnique");
m_CurrentRCKShader->SetTechnique(iTechIndex);
}
//-----------------------------------------------------------------------------
int
RCKShaderWrapper::GetTechniquesCount() const
{
return m_CurrentRCKShader->GetTechniquesCount();
}
//-----------------------------------------------------------------------------
bool
RCKShaderWrapper::GetTechIndexByName( const XString& iTechName, int& oPos ) const
{
//--- Tech Name Should be the same for all Render Contexts
return m_CurrentRCKShader->GetTechIndexByName(iTechName, oPos);
}
//-----------------------------------------------------------------------------
void
RCKShaderWrapper::GetTechniqueInfo( int iTechIndex, TechniqueInfo& oTechInfo ) const
{
m_CurrentRCKShader->GetTechniqueInfo(iTechIndex, oTechInfo);
}
//-----------------------------------------------------------------------------
bool RCKShaderWrapper::FindNextValidTechnique( int& ioTechIndex, XString* oTechName ) const
{
return m_CurrentRCKShader->FindNextValidTechnique(ioTechIndex, oTechName);
}
//-----------------------------------------------------------------------------
int
RCKShaderWrapper::GetTechniqueEnumValue( const XString& iTechName ) const
{
return m_CurrentRCKShader->GetTechniqueEnumValue(iTechName);
}
//-----------------------------------------------------------------------------
void
RCKShaderWrapper::GetTechniqueEnumString( int num, XString& oName ) const
{
m_CurrentRCKShader->GetTechniqueEnumString(num, oName);
}
//-----------------------------------------------------------------------------
int
RCKShaderWrapper::GetPassCount( int iTechIndex ) const
{
return m_CurrentRCKShader->GetPassCount(iTechIndex);
}
//-----------------------------------------------------------------------------
void
RCKShaderWrapper::GetPassInfo( int iTechIndex, int iPassIndex, PassInfo& oPassInfo ) const
{
m_CurrentRCKShader->GetPassInfo(iTechIndex, iPassIndex, oPassInfo);
}
//-----------------------------------------------------------------------------
bool
RCKShaderWrapper::GetPassIndexByName( int iTechIndex, const char* iPassName, int& oPos ) const
{
return m_CurrentRCKShader->GetPassIndexByName(iTechIndex, iPassName, oPos);
}
//-----------------------------------------------------------------------------
// Effect parameters feature
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Execute Exposed Params Meanings
void RCKShaderWrapper::SetParameters(const XArray<CKParameterLocal*>& params)
{
PIXE("RCKShaderWrapper::SetParameters");
m_CurrentRCKShader->SetParameters(params);
}
//-----------------------------------------------------------------------------
// Execute Params Meanings (non-exposed)
// called by SetValuesOfUsedAutomatics()
//
void RCKShaderWrapper::ExecuteMeanings( CK3dEntity* iEnt, CKMaterial* iMat, CKMaterialShader* iMatShader, CKRenderContext* iRC )
{
PIXE("RCKShaderWrapper::ExecuteMeanings");
m_CurrentRCKShader->ExecuteMeanings(iEnt, iMat, iMatShader, iRC);
}
//-----------------------------------------------------------------------------
void RCKShaderWrapper::ExecutePerPassMeanings( CK3dEntity* iEnt, CKMaterial* iMat, CKMaterialShader* iMatShader, CKRenderContext* iRC )
{
PIXE("RCKShaderWrapper::ExecutePerPassMeanings");
m_CurrentRCKShader->ExecutePerPassMeanings(iEnt, iMat, iMatShader, iRC);
}
//-----------------------------------------------------------------------------
int RCKShaderWrapper::GetAutoParameterCount( CKRenderContext* rc )
{
return m_CurrentRCKShader->GetAutoParameterCount(rc);
}
//-----------------------------------------------------------------------------
int RCKShaderWrapper::GetExposedParameterCount( CKRenderContext* rc )
{
return m_CurrentRCKShader->GetExposedParameterCount(rc);
}
//-----------------------------------------------------------------------------
void RCKShaderWrapper::GetAutoParameterInfo( int paramIndex, ParamInfo& paramInfo, CKRenderContext* rc )
{
if(m_CurrentRCKShader->GetHideFlag()) return;
m_CurrentRCKShader->GetAutoParameterInfo(paramIndex, paramInfo, rc);
}
//-----------------------------------------------------------------------------
void RCKShaderWrapper::GetExposedParameterInfo( int paramIndex, ParamInfo& paramInfo, CKRenderContext* rc )
{
if(m_CurrentRCKShader->GetHideFlag()) return;
m_CurrentRCKShader->GetExposedParameterInfo(paramIndex, paramInfo, rc);
}
//-----------------------------------------------------------------------------
bool RCKShaderWrapper::LinkParameters(int& CompID, XArray<CKParameterLocal*>& params, CKBOOL cleanup)
{
return m_CurrentRCKShader->LinkParameters(CompID, params, cleanup);
}
//-----------------------------------------------------------------------------
bool
RCKShaderWrapper::LinkTechnique( int& CompID, const XString& iTechName, BOOL iFNVT, int& oTechIndex )
{
return m_CurrentRCKShader->LinkTechnique(CompID, iTechName, iFNVT, oTechIndex);
}
//-----------------------------------------------------------------------------
// Compiling
//-----------------------------------------------------------------------------
void RCKShaderWrapper::Compile(CKContext* Context)
{
switch(m_CurrentShaderManager->m_Type) {
#ifndef macintosh
case CKSM_HLSL:
((RCKShader*)m_CurrentRCKShader)->Compile(Context);
break;
#endif
case CKSM_CGFX:
((RCKShaderCG*)m_CurrentRCKShader)->Compile(Context);
break;
default:
XASSERT(0);
break;
}
}
//-----------------------------------------------------------------------------
// Registering
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
CKSTRING RCKShaderWrapper::GetClassName()
{
return "Shader";
}