From 0afbbd2fdfc1a8245f0a5853483bc19472db4068 Mon Sep 17 00:00:00 2001 From: alcoholicgirl <2680813175@qq.com> Date: Mon, 27 Apr 2026 23:08:25 +0800 Subject: [PATCH] bug fixes --- konabot/plugins/marchtoy/obj.py | 3 ++- konabot/plugins/marchtoy/op.py | 2 +- konabot/plugins/marchtoy/scene.py | 13 +++++++------ konabot/plugins/marchtoy/shaders/frag.glsl | 15 ++++++++++++--- konabot/plugins/marchtoy/utilities.py | 2 +- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/konabot/plugins/marchtoy/obj.py b/konabot/plugins/marchtoy/obj.py index 019bb3a..36cf50a 100644 --- a/konabot/plugins/marchtoy/obj.py +++ b/konabot/plugins/marchtoy/obj.py @@ -23,7 +23,7 @@ class Transform: @staticmethod def normalize(p: np.ndarray) -> np.ndarray: - return p / (np.sqrt(np.dot(p, p)) + 1e-8) + return p / (np.linalg.norm(p) + 1e-8) def translate(self, x: float, y: float, z: float): mat = np.identity(4, dtype=np.float32) @@ -244,6 +244,7 @@ class BoolSubstract(Object): def sdf_block_glsl(self): return f"max({self.block_a}, -{self.block_b})" +@make_obj("add", "addition") class BoolAddition(Object): def __init__(self): super().__init__() diff --git a/konabot/plugins/marchtoy/op.py b/konabot/plugins/marchtoy/op.py index c9cb7b6..8bde49c 100644 --- a/konabot/plugins/marchtoy/op.py +++ b/konabot/plugins/marchtoy/op.py @@ -52,5 +52,5 @@ def color(obj: Object, args: list[str]): @make_op("rounded", "round_corner", "corner") def rounded(obj: Object, args: list[str]): if len(args) >= 1: - obj.round_corner = ArgParser.as_float(args[0]) + obj.round_corner = ArgParser.as_float(args) \ No newline at end of file diff --git a/konabot/plugins/marchtoy/scene.py b/konabot/plugins/marchtoy/scene.py index 9a0029c..dff3184 100644 --- a/konabot/plugins/marchtoy/scene.py +++ b/konabot/plugins/marchtoy/scene.py @@ -19,7 +19,7 @@ class Scene: cmd_queue = CommandParser(raw_cmd) cmd_obj = next(cmd_queue) obj_id, obj_args = cmd_obj.id, cmd_obj.args - logger.info(f"parsing object: {obj_id} with args {obj_args}") + # logger.info(f"parsing object: {obj_id} with args {obj_args}") obj_instance: Optional[Object] = None if obj_id in OBJECT_ENTRIES: obj_cls = OBJECT_ENTRIES[obj_id] @@ -35,11 +35,11 @@ class Scene: ) from e else: raise Exception(f"{obj_id} is not a valid object type.") - logger.info(f"parsed object {obj_id}({obj_args})") + # logger.info(f"parsed object {obj_id}({obj_args})") if obj_instance != None: for cmd in cmd_queue: op_id, op_args = cmd.id, cmd.args - logger.info(f"parsing operation {op_id} with args {op_args}") + # logger.info(f"parsing operation {op_id} with args {op_args}") if op_id in OPERATION_ENTRIES: op_func = OPERATION_ENTRIES[op_id] if not callable(op_func): @@ -47,14 +47,14 @@ class Scene: op_func(obj_instance, op_args) else: raise Exception(f"{op_id} is not a valid operation.") - logger.info(f"parsed operation {op_id}({op_args})") + # logger.info(f"parsed operation {op_id}({op_args})") try: sdf_block = obj_instance.sdf_block_glsl() self.canvas_objs.append((obj_instance, sdf_block)) - logger.info(f"parsed sdf {sdf_block}") + # logger.info(f"parsed sdf {sdf_block}") except: - logger.info(f"parsed camera") + # logger.info(f"parsed camera") if type(obj_instance) == Camera: self.camera = obj_instance @@ -70,6 +70,7 @@ class Scene: for canvas_item in self.canvas_objs: obj, sdf_expr = canvas_item round_corner = f"- {obj.round_corner}" if obj.round_corner > 1e-8 else "" + logger.info(round_corner) sdf_block += f"float sd{index} = {sdf_expr}{round_corner};" sdf_block += f"if(sd{index} < qry.value)" sdf_block += "{" + f"qry.value = sd{index}; qry.obj_id = {index}; " + "}\n" diff --git a/konabot/plugins/marchtoy/shaders/frag.glsl b/konabot/plugins/marchtoy/shaders/frag.glsl index 3aca0f7..951c29e 100644 --- a/konabot/plugins/marchtoy/shaders/frag.glsl +++ b/konabot/plugins/marchtoy/shaders/frag.glsl @@ -36,12 +36,21 @@ float sdTorus( vec3 p, vec2 t ) vec2 q = vec2(length(p.xz)-t.x,p.y); return length(q)-t.y; } +// float smin( float a, float b, float k ) +// { +// k *= 1.0; +// float r = exp2(-a/k) + exp2(-b/k); +// return -k*log2(r); +// } + float smin( float a, float b, float k ) { - k *= 1.0; - float r = exp2(-a/k) + exp2(-b/k); - return -k*log2(r); + k *= 2.0; + float x = (b-a)/k; + float g = 0.5*(x+sqrt(x*x+1.0)); + return b - k * g; } + sdQuery sd(vec3 p) { sdQuery qry; qry.value = INF; diff --git a/konabot/plugins/marchtoy/utilities.py b/konabot/plugins/marchtoy/utilities.py index 4491654..ed478d5 100644 --- a/konabot/plugins/marchtoy/utilities.py +++ b/konabot/plugins/marchtoy/utilities.py @@ -92,4 +92,4 @@ class ArgParser: def as_literal_color(args: list[str], default=np.array((1.0, 1.0, 1.0, 1.0))): if len(args) == 1 and args[0] in COLORS: return np.array(COLORS[args[0]]) - return default + return default \ No newline at end of file