fractex 0.1.0__py3-none-any.whl → 0.1.2__py3-none-any.whl

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.
fractex/cli.py CHANGED
@@ -36,6 +36,7 @@ def main() -> None:
36
36
  parser.add_argument("--fps", type=float, default=None)
37
37
  parser.add_argument("--width", type=int, default=None)
38
38
  parser.add_argument("--height", type=int, default=None)
39
+ parser.add_argument("--speed", type=float, default=None)
39
40
  parser.add_argument("--preset", type=str, default=None)
40
41
  parser.add_argument("args", nargs=argparse.REMAINDER, help="Extra args passed to example")
41
42
  args = parser.parse_args()
@@ -62,7 +63,7 @@ def main() -> None:
62
63
  if interactive:
63
64
  forwarded.append("--interactive")
64
65
 
65
- for name in ("scale", "fps", "width", "height", "preset"):
66
+ for name in ("scale", "fps", "width", "height", "preset", "speed"):
66
67
  value = getattr(args, name)
67
68
  if value is not None:
68
69
  forwarded.extend([f"--{name}", str(value)])
@@ -58,7 +58,6 @@ class CustomPatternGenerator:
58
58
  if __name__ == "__main__":
59
59
  parser = argparse.ArgumentParser(description="Custom pattern example")
60
60
  add_interactive_args(parser)
61
- parser.add_argument("--speed", type=float, default=1.0)
62
61
  args = parser.parse_args()
63
62
 
64
63
  generator = CustomPatternGenerator()
@@ -75,8 +74,7 @@ if __name__ == "__main__":
75
74
  config = InteractiveConfig.from_args(args, title="Custom Pattern (interactive)")
76
75
 
77
76
  def render_frame(t, w, h):
78
- speed = max(0.1, args.speed)
79
- tt = t * speed * 3.0
77
+ tt = t * 3.0
80
78
  zoom = np.exp(tt * 0.03)
81
79
  zoom = min(zoom, 200.0)
82
80
  depth = (tt * 1.5) % (params.scale * 6.0)
@@ -173,6 +173,8 @@ if __name__ == "__main__":
173
173
 
174
174
  def render_frame(t, w, h):
175
175
  zoom = 1.0 + 0.5 * (1 + np.sin(t * 0.2))
176
- return texture.generate_tile(0, 0, w, h, zoom=zoom)[..., :3]
176
+ x0 = -w / (2.0 * zoom)
177
+ y0 = -h / (2.0 * zoom)
178
+ return texture.generate_tile(x0, y0, w, h, zoom=zoom)[..., :3]
177
179
 
178
180
  run_interactive(render_frame, config)
@@ -10,7 +10,7 @@ if str(ROOT) not in sys.path:
10
10
  sys.path.insert(0, str(ROOT))
11
11
 
12
12
  from fractex import FractalParams, FractalGenerator, InfiniteTexture
13
- from fractex.interactive import add_preset_arg, resolve_preset
13
+ from fractex.interactive import add_interactive_args, add_preset_arg, resolve_preset
14
14
 
15
15
 
16
16
  def main():
@@ -25,8 +25,7 @@ def main():
25
25
  parser = argparse.ArgumentParser(description="Fractex splash animation")
26
26
  parser.add_argument("preset", nargs="?", help="Preset name")
27
27
  add_preset_arg(parser, ["marble", "clouds", "wood", "lava", "water"], dest="preset_flag")
28
- parser.add_argument("--scale", type=float, default=1.0, help="Render scale multiplier")
29
- parser.add_argument("--fps", type=float, default=30.0, help="Target FPS")
28
+ add_interactive_args(parser)
30
29
  args = parser.parse_args()
31
30
 
32
31
  params = FractalParams(seed=7, base_scale=0.01, detail_level=2.0)
@@ -59,7 +58,11 @@ def main():
59
58
  dpi = fig.get_dpi()
60
59
  fig.set_size_inches(screen_width / dpi, screen_height / dpi)
