丰富了基本图形
This commit is contained in:
@ -8,8 +8,11 @@ cmd_marchtoy = on_command("march")
|
|||||||
@cmd_marchtoy.handle()
|
@cmd_marchtoy.handle()
|
||||||
async def _(args: Message = CommandArg()):
|
async def _(args: Message = CommandArg()):
|
||||||
if cmd := args.extract_plain_text():
|
if cmd := args.extract_plain_text():
|
||||||
img = await render.render(cmd, (256, 256))
|
try:
|
||||||
buffer = io.BytesIO()
|
img = await render.render(cmd, (256, 256))
|
||||||
img.save(buffer, format="PNG")
|
buffer = io.BytesIO()
|
||||||
buffer.seek(0)
|
img.save(buffer, format="PNG")
|
||||||
await cmd_marchtoy.send(await UniMessage().image(raw=buffer).export())
|
buffer.seek(0)
|
||||||
|
await cmd_marchtoy.send(await UniMessage().image(raw=buffer).export())
|
||||||
|
except Exception as e:
|
||||||
|
await cmd_marchtoy.send(await Message(message=f"发生了错误: {e}"))
|
||||||
@ -113,6 +113,55 @@ class Sphere(Object):
|
|||||||
return f"sdSphere({self.transform.p_expr()}, {self.radius})"
|
return f"sdSphere({self.transform.p_expr()}, {self.radius})"
|
||||||
|
|
||||||
|
|
||||||
|
@make_obj("cylinder", "cyl")
|
||||||
|
class Cylinder(Object):
|
||||||
|
def __init__(self, _radius: float = 1.0, _height: float = 1.0) -> None:
|
||||||
|
super().__init__()
|
||||||
|
self.radius = _radius
|
||||||
|
self.height = _height
|
||||||
|
|
||||||
|
def parse_args(self, args: list[str]):
|
||||||
|
param = ArgParser.as_vec2(args)
|
||||||
|
self.radius = param[0]
|
||||||
|
self.height = param[1]
|
||||||
|
|
||||||
|
def sdf_block(self) -> str:
|
||||||
|
return f"sdCappedCylinder({self.transform.p_expr()}, {self.radius}, {self.height})"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@make_obj("torus")
|
||||||
|
class Torus(Object):
|
||||||
|
def __init__(self, _r1: float = 0.5, _r2: float = 1.0) -> None:
|
||||||
|
super().__init__()
|
||||||
|
self.r1 = _r1
|
||||||
|
self.r2 = _r2
|
||||||
|
|
||||||
|
def parse_args(self, args: list[str]):
|
||||||
|
param = ArgParser.as_vec2(args)
|
||||||
|
self.r1 = param[0]
|
||||||
|
self.r2 = param[1]
|
||||||
|
|
||||||
|
def sdf_block(self) -> str:
|
||||||
|
return f"sdTorus({self.transform.p_expr()}, vec2({self.r1}, {self.r2}))"
|
||||||
|
|
||||||
|
@make_obj("capsule", "pill")
|
||||||
|
class Capsule(Object):
|
||||||
|
def __init__(self, _h: float = 1.0, _r: float = 0.25) -> None:
|
||||||
|
super().__init__()
|
||||||
|
self._h = _h
|
||||||
|
self._r = _r
|
||||||
|
|
||||||
|
def parse_args(self, args: list[str]):
|
||||||
|
param = ArgParser.as_vec2(args)
|
||||||
|
self._h = param[0]
|
||||||
|
self._r = param[1]
|
||||||
|
|
||||||
|
def sdf_block(self) -> str:
|
||||||
|
return f"sdVerticalCapsule({self.transform.p_expr()}, {self._h}, {self._r})"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@make_obj("camera", "cam")
|
@make_obj("camera", "cam")
|
||||||
class Camera(Object):
|
class Camera(Object):
|
||||||
def __init__(self, _focus: float = 1.0) -> None:
|
def __init__(self, _focus: float = 1.0) -> None:
|
||||||
|
|||||||
@ -25,6 +25,23 @@ float sdSphere(vec3 p, float r) {
|
|||||||
return length(p) - r;
|
return length(p) - r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float sdCappedCylinder( vec3 p, float r, float h )
|
||||||
|
{
|
||||||
|
vec2 d = abs(vec2(length(p.xz),p.y)) - vec2(r,h);
|
||||||
|
return min(max(d.x,d.y),0.0) + length(max(d,0.0));
|
||||||
|
}
|
||||||
|
|
||||||
|
float sdVerticalCapsule( vec3 p, float h, float r )
|
||||||
|
{
|
||||||
|
p.y -= clamp( p.y, 0.0, h );
|
||||||
|
return length( p ) - r;
|
||||||
|
}
|
||||||
|
float sdTorus( vec3 p, vec2 t )
|
||||||
|
{
|
||||||
|
vec2 q = vec2(length(p.xz)-t.x,p.y);
|
||||||
|
return length(q)-t.y;
|
||||||
|
}
|
||||||
|
|
||||||
sdQuery sd(vec3 p) {
|
sdQuery sd(vec3 p) {
|
||||||
sdQuery qry;
|
sdQuery qry;
|
||||||
qry.value = 100000000.0;
|
qry.value = 100000000.0;
|
||||||
|
|||||||
@ -36,6 +36,22 @@ class ArgParser:
|
|||||||
raise Exception(f"cannot parse {args}")
|
raise Exception(f"cannot parse {args}")
|
||||||
return default
|
return default
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def as_vec2(
|
||||||
|
args: list[str], default: np.ndarray = np.array((0.0, 0.0))
|
||||||
|
) -> np.ndarray:
|
||||||
|
try:
|
||||||
|
if len(args) == 1:
|
||||||
|
x = float(args[0])
|
||||||
|
return np.array((x, x))
|
||||||
|
elif len(args) == 2:
|
||||||
|
x = float(args[0])
|
||||||
|
y = float(args[1])
|
||||||
|
return np.array((x, y))
|
||||||
|
except:
|
||||||
|
raise Exception(f"cannot parse {args}")
|
||||||
|
return default
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def as_vec3(
|
def as_vec3(
|
||||||
args: list[str], default: np.ndarray = np.array((0.0, 0.0, 0.0))
|
args: list[str], default: np.ndarray = np.array((0.0, 0.0, 0.0))
|
||||||
|
|||||||
Reference in New Issue
Block a user