From 232b93bd1f8edb9ff3d5dd834630b2fc21b440c2 Mon Sep 17 00:00:00 2001 From: Mitch Andrews Date: Sat, 1 Jun 2024 05:12:19 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=91=A8=E2=80=8D=F0=9F=94=AC=20Bool=20/=20?= =?UTF-8?q?Absolute=20Node?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ShaderEditor/Source/Nodes/BasicNodes.cpp | 132 +++++++++++++++++- Tools/ShaderEditor/Source/Nodes/BasicNodes.h | 27 ++++ .../Source/ShaderEditorInstance.cpp | 35 ++++- 3 files changed, 189 insertions(+), 5 deletions(-) diff --git a/Tools/ShaderEditor/Source/Nodes/BasicNodes.cpp b/Tools/ShaderEditor/Source/Nodes/BasicNodes.cpp index c3c9bd48..8fd9fe13 100644 --- a/Tools/ShaderEditor/Source/Nodes/BasicNodes.cpp +++ b/Tools/ShaderEditor/Source/Nodes/BasicNodes.cpp @@ -6,6 +6,7 @@ #include "Utils\ImGuiUtils.h" #include "Utils\PlatformUtils.h" #include "Utils\ShaderEditorUtils.h" +#include "Mathf.h" LessThanNode::LessThanNode( int& inId ) : Node( inId++, "Less Than" ) @@ -49,6 +50,121 @@ bool LessThanNode::OnEvaluate() } +AbsoluteNode::AbsoluteNode( int& inId ) + : Node( inId++, "Absolute", { 68, 201, 156 } ) +{ + Outputs.emplace_back( inId++, "Value", PinType::Float ); + + Inputs.emplace_back( inId++, "Value", PinType::Float ); + Inputs.back().Data = value; + + BuildNode(); +} + +bool AbsoluteNode::OnEvaluate() +{ + float evaluatedValue = value; + if( Inputs.size() > 0 ) + { + if( Inputs[0].LinkedInput ) + { + float linkedValue = std::get( Inputs[0].LinkedInput->Data ); + //Inputs[0].Name = linkedValue ? "true" : "false"; + evaluatedValue = linkedValue; + } + } + + evaluatedValue = Mathf::Abs( evaluatedValue ); + Outputs[0].Data = evaluatedValue; + Outputs[0].Name = std::string( "Value(" + std::to_string( evaluatedValue ) + ")" ).c_str(); + // update the output pin + return false; +} + +bool AbsoluteNode::OnRender() +{ + if( Inputs.size() > 0 && Inputs[0].LinkedInput ) + { + return false; + } + //ImGui::PushItemWidth( 100 ); + //if( ImGui::Checkbox( "Value", &value ) ) + //{ + //} + //ImGui::PopItemWidth(); + + return true; +} + +void AbsoluteNode::OnExport( ShaderWriter& inFile ) +{ + // Make this a helper + if( !ExportLinkedPin( 0, inFile ) ) + { + inFile.WriteFloat( value ); + } + + std::string var = "f_" + std::to_string( inFile.ID++ ); + inFile.WriteLine( "float " + var + " = abs(" + inFile.LastVariable + ");" ); + inFile.LastVariable = var; +} + + +BoolNode::BoolNode( int& inId ) + : Node( inId++, "Bool", { 68, 201, 156 } ) +{ + Outputs.emplace_back( inId++, "Value", PinType::Bool ); + + Inputs.emplace_back( inId++, "Value", PinType::Bool ); + Inputs.back().Data = value; + + BuildNode(); +} + +bool BoolNode::OnEvaluate() +{ + bool evaluatedValue = value; + if( Inputs.size() > 0 ) + { + if( Inputs[0].LinkedInput ) + { + bool linkedValue = std::get( Inputs[0].LinkedInput->Data ); + Inputs[0].Name = linkedValue ? "true" : "false"; + evaluatedValue = linkedValue; + } + else + { + Inputs[0].Name = value ? "true" : "false"; + } + } + + Outputs[0].Data = evaluatedValue; + Outputs[0].Name = std::string( "Value(" + std::to_string( evaluatedValue ) + ")" ).c_str(); + // update the output pin + return false; +} + +bool BoolNode::OnRender() +{ + if( Inputs.size() > 0 && Inputs[0].LinkedInput ) + { + return false; + } + ImGui::PushItemWidth( 100 ); + if( ImGui::Checkbox( "Value", &value ) ) + { + } + ImGui::PopItemWidth(); + + return true; +} + +void BoolNode::OnExport( ShaderWriter& inFile ) +{ + //inFile.WriteInt( value ); +} + + IntegerNode::IntegerNode( int& inId ) : Node( inId++, "Integer", { 68, 201, 156 } ) { @@ -125,7 +241,7 @@ void FloatNode::OnExport( ShaderWriter& inFile ) Vector3Node::Vector3Node( int& inId ) : Node( inId++, "Vector 3", { 68, 201, 156 } ) { - Size = { 400, 0 }; + Size = { 300, 0 }; Inputs.emplace_back( inId++, "X(1)", PinType::Float ); Inputs.back().Data = 0.f; Inputs.emplace_back( inId++, "Y(1)", PinType::Float ); @@ -172,6 +288,7 @@ void Vector3Node::OnExport( ShaderWriter& inFile ) AddNode::AddNode( int& inId ) : Node( inId++, "Add", { 168, 201, 156 } ) { + Size = { 300, 0 }; Inputs.emplace_back( inId++, "A(3)", PinType::Vector3Type ); Inputs.back().Data = 0.f; Inputs.emplace_back( inId++, "B(3)", PinType::Vector3Type ); @@ -341,6 +458,19 @@ BasicShaderMasterNode::BasicShaderMasterNode( int& inId ) bool BasicShaderMasterNode::OnEvaluate() { + //if( Inputs.size() > 1 ) + //{ + // if( Inputs[2].LinkedInput ) + // { + // float linkedValue = std::get( Inputs[2].LinkedInput->Data ); + // Inputs[2].Name = linkedValue ? std::string("Alpha(" + std::to_string(linkedValue) + ")") : "Alpha(1)"; + // //evaluatedValue = linkedValue; + // } + // else + // { + // //Inputs[2].Name = value ? "true" : "false"; + // } + //} return false; } diff --git a/Tools/ShaderEditor/Source/Nodes/BasicNodes.h b/Tools/ShaderEditor/Source/Nodes/BasicNodes.h index 365fc518..7fb08cd2 100644 --- a/Tools/ShaderEditor/Source/Nodes/BasicNodes.h +++ b/Tools/ShaderEditor/Source/Nodes/BasicNodes.h @@ -16,6 +16,33 @@ class LessThanNode bool OnEvaluate() override; }; + +class AbsoluteNode + : public Node +{ +public: + // is this needed? + float value = 0.f; + AbsoluteNode( int& inId ); + + bool OnEvaluate() override; + bool OnRender() override; + void OnExport( ShaderWriter& inFile ) override; +}; + + +class BoolNode + : public Node +{ +public: + bool value = false; + BoolNode( int& inId ); + + bool OnEvaluate() override; + bool OnRender() override; + void OnExport( ShaderWriter& inFile ) override; +}; + class IntegerNode : public Node { diff --git a/Tools/ShaderEditor/Source/ShaderEditorInstance.cpp b/Tools/ShaderEditor/Source/ShaderEditorInstance.cpp index fe23f984..d4eab4dc 100644 --- a/Tools/ShaderEditor/Source/ShaderEditorInstance.cpp +++ b/Tools/ShaderEditor/Source/ShaderEditorInstance.cpp @@ -455,9 +455,27 @@ void ShaderEditorInstance::HandleAddNodeConxtualMenu() //drawList->AddCircleFilled(ImGui::GetMousePosOnOpeningCurrentPopup(), 10.0f, 0xFFFF00FF); Node* node = nullptr; - if( ImGui::MenuItem( "Add" ) ) + + if( ImGui::BeginMenu( "Math" ) ) + { + if( ImGui::MenuItem( "Add" ) ) + { + node = SpawnNodeFromString( m_NextId, std::string( "Add" ) ); + m_Nodes.push_back( node ); + } + if( ImGui::MenuItem( "Absolute" ) ) + { + node = SpawnNodeFromString( m_NextId, std::string( "Absolute" ) ); + m_Nodes.push_back( node ); + } + ImGui::EndMenu(); + } + + ImGui::Separator(); + + if( ImGui::MenuItem( "Bool" ) ) { - node = SpawnNodeFromString( m_NextId, std::string( "Add" ) ); + node = SpawnNodeFromString( m_NextId, std::string( "Bool" ) ); m_Nodes.push_back( node ); } if( ImGui::MenuItem( "Vector 3" ) ) @@ -585,6 +603,15 @@ Node* ShaderEditorInstance::SpawnNodeFromString( int& inNodeId, std::string& inI m_masterNode = new BasicShaderMasterNode( inNodeId ); return m_masterNode; } + + if( inId == "Absolute" ) + { + return new AbsoluteNode( inNodeId ); + } + if( inId == "Bool" ) + { + return new BoolNode( inNodeId ); + } if( inId == "Integer" ) { return new IntegerNode( inNodeId ); @@ -1127,8 +1154,8 @@ void ShaderEditorInstance::DrawBasicNodes() } if( input.Type == PinType::Bool ) { - ImGui::Button( "Hello" ); - ImGui::Spring( 0 ); + //ImGui::Button( "" ); + //ImGui::Spring( 0 ); } ImGui::PopStyleVar(); builder.EndInput();