61
60
  ax.axis("off")
62
- ax.set_title(f"Fractex Splash ({selected or 'auto'})")
61
+ ax.set_title("fractex")
62
+ try:
63
+ fig.canvas.manager.set_window_title("fractex")
64
+ except Exception:
65
+ pass
63
66
 
64
67
  texture = textures[presets[0]]
65
68
  width = max(64, int(screen_width * max(0.1, args.scale)))
@@ -131,8 +134,25 @@ def main():
131
134
  render_w = max(64, int(width * render_scale))
132
135
  render_h = max(64, int(height * render_scale))
133
136
 
134
- base = base_texture.generate_tile(x0, y0, render_w, render_h, zoom=base_zoom)[..., :3]
135
- detail = detail_texture.generate_tile(x1, y1, render_w, render_h, zoom=detail_zoom)[..., :3]
137
+ base_origin_x = -render_w / (2.0 * base_zoom)
138
+ base_origin_y = -render_h / (2.0 * base_zoom)
139
+ detail_origin_x = -render_w / (2.0 * detail_zoom)
140
+ detail_origin_y = -render_h / (2.0 * detail_zoom)
141
+
142
+ base = base_texture.generate_tile(
143
+ base_origin_x + x0,
144
+ base_origin_y + y0,
145
+ render_w,
146
+ render_h,
147
+ zoom=base_zoom,
148
+ )[..., :3]
149
+ detail = detail_texture.generate_tile(
150
+ detail_origin_x + x1,
151
+ detail_origin_y + y1,
152
+ render_w,
153
+ render_h,
154
+ zoom=detail_zoom,
155
+ )[..., :3]
136
156
 
137
157
  depth = 0.35 + 0.15 * np.sin(t * 0.2)
138
158
  rgb_frame = np.clip(base * (1.0 - depth) + detail * depth, 0, 1)
fractex/interactive.py CHANGED
@@ -16,6 +16,7 @@ def add_interactive_args(parser) -> None:
16
16
  parser.add_argument("--fps", type=float, default=30.0, help="Target FPS")
17
17
  parser.add_argument("--width", type=int, default=None, help="Override width")
18
18
  parser.add_argument("--height", type=int, default=None, help="Override height")
19
+ parser.add_argument("--speed", type=float, default=1.0, help="Animation speed multiplier")
19
20
 
20
21
 
21
22
  def add_preset_arg(parser, presets, default: Optional[str] = None, dest: str = "preset") -> None:
@@ -79,6 +80,7 @@ class InteractiveConfig:
79
80
  scale: float = 1.0
80
81
  width: Optional[int] = None
81
82
  height: Optional[int] = None
83
+ speed: float = 1.0
82
84
  min_scale: float = 0.4
83
85
  max_scale: float = 1.0
84
86
  min_render: int = 64
@@ -91,6 +93,7 @@ class InteractiveConfig:
91
93
  scale=max(0.1, getattr(args, "scale", 1.0)),
92
94
  width=getattr(args, "width", None),
93
95
  height=getattr(args, "height", None),
96
+ speed=max(0.1, getattr(args, "speed", 1.0)),
94
97
  )
95
98
 
96
99
 
