ncca-ngl 0.5.0__py3-none-any.whl → 0.5.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.
ncca/ngl/__init__.py CHANGED
@@ -40,7 +40,7 @@ from .simple_vao import SimpleVAO
40
40
  from .text import Text
41
41
  from .texture import Texture
42
42
  from .transform import Transform, TransformRotationOrder
43
- from .util import PerspMode, calc_normal, clamp, frustum, lerp, look_at, ortho, perspective
43
+ from .util import PerspMode, calc_normal, clamp, frustum, lerp, look_at, ortho, perspective, renderman_look_at
44
44
  from .vao_factory import VAOFactory, VAOType
45
45
  from .vec2 import Vec2
46
46
  from .vec2_array import Vec2Array
@@ -110,4 +110,5 @@ all = [
110
110
  FirstPersonCamera,
111
111
  PySideEventHandlingMixin,
112
112
  PerspMode,
113
+ renderman_look_at,
113
114
  ]
ncca/ngl/util.py CHANGED
@@ -161,3 +161,55 @@ def hash_combine(seed, h):
161
161
  seed = (seed + 0x9E3779B9 + ((seed << 6) & 0xFFFFFFFFFFFFFFFF) + (seed >> 2)) & 0xFFFFFFFFFFFFFFFF
162
162
  seed ^= h
163
163
  return seed
164
+
165
+
166
+ def renderman_look_at(eye, look, up):
167
+ """
168
+ Calculate 4x4 matrix for RenderMan camera lookAt
169
+ Accounts for RenderMan's right-handed Y-down, Z-forward coordinate system
170
+
171
+ Args:
172
+ eye: Vec3 - camera position
173
+ look: Vec3 - point to look at
174
+ up: Vec3 - up vector (typically (0, 1, 0) in world space)
175
+
176
+ Returns:
177
+ Mat4 - 4x4 transformation matrix
178
+ """
179
+ # Calculate view direction (from eye to look point)
180
+ n = look - eye
181
+ n.normalize()
182
+
183
+ # Calculate right vector
184
+ v = n.cross(up)
185
+ v.normalize()
186
+
187
+ # Recalculate orthogonal up vector
188
+ u = v.cross(n)
189
+ u.normalize()
190
+
191
+ # Build the matrix for RenderMan's coordinate system
192
+ # RenderMan uses Y-down, Z-forward
193
+ result = Mat4.identity()
194
+
195
+ # Right vector (X-axis)
196
+ result.m[0][0] = v.x
197
+ result.m[1][0] = v.y
198
+ result.m[2][0] = v.z
199
+
200
+ # Up vector (Y-axis) - negated for Y-down convention
201
+ result.m[0][1] = -u.x
202
+ result.m[1][1] = -u.y
203
+ result.m[2][1] = -u.z
204
+
205
+ # Forward vector (Z-axis) - camera looks down +Z
206
+ result.m[0][2] = n.x
207
+ result.m[1][2] = n.y
208
+ result.m[2][2] = n.z
209
+
210
+ # Translation (camera position)
211
+ result.m[3][0] = -eye.dot(v)
212
+ result.m[3][1] = eye.dot(u) # Negated Y component
213
+ result.m[3][2] = -eye.dot(n)
214
+
215
+ return result
ncca/ngl/vector_base.py CHANGED
@@ -8,14 +8,20 @@ while allowing dimension-specific behavior through abstract methods.
8
8
  import ctypes
9
9
  import math
10
10
  from abc import ABC, abstractmethod
11
- from typing import Any, ClassVar, Self, Tuple
11
+ from typing import Any, ClassVar, Generic, Self, Tuple, TypeVar
12
12
 
13
13
  import numpy as np
14
14
 
15
15
  from .util import clamp, hash_combine
16
16
 
17
+ # Note this has been changed so I can use python 3.11
18
+ # as renderman want this. Once >3.11 is used we can get rid and just use
19
+ # class VectorBase[T](ABC):
17
20
 
