hyperstellar 0.1.24__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.
@@ -0,0 +1,27 @@
1
+ <<<<<<< HEAD
2
+ MIT License
3
+
4
+ Copyright (c) 2024 desktop-hnrtra0\user
5
+ =======
6
+ MIT License
7
+
8
+ Copyright (c) 2025 Void_unleashed
9
+ >>>>>>> 3fd83288e1496a5a3d4c3e29bdef651eba07de35
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ of this software and associated documentation files (the "Software"), to deal
13
+ in the Software without restriction, including without limitation the rights
14
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ copies of the Software, and to permit persons to whom the Software is
16
+ furnished to do so, subject to the following conditions:
17
+
18
+ The above copyright notice and this permission notice shall be included in all
19
+ copies or substantial portions of the Software.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
+ SOFTWARE.
@@ -0,0 +1,49 @@
1
+ Metadata-Version: 2.4
2
+ Name: hyperstellar
3
+ Version: 0.1.24
4
+ Summary: GPU-accelerated physics simulation engine
5
+ Author-email: Aiden Jabari <Jabariaiden15@email.com>
6
+ License: <<<<<<< HEAD
7
+ MIT License
8
+
9
+ Copyright (c) 2024 desktop-hnrtra0\user
10
+ =======
11
+ MIT License
12
+
13
+ Copyright (c) 2025 Void_unleashed
14
+ >>>>>>> 3fd83288e1496a5a3d4c3e29bdef651eba07de35
15
+
16
+ Permission is hereby granted, free of charge, to any person obtaining a copy
17
+ of this software and associated documentation files (the "Software"), to deal
18
+ in the Software without restriction, including without limitation the rights
19
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
20
+ copies of the Software, and to permit persons to whom the Software is
21
+ furnished to do so, subject to the following conditions:
22
+
23
+ The above copyright notice and this permission notice shall be included in all
24
+ copies or substantial portions of the Software.
25
+
26
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
29
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
30
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32
+ SOFTWARE.
33
+
34
+ Keywords: physics,simulation,gpu,opengl
35
+ Classifier: Development Status :: 3 - Alpha
36
+ Classifier: Intended Audience :: Science/Research
37
+ Classifier: License :: OSI Approved :: MIT License
38
+ Classifier: Operating System :: Microsoft :: Windows
39
+ Classifier: Programming Language :: Python :: 3.13
40
+ Classifier: Topic :: Scientific/Engineering :: Physics
41
+ Requires-Python: >=3.13
42
+ Description-Content-Type: text/markdown
43
+ License-File: LICENSE
44
+ Dynamic: license-file
45
+
46
+ # Hyperstellar
47
+ ### Write math Equations in python
48
+
49
+ Buckle up, coz this isn't just another preset physics engine. Hyperstellar gives you the mathematical language to define *any* dynamical system, then GPU-accelerates it to thousands of frames per second. From orbital mechanics to fluid dynamics, if you can write the equation, you can simulate it.
@@ -0,0 +1,4 @@
1
+ # Hyperstellar
2
+ ### Write math Equations in python
3
+
4
+ Buckle up, coz this isn't just another preset physics engine. Hyperstellar gives you the mathematical language to define *any* dynamical system, then GPU-accelerates it to thousands of frames per second. From orbital mechanics to fluid dynamics, if you can write the equation, you can simulate it.
@@ -0,0 +1,88 @@
1
+ # hyperstellar/src/hyperstellar/__init__.py
2
+ import os
3
+ import sys
4
+ import platform
5
+ from pathlib import Path
6
+
7
+ __version__ = "0.1.0"
8
+
9
+ # Platform detection
10
+ system = platform.system().lower()
11
+ arch = platform.machine().lower()
12
+
13
+ if system == "windows" and ("amd64" in arch or "x86_64" in arch):
14
+ platform_dir = "windows-x64"
15
+ extension = ".pyd"
16
+ lib_name = "stellar.pyd"
17
+ else:
18
+ raise ImportError(f"Unsupported platform: {system} {arch}")
19
+
20
+ # Get the native module path
21
+ module_dir = Path(__file__).parent / "_native" / platform_dir
22
+ module_path = module_dir / lib_name
23
+
24
+ if not module_path.exists():
25
+ raise ImportError(f"Native module not found: {module_path}")
26
+
27
+ # On Windows, add DLL directory to PATH
28
+ if system == "windows":
29
+ dll_dir = str(module_dir)
30
+
31
+ # DEBUG: Print what we're doing
32
+ print(f"[DEBUG] Adding DLL directory: {dll_dir}")
33
+
34
+ # CRITICAL FIX: Save the original PATH
35
+ original_path = os.environ.get('PATH', '')
36
+
37
+ # Method 1: Add to PATH at the BEGINNING (highest priority)
38
+ # This must be done BEFORE any attempt to import
39
+ path_sep = ';'
40
+ os.environ['PATH'] = dll_dir + path_sep + original_path
41
+ print(f"[DEBUG] Added to PATH: {dll_dir}")
42
+
43
+ # Method 2: Use AddDllDirectory for explicit loading
44
+ try:
45
+ import ctypes
46
+ # Clear any previous DLL directory cache
47
+ os.add_dll_directory(dll_dir)
48
+ print(f"[DEBUG] Used os.add_dll_directory")
49
+ except Exception as add_dll_error:
50
+ print(f"[DEBUG] os.add_dll_directory failed: {add_dll_error}")
51
+
52
+ # Try to import the module
53
+ try:
54
+ # First, clear stellar from sys.modules if it exists
55
+ sys.modules.pop('stellar', None)
56
+
57
+ # CRITICAL: Add the module directory to sys.path temporarily
58
+ sys.path.insert(0, str(module_dir))
59
+
60
+ # Import the module
61
+ import stellar as _stellar_module
62
+
63
+ # Remove from sys.path
64
+ sys.path.pop(0)
65
+
66
+ # Copy ALL public attributes to our module
67
+ for attr_name in dir(_stellar_module):
68
+ if not attr_name.startswith('__'):
69
+ globals()[attr_name] = getattr(_stellar_module, attr_name)
70
+
71
+ # Also copy __all__ if it exists
72
+ if hasattr(_stellar_module, '__all__'):
73
+ __all__ = _stellar_module.__all__
74
+
75
+ print(f"✓ hyperstellar loaded: {system} {arch}")
76
+
77
+ except ImportError as e:
78
+ # Provide detailed debug info
79
+ dll_files = list(module_dir.glob('*.dll'))
80
+ raise ImportError(
81
+ f"Failed to load native module: {e}\n"
82
+ f"Module path: {module_path}\n"
83
+ f"DLL directory: {module_dir}\n"
84
+ f"DLLs available: {[dll.name for dll in dll_files]}\n"
85
+ f"Current PATH: {os.environ.get('PATH', '')[:200]}..."
86
+ )
87
+ except Exception as e:
88
+ raise ImportError(f"Unexpected error loading module: {e}")
@@ -0,0 +1,267 @@
1
+ # Type stubs for hyperstellar package
2
+ import typing
3
+ from typing import Any, List, Dict, Optional, Union, Callable
4
+
5
+ class SkinType:
6
+ """Visual representation type for objects."""
7
+ CIRCLE: int
8
+ RECTANGLE: int
9
+ POLYGON: int
10
+
11
+ class ConstraintType:
12
+ """Type of physics constraint."""
13
+ DISTANCE: int
14
+ BOUNDARY: int
15
+
16
+ class ObjectState:
17
+ """Complete state of a physics object."""
18
+ x: float
19
+ y: float
20
+ vx: float
21
+ vy: float
22
+ mass: float
23
+ charge: float
24
+ rotation: float
25
+ angular_velocity: float
26
+ width: float
27
+ height: float
28
+ radius: float
29
+ polygon_sides: int
30
+ skin_type: SkinType
31
+ r: float
32
+ g: float
33
+ b: float
34
+ a: float
35
+
36
+ def __init__(self) -> None: ...
37
+ def __repr__(self) -> str: ...
38
+
39
+ class ObjectConfig:
40
+ """Configuration for creating objects in batch mode."""
41
+ x: float
42
+ y: float
43
+ vx: float
44
+ vy: float
45
+ mass: float
46
+ charge: float
47
+ rotation: float
48
+ angular_velocity: float
49
+ skin: SkinType
50
+ size: float
51
+ width: float
52
+ height: float
53
+ r: float
54
+ g: float
55
+ b: float
56
+ a: float
57
+ polygon_sides: int
58
+ equation: str
59
+
60
+ def __init__(self) -> None: ...
61
+ def __repr__(self) -> str: ...
62
+
63
+ class ConstraintConfig:
64
+ """Constraint configuration for batch mode."""
65
+ type: ConstraintType
66
+ target: int
67
+ param1: float
68
+ param2: float
69
+ param3: float
70
+ param4: float
71
+
72
+ def __init__(self) -> None: ...
73
+
74
+ class BatchConfig:
75
+ """Configuration for batch simulations."""
76
+ objects: List[ObjectConfig]
77
+ duration: float
78
+ dt: float
79
+ output_file: str
80
+
81
+ def __init__(self) -> None: ...
82
+
83
+ # NEW: Batch data structures
84
+ class BatchGetData:
85
+ """Batch get data structure for fetching multiple objects at once."""
86
+ x: float
87
+ y: float
88
+ vx: float
89
+ vy: float
90
+ mass: float
91
+ charge: float
92
+ rotation: float
93
+ angular_velocity: float
94
+ width: float
95
+ height: float
96
+ radius: float
97
+ polygon_sides: int
98
+ skin_type: int
99
+ r: float
100
+ g: float
101
+ b: float
102
+ a: float
103
+
104
+ def __init__(self) -> None: ...
105
+
106
+ class BatchUpdateData:
107
+ """Batch update data structure for updating multiple objects at once."""
108
+ index: int
109
+ x: float
110
+ y: float
111
+ vx: float
112
+ vy: float
113
+ mass: float
114
+ charge: float
115
+ rotation: float
116
+ angular_velocity: float
117
+ width: float
118
+ height: float
119
+ r: float
120
+ g: float
121
+ b: float
122
+ a: float
123
+
124
+ def __init__(self) -> None: ...
125
+
126
+ class DistanceConstraint:
127
+ """Maintain distance between two objects."""
128
+ target_object: int
129
+ rest_length: float
130
+ stiffness: float
131
+
132
+ def __init__(self, target_object: int = 0, rest_length: float = 5.0, stiffness: float = 100.0) -> None: ...
133
+ def __repr__(self) -> str: ...
134
+
135
+ class BoundaryConstraint:
136
+ """Keep object within a rectangular boundary."""
137
+ min_x: float
138
+ max_x: float
139
+ min_y: float
140
+ max_y: float
141
+
142
+ def __init__(self, min_x: float = -10.0, max_x: float = 10.0, min_y: float = -10.0, max_y: float = 10.0) -> None: ...
143
+ def __repr__(self) -> str: ...
144
+
145
+ class Simulation:
146
+ """Main physics simulation class."""
147
+
148
+ def __init__(self,
149
+ headless: bool = True,
150
+ width: int = 1280,
151
+ height: int = 720,
152
+ title: str = "Physics Simulation",
153
+ enable_grid: bool = True) -> None: ...
154
+
155
+ # Window management
156
+ def render(self) -> None: ...
157
+ def process_input(self) -> None: ...
158
+ def should_close(self) -> bool: ...
159
+
160
+ # NEW: Grid control
161
+ def set_grid_enabled(self, enabled: bool) -> None: ...
162
+ def get_grid_enabled(self) -> bool: ...
163
+
164
+ # Core simulation
165
+ def update(self, dt: float = 0.016) -> None: ...
166
+
167
+ # Object management
168
+ def add_object(
169
+ self,
170
+ x: float = 0.0,
171
+ y: float = 0.0,
172
+ vx: float = 0.0,
173
+ vy: float = 0.0,
174
+ mass: float = 1.0,
175
+ charge: float = 0.0,
176
+ rotation: float = 0.0,
177
+ angular_velocity: float = 0.0,
178
+ skin: SkinType = SkinType.CIRCLE,
179
+ size: float = 0.3,
180
+ width: float = 0.5,
181
+ height: float = 0.3,
182
+ r: float = 1.0,
183
+ g: float = 1.0,
184
+ b: float = 1.0,
185
+ a: float = 1.0,
186
+ polygon_sides: int = 6
187
+ ) -> int: ...
188
+
189
+ def update_object(
190
+ self,
191
+ index: int,
192
+ x: float, y: float,
193
+ vx: float, vy: float,
194
+ mass: float, charge: float,
195
+ rotation: float, angular_velocity: float,
196
+ width: float, height: float,
197
+ r: float, g: float, b: float, a: float
198
+ ) -> None: ...
199
+
200
+ # NEW: Batch operations
201
+ def batch_get(self, indices: List[int]) -> List[BatchGetData]: ...
202
+ def batch_update(self, updates: List[BatchUpdateData]) -> None: ...
203
+
204
+ def remove_object(self, index: int) -> None: ...
205
+ def object_count(self) -> int: ...
206
+ def get_object(self, index: int) -> ObjectState: ...
207
+
208
+ # Convenience methods
209
+ def set_rotation(self, index: int, rotation: float) -> None: ...
210
+ def set_angular_velocity(self, index: int, angular_velocity: float) -> None: ...
211
+ def set_dimensions(self, index: int, width: float, height: float) -> None: ...
212
+ def set_radius(self, index: int, radius: float) -> None: ...
213
+ def get_rotation(self, index: int) -> float: ...
214
+ def get_angular_velocity(self, index: int) -> float: ...
215
+
216
+ # Equations
217
+ def set_equation(self, object_index: int, equation_string: str) -> None: ...
218
+
219
+ # Constraints
220
+ def add_distance_constraint(self, object_index: int, constraint: DistanceConstraint) -> None: ...
221
+ def add_boundary_constraint(self, object_index: int, constraint: BoundaryConstraint) -> None: ...
222
+ def clear_constraints(self, object_index: int) -> None: ...
223
+ def clear_all_constraints(self) -> None: ...
224
+
225
+ # Batch processing
226
+ def run_batch(
227
+ self,
228
+ configs: List[BatchConfig],
229
+ callback: Optional[Callable[[int, List[ObjectState]], None]] = None
230
+ ) -> None: ...
231
+
232
+ # Parameters
233
+ def set_parameter(self, name: str, value: float) -> None: ...
234
+ def get_parameter(self, name: str) -> float: ...
235
+
236
+ # Simulation control
237
+ def set_paused(self, paused: bool) -> None: ...
238
+ def is_paused(self) -> bool: ...
239
+
240
+ def update_shader_loading(self) -> None: ...
241
+ def are_all_shaders_ready(self) -> bool: ...
242
+ def get_shader_load_progress(self) -> float: ...
243
+ def get_shader_load_status(self) -> str: ...
244
+
245
+ def reset(self) -> None: ...
246
+ def cleanup(self) -> None: ...
247
+
248
+ # File I/O
249
+ def save_to_file(
250
+ self,
251
+ filename: str,
252
+ title: str = "",
253
+ author: str = "",
254
+ description: str = ""
255
+ ) -> None: ...
256
+
257
+ def load_from_file(self, filename: str) -> None: ...
258
+
259
+ # Properties
260
+ @property
261
+ def is_headless(self) -> bool: ...
262
+
263
+ @property
264
+ def is_initialized(self) -> bool: ...
265
+
266
+ # Module-level exports
267
+ __version__: str