Feat: Add Math and Random Generator nodes

This commit is contained in:
root
2026-03-24 13:04:33 +00:00
parent 98495eb7ad
commit e34631dcb4
3 changed files with 162 additions and 0 deletions
+38
View File
@@ -259,6 +259,43 @@ Useful for dynamic resizing, conditional logic based on aspect ratio, or passing
---
### 🧮 Math & Random
<details>
<summary><b>➕ Int/Float Math Operation</b> - Perform basic arithmetic</summary>
**Category:** `DebugPadawan/Math`
Performs simple math operations (add, subtract, multiply, divide, modulo, power) on integers or floats.
**📥 Inputs:**
- `a`, `b` *(Int/Float)*: The values to calculate
- `operation` *(List)*: The type of mathematical operation
**📤 Outputs:**
- `result` *(Int/Float)*: The calculated value (returns both Int and Float variations)
</details>
<details>
<summary><b>🎲 Random Generator</b> - Seed-based random values</summary>
**Category:** `DebugPadawan/Math`
Generates a random float or integer between a min and max value, driven by a specific seed for reproducibility.
**📥 Inputs:**
- `seed` *(Integer)*: Seed for the random generator
- `min_val`, `max_val` *(Float/Integer)*: The range bounds
- `mode` *(List)*: Whether to generate a float or an int
**📤 Outputs:**
- `val` *(Float/Integer)*: The random value (returns both Int and Float formats)
</details>
---
### 🔧 Utility Nodes
<details>
@@ -338,6 +375,7 @@ Data → Wait (2.0s) → Processing → Wait (1.0s) → Output
| **DebugPadawan/Utilities** | List Info | Data analysis helpers |
| **DebugPadawan/Logic** | Conditional String | Conditional operations |
| **DebugPadawan/Image** | Image Info | Image tensor analysis |
| **DebugPadawan/Math** | Int Math Operation, Float Math Operation, Random Generator | Basic arithmetic and random number generation |
---
+4
View File
@@ -13,6 +13,8 @@ from .nodes.json import NODE_CLASS_MAPPINGS as JSON_NODES
from .nodes.json import NODE_DISPLAY_NAME_MAPPINGS as JSON_DISPLAY_NAMES
from .nodes.image import NODE_CLASS_MAPPINGS as IMAGE_NODES
from .nodes.image import NODE_DISPLAY_NAME_MAPPINGS as IMAGE_DISPLAY_NAMES
from .nodes.math_nodes import NODE_CLASS_MAPPINGS as MATH_NODES
from .nodes.math_nodes import NODE_DISPLAY_NAME_MAPPINGS as MATH_DISPLAY_NAMES
# Combine all node mappings
NODE_CLASS_MAPPINGS = {
@@ -21,6 +23,7 @@ NODE_CLASS_MAPPINGS = {
**TIMING_NODES,
**JSON_NODES,
**IMAGE_NODES,
**MATH_NODES,
}
NODE_DISPLAY_NAME_MAPPINGS = {
@@ -29,6 +32,7 @@ NODE_DISPLAY_NAME_MAPPINGS = {
**TIMING_DISPLAY_NAMES,
**JSON_DISPLAY_NAMES,
**IMAGE_DISPLAY_NAMES,
**MATH_DISPLAY_NAMES,
}
__all__ = ['NODE_CLASS_MAPPINGS', 'NODE_DISPLAY_NAME_MAPPINGS']
+120
View File
@@ -0,0 +1,120 @@
import random
import math
class IntMathOperation:
"""
Node for performing basic integer math operations
"""
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"a": ("INT", {"default": 0, "step": 1}),
"b": ("INT", {"default": 0, "step": 1}),
"operation": (["add", "subtract", "multiply", "divide", "modulo", "power"],),
}
}
RETURN_TYPES = ("INT", "FLOAT")
RETURN_NAMES = ("int_result", "float_result")
FUNCTION = "perform_math"
CATEGORY = "DebugPadawan/Math"
def perform_math(self, a, b, operation):
if operation == "add":
res = a + b
elif operation == "subtract":
res = a - b
elif operation == "multiply":
res = a * b
elif operation == "divide":
res = a / b if b != 0 else 0
elif operation == "modulo":
res = a % b if b != 0 else 0
elif operation == "power":
res = math.pow(a, b)
else:
res = 0
return (int(res), float(res))
class FloatMathOperation:
"""
Node for performing basic float math operations
"""
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"a": ("FLOAT", {"default": 0.0, "step": 0.01}),
"b": ("FLOAT", {"default": 0.0, "step": 0.01}),
"operation": (["add", "subtract", "multiply", "divide", "power"],),
}
}
RETURN_TYPES = ("FLOAT", "INT")
RETURN_NAMES = ("float_result", "int_result")
FUNCTION = "perform_math"
CATEGORY = "DebugPadawan/Math"
def perform_math(self, a, b, operation):
if operation == "add":
res = a + b
elif operation == "subtract":
res = a - b
elif operation == "multiply":
res = a * b
elif operation == "divide":
res = a / b if b != 0 else 0.0
elif operation == "power":
res = math.pow(a, b)
else:
res = 0.0
return (float(res), int(res))
class RandomGenerator:
"""
Node for generating random integers or floats based on a seed
"""
@classmethod
def INPUT_TYPES(cls):
return {
"required": {
"seed": ("INT", {"default": 0, "min": 0, "max": 0xffffffffffffffff}),
"min_val": ("FLOAT", {"default": 0.0, "step": 0.01}),
"max_val": ("FLOAT", {"default": 1.0, "step": 0.01}),
"mode": (["float", "int"],),
}
}
RETURN_TYPES = ("FLOAT", "INT")
RETURN_NAMES = ("float_val", "int_val")
FUNCTION = "generate"
CATEGORY = "DebugPadawan/Math"
def generate(self, seed, min_val, max_val, mode):
# Initialize the random generator with the seed
rng = random.Random(seed)
if mode == "float":
res = rng.uniform(min_val, max_val)
return (float(res), int(res))
else:
# For int mode, ensure min and max are integers
res = rng.randint(int(min_val), int(max_val))
return (float(res), int(res))
NODE_CLASS_MAPPINGS = {
"DebugPadawan_IntMathOperation": IntMathOperation,
"DebugPadawan_FloatMathOperation": FloatMathOperation,
"DebugPadawan_RandomGenerator": RandomGenerator,
}
NODE_DISPLAY_NAME_MAPPINGS = {
"DebugPadawan_IntMathOperation": "Int Math Operation",
"DebugPadawan_FloatMathOperation": "Float Math Operation",
"DebugPadawan_RandomGenerator": "Random Generator",
}