bug fixes
This commit is contained in:
@ -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__()
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
Reference in New Issue
Block a user