70 lines
2.1 KiB
C++
70 lines
2.1 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
----------------------------------------------------------------------------- */
|
|
|
|
#include "core/shader_tree.h"
|
|
#include "core/shader_block.h"
|
|
|
|
using namespace GS::Core;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
int ShaderTree::GetSinkCompatibility(ShaderSinkType sink) const
|
|
{
|
|
switch (sink)
|
|
{
|
|
case SinkNormal: return ShaderInput::Vector3;
|
|
case SinkDiffuse: return ShaderInput::Vector4;
|
|
case SinkModulate: return ShaderInput::Float;
|
|
case SinkSpecular: return ShaderInput::Vector4;
|
|
case SinkGlossiness: return ShaderInput::Float;
|
|
case SinkConstant: return ShaderInput::Vector4;
|
|
case SinkOpacity: return ShaderInput::Float;
|
|
case SinkReflection: return ShaderInput::Float;
|
|
}
|
|
return ShaderInput::NoData;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
void ShaderTree::GatherBlockList(GS::List <ShaderBlock *> &block_list, ShaderBlock *root)
|
|
{
|
|
if (!root)
|
|
return;
|
|
|
|
// Gather all children.
|
|
for (uint n = 0; n < root->GetInputCount(); ++n)
|
|
GatherBlockList(block_list, root->GetInput(n));
|
|
|
|
// Add self.
|
|
if (!block_list.Find(root))
|
|
block_list.Append(root);
|
|
}
|
|
|
|
void ShaderTree::Free()
|
|
{
|
|
// Gather all blocks in tree.
|
|
List <ShaderBlock *> block_list;
|
|
for (int n = 0; n < SinkInvalid; ++n)
|
|
GatherBlockList(block_list, sink[n]);
|
|
|
|
// Disconnect all sinks.
|
|
for (int n = 0; n < SinkInvalid; ++n)
|
|
sink[n] = NULL;
|
|
|
|
// Delete all blocks.
|
|
ListDeleteAllPtr(ShaderBlock *, block_list)
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
ShaderTree::ShaderTree()
|
|
{
|
|
for (int n = 0; n < SinkInvalid; ++n)
|
|
sink[n] = 0;
|
|
}
|
|
ShaderTree::~ShaderTree()
|
|
{ Free(); }
|
|
//------------------------------------------------------------------------------
|