sdforge 0.2.1__tar.gz → 0.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. sdforge-0.2.2/PKG-INFO +42 -0
  2. sdforge-0.2.2/README.md +17 -0
  3. sdforge-0.2.2/sdforge/__init__.py +17 -0
  4. sdforge-0.2.2/sdforge.egg-info/PKG-INFO +42 -0
  5. sdforge-0.2.2/sdforge.egg-info/SOURCES.txt +8 -0
  6. sdforge-0.2.2/sdforge.egg-info/requires.txt +1 -0
  7. sdforge-0.2.2/sdforge.egg-info/top_level.txt +1 -0
  8. sdforge-0.2.2/setup.py +24 -0
  9. sdforge-0.2.1/LICENSE +0 -21
  10. sdforge-0.2.1/MANIFEST.in +0 -1
  11. sdforge-0.2.1/PKG-INFO +0 -290
  12. sdforge-0.2.1/README.md +0 -248
  13. sdforge-0.2.1/examples/__init__.py +0 -0
  14. sdforge-0.2.1/examples/camera.py +0 -66
  15. sdforge-0.2.1/examples/constraints.py +0 -213
  16. sdforge-0.2.1/examples/debug.py +0 -72
  17. sdforge-0.2.1/examples/export.py +0 -32
  18. sdforge-0.2.1/examples/forge.py +0 -63
  19. sdforge-0.2.1/examples/group.py +0 -58
  20. sdforge-0.2.1/examples/light.py +0 -62
  21. sdforge-0.2.1/examples/material.py +0 -65
  22. sdforge-0.2.1/examples/noise.py +0 -57
  23. sdforge-0.2.1/examples/operations.py +0 -149
  24. sdforge-0.2.1/examples/params.py +0 -35
  25. sdforge-0.2.1/examples/primitives.py +0 -130
  26. sdforge-0.2.1/examples/render.py +0 -30
  27. sdforge-0.2.1/examples/saving.py +0 -166
  28. sdforge-0.2.1/examples/shaping.py +0 -102
  29. sdforge-0.2.1/examples/sketch.py +0 -99
  30. sdforge-0.2.1/examples/transforms.py +0 -141
  31. sdforge-0.2.1/sdforge/__init__.py +0 -14
  32. sdforge-0.2.1/sdforge/api/__init__.py +0 -0
  33. sdforge-0.2.1/sdforge/api/camera.py +0 -29
  34. sdforge-0.2.1/sdforge/api/constraints.py +0 -277
  35. sdforge-0.2.1/sdforge/api/core.py +0 -618
  36. sdforge-0.2.1/sdforge/api/cpu.py +0 -748
  37. sdforge-0.2.1/sdforge/api/debug.py +0 -28
  38. sdforge-0.2.1/sdforge/api/export.py +0 -119
  39. sdforge-0.2.1/sdforge/api/forge.py +0 -45
  40. sdforge-0.2.1/sdforge/api/gpu.py +0 -163
  41. sdforge-0.2.1/sdforge/api/group.py +0 -51
  42. sdforge-0.2.1/sdforge/api/light.py +0 -32
  43. sdforge-0.2.1/sdforge/api/loader.py +0 -69
  44. sdforge-0.2.1/sdforge/api/material.py +0 -62
  45. sdforge-0.2.1/sdforge/api/mesh.py +0 -403
  46. sdforge-0.2.1/sdforge/api/noise.py +0 -35
  47. sdforge-0.2.1/sdforge/api/operations.py +0 -167
  48. sdforge-0.2.1/sdforge/api/params.py +0 -76
  49. sdforge-0.2.1/sdforge/api/primitives.py +0 -544
  50. sdforge-0.2.1/sdforge/api/render.py +0 -441
  51. sdforge-0.2.1/sdforge/api/shaping.py +0 -95
  52. sdforge-0.2.1/sdforge/api/sketch.py +0 -121
  53. sdforge-0.2.1/sdforge/api/transforms.py +0 -209
  54. sdforge-0.2.1/sdforge/api/utils.py +0 -55
  55. sdforge-0.2.1/sdforge/glsl/camera.glsl +0 -25
  56. sdforge-0.2.1/sdforge/glsl/debug.glsl +0 -34
  57. sdforge-0.2.1/sdforge/glsl/light.glsl +0 -24
  58. sdforge-0.2.1/sdforge/glsl/noise.glsl +0 -58
  59. sdforge-0.2.1/sdforge/glsl/operations.glsl +0 -73
  60. sdforge-0.2.1/sdforge/glsl/primitives.glsl +0 -190
  61. sdforge-0.2.1/sdforge/glsl/raymarching.glsl +0 -39
  62. sdforge-0.2.1/sdforge/glsl/shaping.glsl +0 -23
  63. sdforge-0.2.1/sdforge/glsl/transforms.glsl +0 -101
  64. sdforge-0.2.1/sdforge.egg-info/PKG-INFO +0 -290
  65. sdforge-0.2.1/sdforge.egg-info/SOURCES.txt +0 -79
  66. sdforge-0.2.1/sdforge.egg-info/requires.txt +0 -19
  67. sdforge-0.2.1/sdforge.egg-info/top_level.txt +0 -3
  68. sdforge-0.2.1/setup.py +0 -46
  69. sdforge-0.2.1/tests/__init__.py +0 -0
  70. sdforge-0.2.1/tests/camera.py +0 -27
  71. sdforge-0.2.1/tests/conftest.py +0 -81
  72. sdforge-0.2.1/tests/constraints.py +0 -267
  73. sdforge-0.2.1/tests/debug.py +0 -110
  74. sdforge-0.2.1/tests/export.py +0 -47
  75. sdforge-0.2.1/tests/forge.py +0 -77
  76. sdforge-0.2.1/tests/group.py +0 -67
  77. sdforge-0.2.1/tests/light.py +0 -10
  78. sdforge-0.2.1/tests/material.py +0 -77
  79. sdforge-0.2.1/tests/noise.py +0 -64
  80. sdforge-0.2.1/tests/operations.py +0 -210
  81. sdforge-0.2.1/tests/params.py +0 -27
  82. sdforge-0.2.1/tests/primitives.py +0 -241
  83. sdforge-0.2.1/tests/render.py +0 -172
  84. sdforge-0.2.1/tests/saving.py +0 -187
  85. sdforge-0.2.1/tests/shaping.py +0 -85
  86. sdforge-0.2.1/tests/sketch.py +0 -112
  87. sdforge-0.2.1/tests/transforms.py +0 -378
  88. {sdforge-0.2.1 → sdforge-0.2.2}/sdforge.egg-info/dependency_links.txt +0 -0
  89. {sdforge-0.2.1 → sdforge-0.2.2}/setup.cfg +0 -0