18
- class VectorBase[T](ABC):
21
+ T = TypeVar("T", bound="VectorBase")
22
+
23
+
24
+ class VectorBase(ABC, Generic[T]):
19
25
  """
20
26
  Base class for all vector types providing common functionality.
21
27
 
@@ -2,6 +2,8 @@ from enum import IntEnum
2
2
 
3
3
  import numpy as np
4
4
 
5
+ import numpy as np
6
+
5
7
  from ncca.ngl import Mat2, Mat3, Mat4, Vec2, Vec3, Vec4
6
8
 
7
9
  FLOAT_SIZE = np.dtype(np.float32).itemsize
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: ncca-ngl
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: A Python version of the NGL graphics library.
5
5
  Author: Jon Macey
6
6
  Author-email: Jon Macey <jmacey@bournemouth.ac.uk>
@@ -16,7 +16,7 @@ ncca/ngl/PrimData/pack_arrays.py,sha256=CYUmnS8rfKY0wDyTl9uyVIRRxXzYkal8YlZpx4B3
16
16
  ncca/ngl/PrimData/teapot.npy,sha256=fiOfYtB5SkegO7uTSitpjl_HmnS_iIy0sXAGfxCXXjY,1350560
17
17
  ncca/ngl/PrimData/tetrahedron.npy,sha256=_KCSpflFXhYB4gGVxFmF5Cv6pQyPHuUlCj9xfL2oyEM,512
18
18
  ncca/ngl/PrimData/troll.npy,sha256=ohgGgxLCJrmsFdNrlfRY2Rg9eJgcmvArf6IAspO2BKA,3505280
19
- ncca/ngl/__init__.py,sha256=t0EdoLVwrOFEEzN7nMo3iArOG3D2o-ZbZt4caXUNR7g,2705
19
+ ncca/ngl/__init__.py,sha256=a34Mcz5y8PEw5PoIec4MBN25j-8gcBXtf1x4lCPYTag,2747
20
20
  ncca/ngl/abstract_vao.py,sha256=fi7-BIfw1jefcXe09Qj2gGmnqqA9kzJK-hAwfG14Hrc,2068
21
21
  ncca/ngl/base_mesh.py,sha256=ZhpOuUguqHH0HiQw-QGMa91iIMl4GkwS7k6fe_zw1Pc,6053
22
22
  ncca/ngl/base_mesh.pyi,sha256=kobLuNnCSZlRRobIgVopQaS7Bjg0tJ3m4M64WXt5I-M,173
@@ -53,7 +53,7 @@ ncca/ngl/simple_vao.py,sha256=jfU2O3yliaM6iWNvfcRbjQ6o2_IVSPrOR3GthDiul6Q,1419
53
53
  ncca/ngl/text.py,sha256=yWNfKHnuWn0bxbwhW1H-EkRZ7bEM9DAyjES16cxTnME,13608
54
54
  ncca/ngl/texture.py,sha256=GEAOAOV-nEEccc_t7YVByok9smxzqRrmXKyzzBwvFBo,2473
55
55
  ncca/ngl/transform.py,sha256=_PibgtFoU_exfvQUWucmts0WF5OreSTNbftvSa3zT8g,2938
56
- ncca/ngl/util.py,sha256=ljJyaMMMr1iFUnJa42Qr5md6Jq2Up7Rn7BitdwDBmRs,4616
56
+ ncca/ngl/util.py,sha256=7FGTNhRc_z6lEY1Gz1O_hIze79sN9NBSBlBDecMxfsg,5919
57
57
  ncca/ngl/vao_factory.py,sha256=v87VfrUMaoqcsE-CS9kM7h5Fyk_e0LGl_iA6xqaomPg,930
58
58
  ncca/ngl/vec2.py,sha256=anhrK8Ac-GZLdaAbHmrXBiLnZx-eQj9NsfOFK-X5Z-I,3292
59
59
  ncca/ngl/vec2_array.py,sha256=XwDrpscx82q_nlz9fP010r-89SUkxgMA6ZiWQkippeo,5425
@@ -61,7 +61,7 @@ ncca/ngl/vec3.py,sha256=xZ7e_Ce15rzJ9HtkOrn5z_4WhJzVHSG0H4aXqXFFXqg,3362
61
61
  ncca/ngl/vec3_array.py,sha256=rxoyjrblzQx1pbCjGIMrHAog89oudbe3XSsp8h4H5QA,5646
62
62
  ncca/ngl/vec4.py,sha256=Gq5_0A0MJ13AA1bmpg3qwo4LzI6hWsHexfhw-ZBL9bY,3862
63
63
  ncca/ngl/vec4_array.py,sha256=i4B9zLgo_O55-QGjyV3tuFEx_HHZIQKYRjgEdt-co20,5567
64
- ncca/ngl/vector_base.py,sha256=PezlSub-1j1SE1qV2VtkBpXWskdhZPsqP5XWvidLiOw,16784
64
+ ncca/ngl/vector_base.py,sha256=0Jd0g1JZhEEN6RiAMqC9BQ6zRlkQaHA4iPzwCSADWlI,17005
65
65
  ncca/ngl/webgpu/__init__.py,sha256=3V3tZ3esdVhvBfs4GyRuX_IaOkoJ7mep-LIUHyXCP1Y,511
66
66
  ncca/ngl/webgpu/__main__.py,sha256=dafKxgGcilErhpKheQut1gwko92MNtr3NJnq2jVVGNI,24925
67
67
  ncca/ngl/webgpu/__main__.py.backup,sha256=dafKxgGcilErhpKheQut1gwko92MNtr3NJnq2jVVGNI,24925
@@ -74,7 +74,7 @@ ncca/ngl/webgpu/pipeline_shaders.py,sha256=JW-VwM58Qx3BbOPT2y40FJAB4MNOcr6r7cdkL
74
74
  ncca/ngl/webgpu/point_list_pipeline.py,sha256=yZ1_v7QUJgHPP-2eIZ-o0eLI5Jh19741ux92Lr1qdlQ,12120
75
75
  ncca/ngl/webgpu/point_pipeline.py,sha256=u8DT_PjOONhBU2kCFYK00EGf-om-AFgQyA_d_egjzcY,12208
76
76
  ncca/ngl/webgpu/triangle_pipeline.py,sha256=Sx_HAznveXONNR93WWheNwcepi6aPxSb5yDLG7wHRq4,14691
77
- ncca/ngl/webgpu/webgpu_constants.py,sha256=s9ssAM6cN25Jy06Xxj2EwLxqexg7pEyB4Af_ezQ6f3g,715
77
+ ncca/ngl/webgpu/webgpu_constants.py,sha256=wysMdn5pHsYcO6ePX35M6yN_G1wmkUEasuYrXFvF7oU,735
78
78
  ncca/ngl/webgpu/webgpu_widget.py,sha256=B_H124q0YJ7WxeOE_C_LVtl--53XlV23R5B6CPNXQT8,11716
79
79
  ncca/ngl/webgpu/wip/REFACTORING_SUMMARY.md,sha256=0rwWSCBTHEX11I50d_g2cJL-ZZ-579okeBGedc0Fsq0,3440
80
80
  ncca/ngl/webgpu/wip/UNIFIED_SYSTEM.md,sha256=FrltaW0lU_ZVHxpuRqwazstAEblxNiLlAXCgkkuVaYo,8845
@@ -100,6 +100,6 @@ ncca/ngl/widgets/transformwidget.py,sha256=U5pDZN_uhtBDv0BX28J7_fa1AGg8vc8Q2uG70
100
100
  ncca/ngl/widgets/vec2widget.py,sha256=Usfr_vYN8FHl__CqveoJ1OpWijHo4MewS79ETZAh5DQ,4298
101
101
  ncca/ngl/widgets/vec3widget.py,sha256=DJRBFM_0jL_RNpiKjVP4loAcAv2fr4Ul1n0T4cwzXMw,4935
102
102
  ncca/ngl/widgets/vec4widget.py,sha256=mT7c5paDaRxn-vSv7lbffg7isyD8T-6sUxOUMqJXBZs,5631
103
- ncca_ngl-0.5.0.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
104
- ncca_ngl-0.5.0.dist-info/METADATA,sha256=3BcnfuoqCxm34o-seYDr7ToiZyiqTTYTjmxl8c4jc2k,1624
105
- ncca_ngl-0.5.0.dist-info/RECORD,,
103
+ ncca_ngl-0.5.1.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
104
+ ncca_ngl-0.5.1.dist-info/METADATA,sha256=8i8bQo0ixnMkdOpILrZJs4tZIejEfgHIAdKDDQX61wA,1624
105
+ ncca_ngl-0.5.1.dist-info/RECORD,,