175 lines
5.6 KiB
C#
175 lines
5.6 KiB
C#
// Amplify Shader Editor - Visual Shader Editing Tool
|
|
// Copyright (c) Amplify Creations, Lda <info@amplify.pt>
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace AmplifyShaderEditor
|
|
{
|
|
// PORT CONTROLLERS
|
|
[Serializable]
|
|
public class TemplateOptionPortItem
|
|
{
|
|
[SerializeField]
|
|
private int m_portId = -1;
|
|
|
|
[SerializeField]
|
|
private TemplateOptionsItem m_options;
|
|
|
|
public TemplateOptionPortItem( TemplateMultiPassMasterNode owner, TemplateOptionsItem options )
|
|
{
|
|
m_options = options;
|
|
InputPort port = owner.InputPorts.Find( x => x.Name.Equals( options.Name ) );
|
|
if( port != null )
|
|
{
|
|
m_portId = port.PortId;
|
|
}
|
|
}
|
|
|
|
public void FillDataCollector( TemplateMultiPassMasterNode owner, ref MasterNodeDataCollector dataCollector )
|
|
{
|
|
InputPort port = null;
|
|
if( m_portId > -1 )
|
|
{
|
|
port = owner.GetInputPortByUniqueId( m_portId );
|
|
}
|
|
else
|
|
{
|
|
port = owner.InputPorts.Find( x => x.Name.Equals( m_options.Name ) );
|
|
}
|
|
|
|
if( port != null )
|
|
{
|
|
int optionId = port.HasOwnOrLinkConnection ? 0 : 1;
|
|
for( int i = 0; i < m_options.ActionsPerOption[ optionId ].Length; i++ )
|
|
{
|
|
switch( m_options.ActionsPerOption[ optionId ][ i ].ActionType )
|
|
{
|
|
case AseOptionsActionType.SetDefine:
|
|
{
|
|
List<TemplateMultiPassMasterNode> nodes = owner.ContainerGraph.GetMultiPassMasterNodes( owner.LODIndex );
|
|
int count = nodes.Count;
|
|
for( int nodeIdx = 0; nodeIdx < count; nodeIdx++ )
|
|
{
|
|
nodes[ nodeIdx ].OptionsDefineContainer.AddDefine( "#define "+m_options.ActionsPerOption[ optionId ][ i ].ActionData, false );
|
|
}
|
|
//dataCollector.AddToDefines( -1, m_options.ActionsPerOption[ optionId ][ i ].ActionData );
|
|
}
|
|
break;
|
|
case AseOptionsActionType.SetUndefine:
|
|
{
|
|
List<TemplateMultiPassMasterNode> nodes = owner.ContainerGraph.GetMultiPassMasterNodes( owner.LODIndex );
|
|
int count = nodes.Count;
|
|
for( int nodeIdx = 0; nodeIdx < count; nodeIdx++ )
|
|
{
|
|
nodes[ nodeIdx ].OptionsDefineContainer.AddDefine( "#undef " + m_options.ActionsPerOption[ optionId ][ i ].ActionData, false );
|
|
}
|
|
//dataCollector.AddToDefines( -1, m_options.ActionsPerOption[ optionId ][ i ].ActionData, false );
|
|
}
|
|
break;
|
|
case AseOptionsActionType.SetShaderProperty:
|
|
{
|
|
TemplateShaderPropertyData data = owner.CurrentTemplate.GetShaderPropertyData( m_options.ActionsPerOption[ optionId ][ i ].ActionData );
|
|
if( data != null )
|
|
{
|
|
string newPropertyValue = data.CreatePropertyForValue( m_options.ActionsPerOption[ optionId ][ i ].ActionBuffer );
|
|
owner.CurrentTemplate.IdManager.SetReplacementText( data.FullValue, newPropertyValue );
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void SubShaderFillDataCollector( TemplateMultiPassMasterNode owner, ref MasterNodeDataCollector dataCollector )
|
|
{
|
|
|
|
//TemplateMultiPassMasterNode targetNode = string.IsNullOrEmpty(m_options.Id) ? owner:owner.ContainerGraph.GetMasterNodeOfPass( m_options.Id , owner.LODIndex );
|
|
TemplateMultiPassMasterNode targetNode = string.IsNullOrEmpty( m_options.Id ) ?
|
|
owner.ContainerGraph.GetMainMasterNodeOfLOD( owner.LODIndex ) :
|
|
owner.ContainerGraph.GetMasterNodeOfPass( m_options.Id , owner.LODIndex );
|
|
|
|
InputPort port = null;
|
|
if( m_portId > -1 )
|
|
{
|
|
port = targetNode.GetInputPortByUniqueId( m_portId );
|
|
}
|
|
else
|
|
{
|
|
port = targetNode.InputPorts.Find( x => x.Name.Equals( m_options.Name ) );
|
|
}
|
|
|
|
if( port != null )
|
|
{
|
|
int optionId = port.HasOwnOrLinkConnection ? 0 : 1;
|
|
for( int i = 0; i < m_options.ActionsPerOption[ optionId ].Length; i++ )
|
|
{
|
|
if( string.IsNullOrEmpty( m_options.ActionsPerOption[ optionId ][ i ].PassName ) ||
|
|
m_options.ActionsPerOption[ optionId ][ i ].PassName.Equals( owner.PassName ) )
|
|
{
|
|
switch( m_options.ActionsPerOption[ optionId ][ i ].ActionType )
|
|
{
|
|
case AseOptionsActionType.SetDefine:
|
|
{
|
|
owner.OptionsDefineContainer.AddDefine( "#define " + m_options.ActionsPerOption[ optionId ][ i ].ActionData, true );
|
|
}
|
|
break;
|
|
case AseOptionsActionType.SetUndefine:
|
|
{
|
|
owner.OptionsDefineContainer.AddDefine( "#undef " + m_options.ActionsPerOption[ optionId ][ i ].ActionData, true );
|
|
}
|
|
break;
|
|
case AseOptionsActionType.SetShaderProperty:
|
|
{
|
|
TemplateShaderPropertyData data = owner.CurrentTemplate.GetShaderPropertyData( m_options.ActionsPerOption[ optionId ][ i ].ActionData );
|
|
if( data != null )
|
|
{
|
|
string newPropertyValue = data.CreatePropertyForValue( m_options.ActionsPerOption[ optionId ][ i ].ActionBuffer );
|
|
owner.CurrentTemplate.IdManager.SetReplacementText( data.FullValue, newPropertyValue );
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public void CheckImediateActionsForPort( TemplateMultiPassMasterNode owner, int portId )
|
|
{
|
|
if( portId != m_portId )
|
|
return;
|
|
|
|
InputPort port = null;
|
|
if( m_portId > -1 )
|
|
{
|
|
port = owner.GetInputPortByUniqueId( m_portId );
|
|
}
|
|
else
|
|
{
|
|
port = owner.InputPorts.Find( x => x.Name.Equals( m_options.Name ) );
|
|
}
|
|
|
|
if( port != null )
|
|
{
|
|
int optionId = port.HasOwnOrLinkConnection ? 0 : 1;
|
|
for( int i = 0; i < m_options.ActionsPerOption[ optionId ].Length; i++ )
|
|
{
|
|
switch( m_options.ActionsPerOption[ optionId ][ i ].ActionType )
|
|
{
|
|
case AseOptionsActionType.SetPortName:
|
|
{
|
|
port.Name = m_options.ActionsPerOption[ optionId ][ i ].ActionData;
|
|
owner.SizeIsDirty = true;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
public TemplateOptionsItem Options { get { return m_options; } }
|
|
}
|
|
}
|