sdforge-0.2.2/PKG-INFO ADDED
@@ -0,0 +1,42 @@
1
+ Metadata-Version: 2.4
2
+ Name: sdforge
3
+ Version: 0.2.2
4
+ Summary: Compatibility package for the renamed DistForge SDF modeling library.
5
+ Home-page: https://github.com/nassimberrada/distforge
6
+ Author: nassimberrada
7
+ Classifier: Development Status :: 7 - Inactive
8
+ Classifier: Intended Audience :: Developers
9
+ Classifier: Intended Audience :: Science/Research
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Topic :: Multimedia :: Graphics :: 3D Modeling
13
+ Classifier: Topic :: Scientific/Engineering :: Visualization
14
+ Requires-Python: >=3.6
15
+ Description-Content-Type: text/markdown
16
+ Requires-Dist: distforge>=1.0.0
17
+ Dynamic: author
18
+ Dynamic: classifier
19
+ Dynamic: description
20
+ Dynamic: description-content-type
21
+ Dynamic: home-page
22
+ Dynamic: requires-dist
23
+ Dynamic: requires-python
24
+ Dynamic: summary
25
+
26
+ # sdforge has moved
27
+
28
+ The `sdforge` package has been renamed to **DistForge**.
29
+
30
+ Install the new package:
31
+
32
+ ```bash
33
+ pip install -U distforge
34
+ ```
35
+
36
+ New code should import from `distforge`:
37
+
38
+ ```python
39
+ from distforge import sphere, box
40
+ ```
41
+
42
+ This release remains available as a compatibility bridge for existing users.
@@ -0,0 +1,17 @@
1
+ # sdforge has moved
2
+
3
+ The `sdforge` package has been renamed to **DistForge**.
4
+
5
+ Install the new package:
6
+
7
+ ```bash
8
+ pip install -U distforge
9
+ ```
10
+
11
+ New code should import from `distforge`:
12
+
13
+ ```python
14
+ from distforge import sphere, box
15
+ ```
16
+
17
+ This release remains available as a compatibility bridge for existing users.
@@ -0,0 +1,17 @@
1
+ """Compatibility layer for the former ``sdforge`` import path.
2
+
3
+ The project was renamed to DistForge in version 1.0.0. New code should use
4
+ ``distforge`` directly; this module keeps the old top-level and internal
5
+ import paths working while downstream projects migrate.
6
+ """
7
+
8
+ import importlib
9
+ import sys
10
+
11
+ from distforge import *
12
+
13
+
14
+ api = importlib.import_module("distforge.api")
15
+ sys.modules[f"{__name__}.api"] = api
16
+
17
+ del importlib, sys
@@ -0,0 +1,42 @@
1
+ Metadata-Version: 2.4
2
+ Name: sdforge
3
+ Version: 0.2.2
4
+ Summary: Compatibility package for the renamed DistForge SDF modeling library.
5
+ Home-page: https://github.com/nassimberrada/distforge
6
+ Author: nassimberrada
7
+ Classifier: Development Status :: 7 - Inactive
8
+ Classifier: Intended Audience :: Developers
9
+ Classifier: Intended Audience :: Science/Research
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Topic :: Multimedia :: Graphics :: 3D Modeling
13
+ Classifier: Topic :: Scientific/Engineering :: Visualization
14
+ Requires-Python: >=3.6
15
+ Description-Content-Type: text/markdown
16
+ Requires-Dist: distforge>=1.0.0
17
+ Dynamic: author
18
+ Dynamic: classifier
19
+ Dynamic: description
20
+ Dynamic: description-content-type
21
+ Dynamic: home-page
22
+ Dynamic: requires-dist
23
+ Dynamic: requires-python
24
+ Dynamic: summary
25
+
26
+ # sdforge has moved
27
+
28
+ The `sdforge` package has been renamed to **DistForge**.
29
+
30
+ Install the new package:
31
+
32
+ ```bash
33
+ pip install -U distforge
34
+ ```
35
+
36
+ New code should import from `distforge`:
37
+
38
+ ```python
39
+ from distforge import sphere, box
40
+ ```
41
+
42
+ This release remains available as a compatibility bridge for existing users.
@@ -0,0 +1,8 @@
1
+ README.md
2
+ setup.py
3
+ sdforge/__init__.py
4
+ sdforge.egg-info/PKG-INFO
5
+ sdforge.egg-info/SOURCES.txt
6
+ sdforge.egg-info/dependency_links.txt
7
+ sdforge.egg-info/requires.txt
8
+ sdforge.egg-info/top_level.txt
@@ -0,0 +1 @@
1
+ distforge>=1.0.0
@@ -0,0 +1 @@
1
+ sdforge
sdforge-0.2.2/setup.py ADDED
@@ -0,0 +1,24 @@
1
+ from setuptools import find_packages, setup
2
+
3
+
4
+ setup(
5
+ name="sdforge",
6
+ version="0.2.2",
7
+ author="nassimberrada",
8
+ description="Compatibility package for the renamed DistForge SDF modeling library.",
9
+ long_description=open("README.md").read(),
10
+ long_description_content_type="text/markdown",
11
+ url="https://github.com/nassimberrada/distforge",
12
+ packages=find_packages(),
13
+ install_requires=["distforge>=1.0.0"],
14
+ classifiers=[
15
+ "Development Status :: 7 - Inactive",
16
+ "Intended Audience :: Developers",
17
+ "Intended Audience :: Science/Research",
18
+ "License :: OSI Approved :: MIT License",
19
+ "Programming Language :: Python :: 3",
20
+ "Topic :: Multimedia :: Graphics :: 3D Modeling",
21
+ "Topic :: Scientific/Engineering :: Visualization",
22
+ ],
23
+ python_requires=">=3.6",
24
+ )
sdforge-0.2.1/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2025 nassimberrada
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
sdforge-0.2.1/MANIFEST.in DELETED
@@ -1 +0,0 @@
1
- recursive-include sdforge/glsl *.glsl
sdforge-0.2.1/PKG-INFO DELETED
@@ -1,290 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: sdforge
3
- Version: 0.2.1
4
- Summary: A Python library for SDF modeling with real-time GLSL rendering and mesh export.
5
- Home-page: https://github.com/nassimberrada/sdforge
6
- Author: nassimberrada
7
- Classifier: Development Status :: 4 - Beta
8
- Classifier: Intended Audience :: Developers
9
- Classifier: Intended Audience :: Science/Research
10
- Classifier: License :: OSI Approved :: MIT License
11
- Classifier: Programming Language :: Python :: 3
12
- Classifier: Topic :: Multimedia :: Graphics :: 3D Modeling
13
- Classifier: Topic :: Scientific/Engineering :: Visualization
14
- Requires-Python: >=3.6
15
- Description-Content-Type: text/markdown
16
- License-File: LICENSE
17
- Requires-Dist: numpy
18
- Requires-Dist: scikit-image>=0.17
19
- Requires-Dist: watchdog
20
- Requires-Dist: moderngl
21
- Requires-Dist: glfw
22
- Provides-Extra: ui
23
- Requires-Dist: imgui[glfw]>=2.0.0; extra == "ui"
24
- Provides-Extra: export
25
- Requires-Dist: pygltflib; extra == "export"
26
- Provides-Extra: saving
27
- Requires-Dist: trimesh; extra == "saving"
28
- Provides-Extra: full
29
- Requires-Dist: imgui[glfw]>=2.0.0; extra == "full"
30
- Requires-Dist: pygltflib; extra == "full"
31
- Requires-Dist: trimesh; extra == "full"
32
- Dynamic: author
33
- Dynamic: classifier
34
- Dynamic: description
35
- Dynamic: description-content-type
36
- Dynamic: home-page
37
- Dynamic: license-file
38
- Dynamic: provides-extra
39
- Dynamic: requires-dist
40
- Dynamic: requires-python
41
- Dynamic: summary
42
-
43
- <p align="center">
44
- <picture>
45
- <source srcset="./assets/logo_dark.png" media="(prefers-color-scheme: dark)">
46
- <source srcset="./assets/logo_light.png" media="(prefers-color-scheme: light)">
47
- <img src="./assets/logo_light.png" alt="SDForge Logo" height="200">
48
- </picture>
49
- </p>
50
-
51
- ## About
52
-
53
- SDF Forge is a Python library for creating 3D models using Signed Distance Functions (SDFs). It provides a real-time, interactive rendering experience in a native desktop window, powered by GLSL raymarching.
54
-
55
- ## Features
56
-
57
- - **Simple, Pythonic API:** Define complex shapes by combining primitives using standard operators (`|`, `-`, `&`) and chaining transformations.
58
- - **Real-time Rendering with Hot-Reloading:** Get instant visual feedback in a lightweight native window powered by `moderngl` and `glfw`. Changes to your script are reloaded automatically.
59
- - **Mesh Exporting:** Save your creations as `.stl`, `.obj`, or `.glb` files for 3D printing or use in other software.
60
- - **Interactive Parameters:** Define parameters that can be controlled by UI sliders in real-time (with a compatible UI renderer).
61
- - **Standalone GLSL Export:** Export your entire scene to a single, self-contained GLSL fragment shader for use in game engines or graphics applications.
62
- - **Custom GLSL Primitives:** Write custom SDF logic directly in GLSL using the `Forge` object for maximum flexibility and performance.
63
-
64
- ## Getting Started
65
-
66
- ### Hello Forge
67
-
68
- Define a simple shape and open a real-time preview window with just a few lines of code.
69
-
70
- ```python
71
- from sdforge import sphere, box
72
-
73
- # A sphere intersected with a box
74
- shape = sphere(1) & box(1.5)
75
-
76
- # Render a preview in a native window.
77
- # An interactive orbit camera is used by default.
78
- shape.render()
79
- ```
80
-
81
- ### Live Preview & Hot-Reloading
82
- For an interactive workflow, wrap your scene definition in a `main()` function. When you save any changes to the file, the preview window will automatically update.
83
-
84
- ```python
85
- from sdforge import box, sphere
86
-
87
- def main():
88
- """
89
- While this script is running, try changing the values below and
90
- saving the file. The render window will update automatically.
91
- """
92
- box_size = 1.5
93
- sphere_radius = 1.2
94
-
95
- scene = box(box_size, radius=0.1) | sphere(sphere_radius)
96
- return scene
97
-
98
- if __name__ == "__main__":
99
- # The render() function automatically enables hot-reloading by default
100
- # and looks for a `main` function in this file to call upon reload.
101
- scene = main()
102
- scene.render()
103
- ```
104
-
105
- ### Saving to a Mesh File
106
- You can save any static model to an `.stl`, `.obj`, or `.glb` file. The `.save()` method uses the Marching Cubes algorithm to generate a mesh from the SDF.
107
-
108
- ```python
109
- from sdforge import sphere, box
110
-
111
- # A box with a sphere carved out of it
112
- shape = box(1.5) - sphere(1.2)
113
-
114
- # Save the model. Higher samples = more detail.
115
- shape.save('model.obj', samples=2**22)
116
- ```
117
-
118
- ## Core Concepts
119
-
120
- ### Primitives & Operations
121
- Create complex objects by starting with primitives and combining them with Python's bitwise operators: `|` for union, `&` for intersection, and `-` for difference.
122
-
123
- ```python
124
- from sdforge import sphere, box
125
-
126
- # A box with a sphere carved out of it.
127
- b = box(size=1.5)
128
- s = sphere(r=1.0)
129
- scene = b - s
130
-
131
- scene.render()
132
- ```
133
-
134
- ### Transformations & Shaping
135
- Chain methods to transform, shape, and repeat objects.
136
-
137
- ```python
138
- import numpy as np
139
- from sdforge import box, Y
140
-
141
- # A tall box
142
- b = box(size=(0.5, 2.5, 0.5))
143
-
144
- # Twist it around the Y-axis
145
- # The 'k' parameter controls the amount of twist.
146
- scene = b.twist(k=3.0).rotate(Y, np.pi / 4)
147
-
148
- scene.render()
149
- ```
150
-
151
- ### Materials
152
- You can assign a unique color to any object or group of objects using the `.color()` method.
153
-
154
- ```python
155
- from sdforge import sphere, box
156
-
157
- # A blue sphere is subtracted from a red box.
158
- red_box = box(1.5, radius=0.1).color(1.0, 0.2, 0.2)
159
- blue_sphere = sphere(1.2).color(0.3, 0.5, 1.0)
160
-
161
- scene = red_box - blue_sphere
162
-
163
- scene.render()
164
- ```
165
-
166
- ### Camera & Lighting
167
- You can override the default interactive camera and lighting to set a static viewpoint or create specific lighting conditions by passing `Camera` and `Light` objects to the renderer.
168
-
169
- ```python
170
- from sdforge import box, sphere, Camera, Light
171
-
172
- def main():
173
- scene = box(1.5, radius=0.1) | sphere(1.2)
174
-
175
- # A camera positioned at (4, 3, 4), looking at the origin.
176
- cam = Camera(position=(4, 3, 4), target=(0, 0, 0), zoom=1.5)
177
-
178
- # A light source with soft shadows
179
- light = Light(position=(4, 5, 3), shadow_softness=16.0)
180
-
181
- return scene, cam, light
182
-
183
- if __name__ == '__main__':
184
- scene, cam, light = main()
185
- scene.render(camera=cam, light=light)
186
- ```
187
-
188
- ## Advanced Usage
189
-
190
- ### Interactive Parameters
191
- Use `Param` objects to define interactive, real-time parameters for your model. A compatible UI-enabled renderer would show these as sliders. The default renderer will use their default values.
192
-
193
- ```python
194
- from sdforge import box, Param
195
-
196
- # Create Param objects to control different aspects of the scene.
197
- # Param(name, default_value, min_value, max_value)
198
- p_size = Param("Box Size", 0.8, 0.2, 2.0)
199
- p_radius = Param("Corner Radius", 0.1, 0.0, 0.5)
200
-
201
- # Use the Param objects just like regular numbers.
202
- scene = box(size=p_size, radius=p_radius)
203
-
204
- scene.render()
205
- ```
206
-
207
- ### Custom GLSL with `Forge`
208
- For complex or highly-performant shapes, you can write GLSL code directly. This object integrates perfectly with the rest of the API.
209
-
210
- ```python
211
- from sdforge import sphere, Forge
212
-
213
- # A standard library primitive
214
- s = sphere(1.2)
215
-
216
- # A custom shape defined with GLSL
217
- # 'p' is the vec3 point in space
218
- custom_box = Forge("""
219
- vec3 q = abs(p) - vec3(0.8);
220
- return length(max(q, 0.0)) + min(max(q.x, max(q.y, q.z)), 0.0);
221
- """)
222
-
223
- # The Forge object can be combined like any other shape
224
- scene = s - custom_box
225
-
226
- scene.render()
227
- ```
228
-
229
- ### Standalone GLSL Export
230
- Generate a complete, self-contained GLSL fragment shader for your scene. This file can be used directly in applications like Godot, TouchDesigner, or Three.js.
231
-
232
- ```python
233
- from sdforge import box, sphere
234
-
235
- scene = box(1.5, radius=0.1) - sphere(1.2)
236
-
237
- # This single call generates the entire shader file.
238
- scene.export_shader("exported_shader.glsl")
239
- ```
240
-
241
- ## Installation
242
-
243
- ### 1. System Dependencies
244
-
245
- The live viewer relies on `glfw`, which may require you to install its system-level libraries first. This is a common first step before installing the Python package.
246
-
247
- **On Debian/Ubuntu:**
248
- ```bash
249
- sudo apt-get install libglfw3-dev
250
- ```
251
-
252
- **On macOS (with Homebrew):**
253
- ```bash
254
- brew install glfw
255
- ```
256
- **On Windows:**
257
- `glfw` is generally bundled with the Python wheels, so no separate installation is typically needed.
258
-
259
- ### 2. Python Package
260
-
261
- The library and its core dependencies can be installed using pip.
262
-
263
- **Standard Installation:**
264
- This will install the core library, including `numpy`, `moderngl`, and `glfw`, enabling all fundamental features like modeling, live preview with hot-reloading, and exporting to `.stl` and `.obj` formats.
265
-
266
- ```bash
267
- pip install sdforge
268
- ```
269
-
270
- **Optional Features:**
271
- For additional functionality, you can install "extras":
272
-
273
- * **`.glb` Export:** To enable saving models to the GLB format, a modern and efficient format for web and game engines.
274
- ```bash
275
- pip install "sdforge[export]"
276
- ```
277
-
278
- * **Interactive UI:** To enable UI widgets like sliders for `Param` objects.
279
- ```bash
280
- pip install "sdforge[ui]"
281
- ```
282
-
283
- * **Full Installation:** To install all optional features at once.
284
- ```bash
285
- pip install "sdforge[full]"
286
- ```
287
-
288
- ## Acknowledgements
289
-
290
- This project is inspired by the simplicity and elegant API of Michael Fogleman's [fogleman/sdf](https://github.com/fogleman/sdf) library. SDF Forge aims to build on that foundation by adding a real-time, interactive GLSL-powered renderer.