bool addition, few fixes
This commit is contained in:
@ -14,8 +14,10 @@ with (PATH / "vert.glsl").open(encoding='utf-8') as f:
|
|||||||
|
|
||||||
async def render(command: str, res: tuple[int, int]):
|
async def render(command: str, res: tuple[int, int]):
|
||||||
fs = Scene(command).compile()
|
fs = Scene(command).compile()
|
||||||
|
try:
|
||||||
ctx = moderngl.create_context(standalone=True, backend="egl")
|
ctx = moderngl.create_context(standalone=True)
|
||||||
|
except:
|
||||||
|
ctx = moderngl.create_context(standalone=True, backend="egl")
|
||||||
ctx.gc_mode = "auto"
|
ctx.gc_mode = "auto"
|
||||||
try:
|
try:
|
||||||
program = ctx.program(
|
program = ctx.program(
|
||||||
|
|||||||
@ -244,6 +244,27 @@ class BoolSubstract(Object):
|
|||||||
def sdf_block_glsl(self):
|
def sdf_block_glsl(self):
|
||||||
return f"max({self.block_a}, -{self.block_b})"
|
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")
|
@make_obj("camera", "cam")
|
||||||
class Camera(Object):
|
class Camera(Object):
|
||||||
def __init__(self, _focus: float = 2.0) -> None:
|
def __init__(self, _focus: float = 2.0) -> None:
|
||||||
|
|||||||
@ -69,11 +69,10 @@ class Scene:
|
|||||||
index = 0
|
index = 0
|
||||||
for canvas_item in self.canvas_objs:
|
for canvas_item in self.canvas_objs:
|
||||||
obj, sdf_expr = canvas_item
|
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 ""
|
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 = obj.texture.color
|
||||||
color_block += (
|
color_block += (
|
||||||
f"if(obj_id == {index}) return vec4("
|
f"if(obj_id == {index}) return vec4("
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
#version 330
|
#version 330
|
||||||
const float EPS = 0.001;
|
const float EPS = 0.001;
|
||||||
const int MAX_ITER = 128;
|
const int MAX_ITER = 128;
|
||||||
|
const float INF = 1e10;
|
||||||
|
|
||||||
uniform vec2 u_resolution;
|
uniform vec2 u_resolution;
|
||||||
out vec4 fragColor;
|
out vec4 fragColor;
|
||||||
@ -43,7 +44,7 @@ float smin( float a, float b, float k )
|
|||||||
}
|
}
|
||||||
sdQuery sd(vec3 p) {
|
sdQuery sd(vec3 p) {
|
||||||
sdQuery qry;
|
sdQuery qry;
|
||||||
qry.value = 100000000.0;
|
qry.value = INF;
|
||||||
qry.obj_id = -1;
|
qry.obj_id = -1;
|
||||||
<SDF_BLOCK>
|
<SDF_BLOCK>
|
||||||
return qry;
|
return qry;
|
||||||
|
|||||||
Reference in New Issue
Block a user