bug fixes
This commit is contained in:
@ -23,7 +23,7 @@ class Transform:
|
|||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def normalize(p: np.ndarray) -> np.ndarray:
|
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):
|
def translate(self, x: float, y: float, z: float):
|
||||||
mat = np.identity(4, dtype=np.float32)
|
mat = np.identity(4, dtype=np.float32)
|
||||||
@ -244,6 +244,7 @@ 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})"
|
||||||
|
|
||||||
|
@make_obj("add", "addition")
|
||||||
class BoolAddition(Object):
|
class BoolAddition(Object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|||||||
@ -52,5 +52,5 @@ def color(obj: Object, args: list[str]):
|
|||||||
@make_op("rounded", "round_corner", "corner")
|
@make_op("rounded", "round_corner", "corner")
|
||||||
def rounded(obj: Object, args: list[str]):
|
def rounded(obj: Object, args: list[str]):
|
||||||
if len(args) >= 1:
|
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_queue = CommandParser(raw_cmd)
|
||||||
cmd_obj = next(cmd_queue)
|
cmd_obj = next(cmd_queue)
|
||||||
obj_id, obj_args = cmd_obj.id, cmd_obj.args
|
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
|
obj_instance: Optional[Object] = None
|
||||||
if obj_id in OBJECT_ENTRIES:
|
if obj_id in OBJECT_ENTRIES:
|
||||||
obj_cls = OBJECT_ENTRIES[obj_id]
|
obj_cls = OBJECT_ENTRIES[obj_id]
|
||||||
@ -35,11 +35,11 @@ class Scene:
|
|||||||
) from e
|
) from e
|
||||||
else:
|
else:
|
||||||
raise Exception(f"{obj_id} is not a valid object type.")
|
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:
|
if obj_instance != None:
|
||||||
for cmd in cmd_queue:
|
for cmd in cmd_queue:
|
||||||
op_id, op_args = cmd.id, cmd.args
|
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:
|
if op_id in OPERATION_ENTRIES:
|
||||||
op_func = OPERATION_ENTRIES[op_id]
|
op_func = OPERATION_ENTRIES[op_id]
|
||||||
if not callable(op_func):
|
if not callable(op_func):
|
||||||
@ -47,14 +47,14 @@ class Scene:
|
|||||||
op_func(obj_instance, op_args)
|
op_func(obj_instance, op_args)
|
||||||
else:
|
else:
|
||||||
raise Exception(f"{op_id} is not a valid operation.")
|
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:
|
try:
|
||||||
sdf_block = obj_instance.sdf_block_glsl()
|
sdf_block = obj_instance.sdf_block_glsl()
|
||||||
self.canvas_objs.append((obj_instance, sdf_block))
|
self.canvas_objs.append((obj_instance, sdf_block))
|
||||||
logger.info(f"parsed sdf {sdf_block}")
|
# logger.info(f"parsed sdf {sdf_block}")
|
||||||
except:
|
except:
|
||||||
logger.info(f"parsed camera")
|
# logger.info(f"parsed camera")
|
||||||
if type(obj_instance) == Camera:
|
if type(obj_instance) == Camera:
|
||||||
self.camera = obj_instance
|
self.camera = obj_instance
|
||||||
|
|
||||||
@ -70,6 +70,7 @@ class Scene:
|
|||||||
for canvas_item in self.canvas_objs:
|
for canvas_item in self.canvas_objs:
|
||||||
obj, sdf_expr = canvas_item
|
obj, sdf_expr = canvas_item
|
||||||
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 ""
|
||||||
|
logger.info(round_corner)
|
||||||
sdf_block += f"float sd{index} = {sdf_expr}{round_corner};"
|
sdf_block += f"float sd{index} = {sdf_expr}{round_corner};"
|
||||||
sdf_block += f"if(sd{index} < qry.value)"
|
sdf_block += f"if(sd{index} < qry.value)"
|
||||||
sdf_block += "{" + f"qry.value = sd{index}; qry.obj_id = {index}; " + "}\n"
|
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);
|
vec2 q = vec2(length(p.xz)-t.x,p.y);
|
||||||
return length(q)-t.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 )
|
float smin( float a, float b, float k )
|
||||||
{
|
{
|
||||||
k *= 1.0;
|
k *= 2.0;
|
||||||
float r = exp2(-a/k) + exp2(-b/k);
|
float x = (b-a)/k;
|
||||||
return -k*log2(r);
|
float g = 0.5*(x+sqrt(x*x+1.0));
|
||||||
|
return b - k * g;
|
||||||
}
|
}
|
||||||
|
|
||||||
sdQuery sd(vec3 p) {
|
sdQuery sd(vec3 p) {
|
||||||
sdQuery qry;
|
sdQuery qry;
|
||||||
qry.value = INF;
|
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))):
|
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:
|
if len(args) == 1 and args[0] in COLORS:
|
||||||
return np.array(COLORS[args[0]])
|
return np.array(COLORS[args[0]])
|
||||||
return default
|
return default
|
||||||
Reference in New Issue
Block a user