bug fixes

This commit is contained in:
alcoholicgirl
2026-04-27 23:08:25 +08:00
parent 3175817b63
commit 0afbbd2fdf
5 changed files with 23 additions and 12 deletions

View File

@ -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__()

View File

@ -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)

View File

@ -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"

View File

@ -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;

View File

@ -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