fractex 0.1.0__py3-none-any.whl → 0.1.1__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)
@@ -131,8 +130,25 @@ def main():
131
130
  render_w = max(64, int(width * render_scale))
132
131
  render_h = max(64, int(height * render_scale))
133
132
 
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]
133
+ base_origin_x = -render_w / (2.0 * base_zoom)
134
+ base_origin_y = -render_h / (2.0 * base_zoom)
135
+ detail_origin_x = -render_w / (2.0 * detail_zoom)
136
+ detail_origin_y = -render_h / (2.0 * detail_zoom)
137
+
138
+ base = base_texture.generate_tile(
139
+ base_origin_x + x0,
140
+ base_origin_y + y0,
141
+ render_w,
142
+ render_h,
143
+ zoom=base_zoom,
144
+ )[..., :3]
145
+ detail = detail_texture.generate_tile(
146
+ detail_origin_x + x1,
147
+ detail_origin_y + y1,
148
+ render_w,
149
+ render_h,
150
+ zoom=detail_zoom,
151
+ )[..., :3]
136
152
 
137
153
  depth = 0.35 + 0.15 * np.sin(t * 0.2)
138
154
  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
 
@@ -140,7 +143,7 @@ def run_interactive(
140
143
 
141
144
  render_w = max(config.min_render, int(width * render_scale))
142
145
  render_h = max(config.min_render, int(height * render_scale))
143
- t = frame / 10.0
146
+ t = (frame / 10.0) * config.speed
144
147
  frame_img = render_frame(t, render_w, render_h)
145
148
  frame_img = resize_nearest(frame_img, width, height)
146
149
  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.1
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=oilaT3MB6bbSt-ah3zraZtDe1Drt-GFHGH8xtm-oqBs,5295
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=b18a3UGkxfLcKn9ITCczAeB-ofHeCoRxQi3ToxMtxnU,5901
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.1.dist-info/licenses/LICENSE,sha256=CRrETm3c-JFoqpolJMrRIfFXOxOy5uhnvdSVKFP6sVE,1069
32
+ fractex-0.1.1.dist-info/METADATA,sha256=V2UWQEXzcqsxjAsY9BXFl5bArmrkWPYJQjMHEkzKb5M,3603
33
+ fractex-0.1.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
34
+ fractex-0.1.1.dist-info/entry_points.txt,sha256=xgzT1MTUmB69bstzCyxybxJDI7D8nYqsJpBN2UMazL4,45
35
+ fractex-0.1.1.dist-info/top_level.txt,sha256=LFl1_h1YNgANgBDo6d-tPTJzlrO3ny_l5OTItasV9rw,8
36
+ fractex-0.1.1.dist-info/RECORD,,