@@ -101,6 +104,7 @@ def run_interactive(
101
104
  try:
102
105
  import matplotlib.pyplot as plt
103
106
  from matplotlib.animation import FuncAnimation
107
+ import matplotlib as mpl
104
108
  except Exception:
105
109
  print("matplotlib is not available; cannot display interactive output.")
106
110
  return
@@ -111,12 +115,21 @@ def run_interactive(
111
115
  width = max(config.min_render, width)
112
116
  height = max(config.min_render, height)
113
117
 
118
+ mpl.rcParams["toolbar"] = "None"
114
119
  fig, ax = plt.subplots()
115
120
  dpi = fig.get_dpi()
116
121
  fig.set_size_inches(width / dpi, height / dpi)
117
122
  ax.axis("off")
118
- ax.set_title(config.title)
123
+ ax.set_title("fractex")
119
124
  fig.subplots_adjust(left=0, right=1, top=1, bottom=0)
125
+ try:
126
+ fig.canvas.manager.toolbar.setVisible(False)
127
+ except Exception:
128
+ pass
129
+ try:
130
+ fig.canvas.manager.set_window_title("fractex")
131
+ except Exception:
132
+ pass
120
133
 
121
134
  target_ms = 1000.0 / max(1.0, config.target_fps)
122
135
  render_scale = 1.0
@@ -140,7 +153,7 @@ def run_interactive(
140
153
 
141
154
  render_w = max(config.min_render, int(width * render_scale))
142
155
  render_h = max(config.min_render, int(height * render_scale))
143
- t = frame / 10.0
156
+ t = (frame / 10.0) * config.speed
144
157
  frame_img = render_frame(t, render_w, render_h)
145
158
  frame_img = resize_nearest(frame_img, width, height)
146
159
  im.set_array(_ensure_rgb(frame_img))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fractex
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: Fractal texture engine for procedural and infinite-detail textures.
5
5
  Author-email: Timur Isanov <tisanov@yahoo.com>
6
6
  License: MIT License
@@ -1,11 +1,11 @@
1
1
  fractex/3d.py,sha256=m7FmIgtouncb8LVpev3MjhOUNMaKEa6MmE3B8N2lj78,65079
2
2
  fractex/__init__.py,sha256=QheT5gsEbyQjvBo_HKy7rgWuhDepJ_UT1io7n_TcpG8,737
3
3
  fractex/advanced.py,sha256=UnyLEtH9rZGYSMhL6W4iZzKjTncx1-ToVGtaXbjujrA,5834
4
- fractex/cli.py,sha256=moqAbQBDAlR9Yn5pVcNhunreyqcVENZt8Ob7EtWGZEs,2398
4
+ fractex/cli.py,sha256=jQ9bI_rwtXwu_u_J_5HpwoiC8ZIOVH6JXvaXWYvOQV4,2468
5
5
  fractex/core.py,sha256=VppjXFtc-15wsKXJ8yXU-fdpIlzvWd-2xLnI1-qP0A0,21546
6
6
  fractex/dynamic_textures_3d.py,sha256=ZFkdfbGak1fS-LkPkw_-bXSuPjDaB0RUWdIlo595l-g,83944
7
7
  fractex/geometric_patterns_3d.py,sha256=kKGuAMYcNPJLvCUlRO7DzgJIAi5w-b7YkdwmznbKv94,103341
8
- fractex/interactive.py,sha256=Hx1VSyPR62Sq--arL5ESS3uMUNayY09A73-EDW9AIdM,5103
8
+ fractex/interactive.py,sha256=pVFrXZ3kUXo-3UuKYQHKLvM6oyYIgvmp6K1iY-4jSg4,5558
9
9
  fractex/simplex_noise.py,sha256=JuMl0tqo4Qq1XC8fmaxLSiH9GppYVvBhmBI5Zc2ZYpc,41571
10
10
  fractex/texture_blending.py,sha256=2bgmqqsw6v6M2qDp5cEhC-SjdbnvPGxmZLJf7Iaa7Ds,58506
11
11
  fractex/volume_scattering.py,sha256=T04rrW1N4VwimNskVww7K6XB1rEqo0foBXii6wAvhkk,54040
@@ -19,18 +19,18 @@ fractex/examples/architecture_pattern.py,sha256=zU2cILsjpx1JbDGbIkLR3sqrB4ZLmCkz
19
19
  fractex/examples/atmosphere.py,sha256=9eLAX3aRO6pMz-GrMaZ7QgocG8NBMznO8vuy6OzNkTA,1824
20
20
  fractex/examples/composite_material.py,sha256=6Ba7yCcx82MvaEKM2cVYEao6MOQW3pDZrSf1nvlaCow,2048
21
21
  fractex/examples/crystal_cave.py,sha256=pXmFTi3FCVSULoTEh11JC_w_0PzEVtbLSExnUw0DQRM,1908
22
- fractex/examples/custom_pattern.py,sha256=X8y-w6rzPm-19MSmpXnrHzNoERQYKWsIgbqyUVvUaag,4419
22
+ fractex/examples/custom_pattern.py,sha256=ZqX81-lxUI4e5aQwThNqQPKaJrJ5HldTJgn5fZoV-dc,4310
23
23
  fractex/examples/game_integration.py,sha256=k85yfez6N46oyR5gXpenbOoxDNMQgRLIDRayL_--6Tw,3194
24
- fractex/examples/game_texture.py,sha256=JNIq8gkCOgoi_s_Dxax3vVru8JxtxSJ9etGik4I610Y,6769
24
+ fractex/examples/game_texture.py,sha256=4hwtTOpspIQanQODD2g6opke0Zp5XwTriw8kqdtKLak,6841
25
25
  fractex/examples/integration.py,sha256=jJwa3ChUmxikGmqJk_tchDnV3rhuYKlNdEATxdbvf_8,3494
26
26
  fractex/examples/physic_integration.py,sha256=uh_ik_j-iiEOowPIvd37jwUDi5v9PZtCYUyHgyJBCC4,2551
27
- fractex/examples/splash.py,sha256=m3nedeXEJULD8WbhKypIOoGjBL4J1lnqJiWfwzkbww4,5581
27
+ fractex/examples/splash.py,sha256=n01HxC0Zhry9NqJf-NmczLKB_OG1WiFaUB-9y-bJa7c,5969
28
28
  fractex/examples/terrain.py,sha256=rsduhHchbyI6T-RDIzI-S6D07g2_rCSg6JtA4eXGve0,2611
29
29
  fractex/examples/underwater.py,sha256=1_SlTVhd-ONEYqyV_B4sCFhSqScmCHQ7f6eRVI7v5X8,3313
30
30
  fractex/examples/underwater_volkano.py,sha256=HobJi3ztK-R_VeHfI8oVRZupONbegWnOL40llj_LnaE,4161
31
- fractex-0.1.0.dist-info/licenses/LICENSE,sha256=CRrETm3c-JFoqpolJMrRIfFXOxOy5uhnvdSVKFP6sVE,1069
32
- fractex-0.1.0.dist-info/METADATA,sha256=J4jnWZF8qo1bJLOibuLl4NQD38_5JfT5t8606vkO5rY,3603
33
- fractex-0.1.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
34
- fractex-0.1.0.dist-info/entry_points.txt,sha256=xgzT1MTUmB69bstzCyxybxJDI7D8nYqsJpBN2UMazL4,45
35
- fractex-0.1.0.dist-info/top_level.txt,sha256=LFl1_h1YNgANgBDo6d-tPTJzlrO3ny_l5OTItasV9rw,8
36
- fractex-0.1.0.dist-info/RECORD,,
31
+ fractex-0.1.2.dist-info/licenses/LICENSE,sha256=CRrETm3c-JFoqpolJMrRIfFXOxOy5uhnvdSVKFP6sVE,1069
32
+ fractex-0.1.2.dist-info/METADATA,sha256=08gXQDGLPMgpHrs4h0U1qCYdRNrGgeqDLLurlImdHqw,3603
33
+ fractex-0.1.2.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
34
+ fractex-0.1.2.dist-info/entry_points.txt,sha256=xgzT1MTUmB69bstzCyxybxJDI7D8nYqsJpBN2UMazL4,45
35
+ fractex-0.1.2.dist-info/top_level.txt,sha256=LFl1_h1YNgANgBDo6d-tPTJzlrO3ny_l5OTItasV9rw,8
36
+ fractex-0.1.2.dist-info/RECORD,,