bool addition, few fixes

This commit is contained in:
alcoholicgirl
2026-04-27 22:49:19 +08:00
parent 129870709b
commit 3175817b63
4 changed files with 30 additions and 7 deletions

View File

@ -14,8 +14,10 @@ with (PATH / "vert.glsl").open(encoding='utf-8') as f:
async def render(command: str, res: tuple[int, int]):
fs = Scene(command).compile()
ctx = moderngl.create_context(standalone=True, backend="egl")
try:
ctx = moderngl.create_context(standalone=True)
except:
ctx = moderngl.create_context(standalone=True, backend="egl")
ctx.gc_mode = "auto"
try:
program = ctx.program(

View File

@ -244,6 +244,27 @@ class BoolSubstract(Object):
def sdf_block_glsl(self):
return f"max({self.block_a}, -{self.block_b})"
class BoolAddition(Object):
def __init__(self):
super().__init__()
def parse_args(self, args: list[str]):
from konabot.plugins.marchtoy.scene import Scene
try:
if not len(args) >= 2:
raise Exception("expecting at least 2 args")
scene_a = Scene(args[0])
scene_b = Scene(args[1])
self.block_a = scene_a.canvas_objs[0][1]
self.block_b = scene_b.canvas_objs[0][1]
except Exception as e:
raise Exception(f"cannot build bool object over {args}: {e}")
def sdf_block_glsl(self):
return f"min({self.block_a}, {self.block_b})"
@make_obj("camera", "cam")
class Camera(Object):
def __init__(self, _focus: float = 2.0) -> None:

View File

@ -69,11 +69,10 @@ class Scene:
index = 0
for canvas_item in self.canvas_objs:
obj, sdf_expr = canvas_item
sdf_block += f"float sd{index} = {sdf_expr};"
sdf_block += f"if(sd{index} < qry.value)"
# 1e-8 最好换成某个 epsilon
round_corner = f"- {obj.round_corner}" if obj.round_corner > 1e-8 else ""
sdf_block += "{" + f"qry.value = sd{index} {round_corner}; qry.obj_id = {index}; " + "}\n"
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"
color = obj.texture.color
color_block += (
f"if(obj_id == {index}) return vec4("

View File

@ -1,6 +1,7 @@
#version 330
const float EPS = 0.001;
const int MAX_ITER = 128;
const float INF = 1e10;
uniform vec2 u_resolution;
out vec4 fragColor;
@ -43,7 +44,7 @@ float smin( float a, float b, float k )
}
sdQuery sd(vec3 p) {
sdQuery qry;
qry.value = 100000000.0;
qry.value = INF;
qry.obj_id = -1;
<SDF_BLOCK>
return qry;