| 836 | } |
| 837 | |
| 838 | void ShaderGenerator::ProcessGroupBoolean(Box* box, Node* node, Value& value) |
| 839 | { |
| 840 | switch (node->TypeID) |
| 841 | { |
| 842 | // NOT |
| 843 | case 1: |
| 844 | { |
| 845 | // Get A value |
| 846 | const Value a = tryGetValue(node->GetBox(0), Value::False).AsBool(); |
| 847 | |
| 848 | // Perform operation |
| 849 | value = writeLocal(ValueType::Bool, String::Format(TEXT("!{0}"), a.Value), node); |
| 850 | break; |
| 851 | } |
| 852 | // AND, OR, XOR, NOR, NAND |
| 853 | case 2: |
| 854 | case 3: |
| 855 | case 4: |
| 856 | case 5: |
| 857 | case 6: |
| 858 | { |
| 859 | // Get A and B values |
| 860 | const Value a = tryGetValue(node->GetBox(0), node->Values[0]).AsBool(); |
| 861 | const Value b = tryGetValue(node->GetBox(1), node->Values[1]).AsBool(); |
| 862 | |
| 863 | // Perform operation |
| 864 | const Char* op; |
| 865 | switch (node->TypeID) |
| 866 | { |
| 867 | // AND |
| 868 | case 2: |
| 869 | op = TEXT("{0} && {1}"); |
| 870 | break; |
| 871 | // OR |
| 872 | case 3: |
| 873 | op = TEXT("{0} || {1}"); |
| 874 | break; |
| 875 | // XOR |
| 876 | case 4: |
| 877 | op = TEXT("!{0} != !{1}"); |
| 878 | break; |
| 879 | // NOR |
| 880 | case 5: |
| 881 | op = TEXT("!({0} || {1})"); |
| 882 | break; |
| 883 | // NAND |
| 884 | case 6: |
| 885 | op = TEXT("!({0} && {1})"); |
| 886 | break; |
| 887 | default: |
| 888 | CRASH; |
| 889 | return; |
| 890 | } |
| 891 | value = writeLocal(ValueType::Bool, String::Format(op, a.Value, b.Value), node); |
| 892 | break; |
| 893 | } |
| 894 | default: |
| 895 | break; |