pygf 0.1.0__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 (58) hide show
  1. pygf-0.1.0/LICENSE +21 -0
  2. pygf-0.1.0/PKG-INFO +136 -0
  3. pygf-0.1.0/README.md +103 -0
  4. pygf-0.1.0/pygf/__init__.py +173 -0
  5. pygf-0.1.0/pygf/alias.py +84 -0
  6. pygf-0.1.0/pygf/bool2.py +337 -0
  7. pygf-0.1.0/pygf/bool3.py +1248 -0
  8. pygf-0.1.0/pygf/bool4.py +3671 -0
  9. pygf-0.1.0/pygf/double2.py +337 -0
  10. pygf-0.1.0/pygf/double3.py +1248 -0
  11. pygf-0.1.0/pygf/double4.py +3671 -0
  12. pygf-0.1.0/pygf/float2.py +337 -0
  13. pygf-0.1.0/pygf/float3.py +1248 -0
  14. pygf-0.1.0/pygf/float4.py +3671 -0
  15. pygf-0.1.0/pygf/funcs.py +523 -0
  16. pygf-0.1.0/pygf/genMat.py +259 -0
  17. pygf-0.1.0/pygf/genMat2.py +15 -0
  18. pygf-0.1.0/pygf/genMat3.py +15 -0
  19. pygf-0.1.0/pygf/genMat4.py +15 -0
  20. pygf-0.1.0/pygf/genQuat.py +225 -0
  21. pygf-0.1.0/pygf/genType.py +456 -0
  22. pygf-0.1.0/pygf/genVec.py +210 -0
  23. pygf-0.1.0/pygf/genVec2.py +12 -0
  24. pygf-0.1.0/pygf/genVec3.py +12 -0
  25. pygf-0.1.0/pygf/genVec4.py +12 -0
  26. pygf-0.1.0/pygf/half.py +92 -0
  27. pygf-0.1.0/pygf/half2.py +339 -0
  28. pygf-0.1.0/pygf/half3.py +1247 -0
  29. pygf-0.1.0/pygf/half4.py +3669 -0
  30. pygf-0.1.0/pygf/helper.py +210 -0
  31. pygf-0.1.0/pygf/int2.py +337 -0
  32. pygf-0.1.0/pygf/int3.py +1248 -0
  33. pygf-0.1.0/pygf/int4.py +3671 -0
  34. pygf-0.1.0/pygf/matrix2b.py +13 -0
  35. pygf-0.1.0/pygf/matrix2d.py +13 -0
  36. pygf-0.1.0/pygf/matrix2f.py +13 -0
  37. pygf-0.1.0/pygf/matrix3b.py +13 -0
  38. pygf-0.1.0/pygf/matrix3d.py +13 -0
  39. pygf-0.1.0/pygf/matrix3f.py +13 -0
  40. pygf-0.1.0/pygf/matrix4b.py +13 -0
  41. pygf-0.1.0/pygf/matrix4d.py +13 -0
  42. pygf-0.1.0/pygf/matrix4f.py +13 -0
  43. pygf-0.1.0/pygf/py.typed +0 -0
  44. pygf-0.1.0/pygf/quatb.py +17 -0
  45. pygf-0.1.0/pygf/quatd.py +17 -0
  46. pygf-0.1.0/pygf/quatf.py +17 -0
  47. pygf-0.1.0/pygf/quath.py +56 -0
  48. pygf-0.1.0/pygf/uint2.py +337 -0
  49. pygf-0.1.0/pygf/uint3.py +1248 -0
  50. pygf-0.1.0/pygf/uint4.py +3671 -0
  51. pygf-0.1.0/pygf.egg-info/PKG-INFO +136 -0
  52. pygf-0.1.0/pygf.egg-info/SOURCES.txt +56 -0
  53. pygf-0.1.0/pygf.egg-info/dependency_links.txt +1 -0
  54. pygf-0.1.0/pygf.egg-info/requires.txt +9 -0
  55. pygf-0.1.0/pygf.egg-info/top_level.txt +1 -0
  56. pygf-0.1.0/pyproject.toml +70 -0
  57. pygf-0.1.0/setup.cfg +4 -0
  58. pygf-0.1.0/tests/test_pygf.py +479 -0
pygf-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 王炳辉
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.
pygf-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,136 @@
1
+ Metadata-Version: 2.4
2
+ Name: pygf
3
+ Version: 0.1.0
4
+ Summary: Graphics math types for Python: vectors, matrices and quaternions on ctypes
5
+ Author-email: 王炳辉 <binghui.wang@foxmail.com>
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/Time-Coder/pygf
8
+ Project-URL: Source, https://github.com/Time-Coder/pygf
9
+ Keywords: graphics,math,linear-algebra,vector,matrix,quaternion,ctypes,gltf,usd
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: Implementation :: CPython
19
+ Classifier: Topic :: Multimedia :: Graphics
20
+ Classifier: Topic :: Scientific/Engineering :: Mathematics
21
+ Classifier: Typing :: Typed
22
+ Requires-Python: >=3.10
23
+ Description-Content-Type: text/markdown
24
+ License-File: LICENSE
25
+ Requires-Dist: numpy
26
+ Provides-Extra: dev
27
+ Requires-Dist: ruff; extra == "dev"
28
+ Requires-Dist: ty; extra == "dev"
29
+ Provides-Extra: publish
30
+ Requires-Dist: build; extra == "publish"
31
+ Requires-Dist: twine; extra == "publish"
32
+ Dynamic: license-file
33
+
34
+ # pygf
35
+
36
+ Graphics math types for Python: vectors, matrices and quaternions, built on
37
+ `ctypes` with no compiled extension. A shared foundation for scene-description,
38
+ shading-language and rendering projects that all need the same numeric types and
39
+ none of them should have to depend on each other for them.
40
+
41
+ ```python
42
+ from pygf import double3, matrix4d, quatd, funcs
43
+
44
+ v = double3(1.0, 0.0, 0.0)
45
+
46
+ m = matrix4d() * 2.0 # element-wise, `*` not matrix multiply
47
+ m = matrix4d() * matrix4d() # matrix multiply
48
+ n = funcs.normalize(double3(3.0, 4.0, 0.0))
49
+ w = funcs.dot(v, n)
50
+
51
+ r = quatd(0.0, 1.0, 0.0, 0.0) * v # rotate by a half turn about X
52
+ ```
53
+
54
+ Note that `*` is matrix multiply for `matrix * matrix`, matching what this layer
55
+ has always done, and that there is no `@` operator.
56
+
57
+ ## What is here
58
+
59
+ | Group | Types |
60
+ |---|---|
61
+ | Vectors | `float2/3/4`, `double2/3/4`, `int2/3/4`, `uint2/3/4`, `half2/3/4`, `bool2/3/4` |
62
+ | Matrices | `matrix2/3/4` in `f`, `d`, `b` |
63
+ | Quaternions | `quatf`, `quatd`, `quath`, `quatb` |
64
+ | USD aliases | `point3f`, `normal3f`, `vector3f`, `color3f`, `texCoord2f`, `frame4d`, ... |
65
+ | Functions | the GLSL-shaped set: `abs`, `mix`, `clamp`, `cross`, `dot`, `normalize`, `determinant`, `inverse`, ... |
66
+
67
+ ## Design notes
68
+
69
+ **Element types, not operators.** A `genVec` counts its slots with `_slot_count`,
70
+ which is `rows` for a matrix and the element count for a vector or quaternion.
71
+ `len()` is ctypes' *flat* element count on a matrix -- 16 for a 4x4 -- while
72
+ `m[i]` yields the i-th row, so driving the element-wise loops with `len()`
73
+ overruns. The element-wise helpers in `funcs.py` also *recurse*, because a matrix
74
+ slot is a row and handing that row to `builtins.abs` still fails once the count is
75
+ right.
76
+
77
+ **Matrices are square only.** `genMat.mat_type` refuses a non-square shape rather
78
+ than silently truncating it to `shape[0] x shape[0]`.
79
+
80
+ **`half` is a real IEEE-754 binary16.** Stored as `c_uint16` bit patterns in
81
+ private fields, converted on access through `struct`'s native `e` format. The
82
+ component names are properties, so `ctypes.Structure.__setattr__` still reaches
83
+ them. Overflow saturates to infinity rather than raising, which is what a GPU
84
+ buffer would hold.
85
+
86
+ **Swizzles are runtime-dynamic.** `genVec.__getattr__` builds every combination
87
+ of `xyzw` / `rgba` / `stpq` on demand, so the class carries no swizzle
88
+ declarations at runtime. A generated `if TYPE_CHECKING:` block declares all of
89
+ them for type checkers and IDEs; see `tools/sync_swizzle_blocks.py`.
90
+
91
+ **numpy interop.** Importing `pygf` replaces `numpy.array` so that it reads a
92
+ container as its components: `np.array(matrix3d())` gives a `(3, 3)` array
93
+ rather than ctypes' flat storage. Arguments it does not recognise are passed
94
+ straight through.
95
+
96
+ ## Layout
97
+
98
+ ```
99
+ pygf/ the package
100
+ tests/ test_pygf.py -- stdlib plus pygf, nothing else
101
+ tools/ sync_swizzle_blocks.py -- the only writer of the swizzle blocks
102
+ static_check.py
103
+ publish.py
104
+ ```
105
+
106
+ ## Development
107
+
108
+ ```
109
+ python -m pip install -e ".[dev]"
110
+ python static_check.py
111
+ python tests/test_pygf.py
112
+ ```
113
+
114
+ `static_check.py` runs `compileall`, `ruff check --fix`, and `ty check`. Every
115
+ check in the test file corresponds to a defect that type checking or review
116
+ surfaced; the module docstring in the test lists them.
117
+
118
+ After changing `genVec`'s swizzle generation, regenerate the declaration blocks:
119
+
120
+ ```
121
+ python tools/sync_swizzle_blocks.py
122
+ ```
123
+
124
+ It is idempotent, and it is the only thing that writes those blocks.
125
+
126
+ ## Publishing
127
+
128
+ ```
129
+ python -m pip install -e ".[publish]"
130
+ python publish.py build
131
+ python publish.py
132
+ ```
133
+
134
+ ## License
135
+
136
+ MIT
pygf-0.1.0/README.md ADDED
@@ -0,0 +1,103 @@
1
+ # pygf
2
+
3
+ Graphics math types for Python: vectors, matrices and quaternions, built on
4
+ `ctypes` with no compiled extension. A shared foundation for scene-description,
5
+ shading-language and rendering projects that all need the same numeric types and
6
+ none of them should have to depend on each other for them.
7
+
8
+ ```python
9
+ from pygf import double3, matrix4d, quatd, funcs
10
+
11
+ v = double3(1.0, 0.0, 0.0)
12
+
13
+ m = matrix4d() * 2.0 # element-wise, `*` not matrix multiply
14
+ m = matrix4d() * matrix4d() # matrix multiply
15
+ n = funcs.normalize(double3(3.0, 4.0, 0.0))
16
+ w = funcs.dot(v, n)
17
+
18
+ r = quatd(0.0, 1.0, 0.0, 0.0) * v # rotate by a half turn about X
19
+ ```
20
+
21
+ Note that `*` is matrix multiply for `matrix * matrix`, matching what this layer
22
+ has always done, and that there is no `@` operator.
23
+
24
+ ## What is here
25
+
26
+ | Group | Types |
27
+ |---|---|
28
+ | Vectors | `float2/3/4`, `double2/3/4`, `int2/3/4`, `uint2/3/4`, `half2/3/4`, `bool2/3/4` |
29
+ | Matrices | `matrix2/3/4` in `f`, `d`, `b` |
30
+ | Quaternions | `quatf`, `quatd`, `quath`, `quatb` |
31
+ | USD aliases | `point3f`, `normal3f`, `vector3f`, `color3f`, `texCoord2f`, `frame4d`, ... |
32
+ | Functions | the GLSL-shaped set: `abs`, `mix`, `clamp`, `cross`, `dot`, `normalize`, `determinant`, `inverse`, ... |
33
+
34
+ ## Design notes
35
+
36
+ **Element types, not operators.** A `genVec` counts its slots with `_slot_count`,
37
+ which is `rows` for a matrix and the element count for a vector or quaternion.
38
+ `len()` is ctypes' *flat* element count on a matrix -- 16 for a 4x4 -- while
39
+ `m[i]` yields the i-th row, so driving the element-wise loops with `len()`
40
+ overruns. The element-wise helpers in `funcs.py` also *recurse*, because a matrix
41
+ slot is a row and handing that row to `builtins.abs` still fails once the count is
42
+ right.
43
+
44
+ **Matrices are square only.** `genMat.mat_type` refuses a non-square shape rather
45
+ than silently truncating it to `shape[0] x shape[0]`.
46
+
47
+ **`half` is a real IEEE-754 binary16.** Stored as `c_uint16` bit patterns in
48
+ private fields, converted on access through `struct`'s native `e` format. The
49
+ component names are properties, so `ctypes.Structure.__setattr__` still reaches
50
+ them. Overflow saturates to infinity rather than raising, which is what a GPU
51
+ buffer would hold.
52
+
53
+ **Swizzles are runtime-dynamic.** `genVec.__getattr__` builds every combination
54
+ of `xyzw` / `rgba` / `stpq` on demand, so the class carries no swizzle
55
+ declarations at runtime. A generated `if TYPE_CHECKING:` block declares all of
56
+ them for type checkers and IDEs; see `tools/sync_swizzle_blocks.py`.
57
+
58
+ **numpy interop.** Importing `pygf` replaces `numpy.array` so that it reads a
59
+ container as its components: `np.array(matrix3d())` gives a `(3, 3)` array
60
+ rather than ctypes' flat storage. Arguments it does not recognise are passed
61
+ straight through.
62
+
63
+ ## Layout
64
+
65
+ ```
66
+ pygf/ the package
67
+ tests/ test_pygf.py -- stdlib plus pygf, nothing else
68
+ tools/ sync_swizzle_blocks.py -- the only writer of the swizzle blocks
69
+ static_check.py
70
+ publish.py
71
+ ```
72
+
73
+ ## Development
74
+
75
+ ```
76
+ python -m pip install -e ".[dev]"
77
+ python static_check.py
78
+ python tests/test_pygf.py
79
+ ```
80
+
81
+ `static_check.py` runs `compileall`, `ruff check --fix`, and `ty check`. Every
82
+ check in the test file corresponds to a defect that type checking or review
83
+ surfaced; the module docstring in the test lists them.
84
+
85
+ After changing `genVec`'s swizzle generation, regenerate the declaration blocks:
86
+
87
+ ```
88
+ python tools/sync_swizzle_blocks.py
89
+ ```
90
+
91
+ It is idempotent, and it is the only thing that writes those blocks.
92
+
93
+ ## Publishing
94
+
95
+ ```
96
+ python -m pip install -e ".[publish]"
97
+ python publish.py build
98
+ python publish.py
99
+ ```
100
+
101
+ ## License
102
+
103
+ MIT
@@ -0,0 +1,173 @@
1
+ from .alias import (
2
+ color3d,
3
+ color3f,
4
+ color3h,
5
+ color4d,
6
+ color4f,
7
+ color4h,
8
+ frame4d,
9
+ normal3d,
10
+ normal3f,
11
+ normal3h,
12
+ point3d,
13
+ point3f,
14
+ point3h,
15
+ texCoord2d,
16
+ texCoord2f,
17
+ texCoord2h,
18
+ texCoord3d,
19
+ texCoord3f,
20
+ texCoord3h,
21
+ vector3d,
22
+ vector3f,
23
+ vector3h,
24
+ )
25
+ from .bool2 import bool2
26
+ from .bool3 import bool3
27
+ from .bool4 import bool4
28
+ from .double2 import double2
29
+ from .double3 import double3
30
+ from .double4 import double4
31
+ from .float2 import float2
32
+ from .float3 import float3
33
+ from .float4 import float4
34
+ from .funcs import (
35
+ abs,
36
+ acos,
37
+ acosh,
38
+ all,
39
+ any,
40
+ asin,
41
+ asinh,
42
+ atan,
43
+ atanh,
44
+ ceil,
45
+ clamp,
46
+ conjugate,
47
+ cos,
48
+ cosh,
49
+ cross,
50
+ determinant,
51
+ distance,
52
+ dot,
53
+ equal,
54
+ exp,
55
+ exp2,
56
+ exp10,
57
+ faceforward,
58
+ floor,
59
+ fract,
60
+ greaterThan,
61
+ greaterThanEqual,
62
+ inverse,
63
+ inversesqrt,
64
+ length,
65
+ lessThan,
66
+ lessThanEqual,
67
+ log,
68
+ log2,
69
+ log10,
70
+ matrixCompMult,
71
+ max,
72
+ min,
73
+ mix,
74
+ mod,
75
+ normalize,
76
+ not_,
77
+ notEqual,
78
+ outerProduct,
79
+ pow,
80
+ reflect,
81
+ refract,
82
+ round,
83
+ roundEven,
84
+ sign,
85
+ sin,
86
+ sinh,
87
+ sizeof,
88
+ smoothstep,
89
+ sqrt,
90
+ step,
91
+ tan,
92
+ tanh,
93
+ trace,
94
+ transpose,
95
+ trunc,
96
+ )
97
+ from .genMat import MatType, genMat
98
+ from .genMat2 import Mat2Type, genMat2
99
+ from .genMat3 import Mat3Type, genMat3
100
+ from .genMat4 import Mat4Type, genMat4
101
+ from .genQuat import QuatType, genQuat
102
+ from .genType import MathForm, genType
103
+ from .genVec import VecType, genVec
104
+ from .genVec2 import Vec2Type, genVec2
105
+ from .genVec3 import Vec3Type, genVec3
106
+ from .genVec4 import Vec4Type, genVec4
107
+ from .half2 import half2
108
+ from .half3 import half3
109
+ from .half4 import half4
110
+ from .helper import Number, patch_nparray
111
+ from .int2 import int2
112
+ from .int3 import int3
113
+ from .int4 import int4
114
+ from .matrix2b import matrix2b
115
+ from .matrix2d import matrix2d
116
+ from .matrix2f import matrix2f
117
+ from .matrix3b import matrix3b
118
+ from .matrix3d import matrix3d
119
+ from .matrix3f import matrix3f
120
+ from .matrix4b import matrix4b
121
+ from .matrix4d import matrix4d
122
+ from .matrix4f import matrix4f
123
+ from .quatb import quatb
124
+ from .quatd import quatd
125
+ from .quatf import quatf
126
+ from .quath import quath
127
+ from .uint2 import uint2
128
+ from .uint3 import uint3
129
+ from .uint4 import uint4
130
+
131
+ __all__ = [
132
+ "MathForm",
133
+ "genType", "Number",
134
+ "genVec", "VecType",
135
+ "genVec2", "Vec2Type",
136
+ "genVec3", "Vec3Type",
137
+ "genVec4", "Vec4Type",
138
+ "genMat", "MatType",
139
+ "genMat2", "Mat2Type",
140
+ "genMat3", "Mat3Type",
141
+ "genMat4", "Mat4Type",
142
+ "genQuat", "QuatType",
143
+ "bool2", "bool3", "bool4",
144
+ "int2", "int3", "int4",
145
+ "uint2", "uint3", "uint4",
146
+ "half2", "half3", "half4",
147
+ "float2", "float3", "float4",
148
+ "double2", "double3", "double4",
149
+ "matrix2b", "matrix3b", "matrix4b",
150
+ "matrix2f", "matrix3f", "matrix4f",
151
+ "matrix2d", "matrix3d", "matrix4d",
152
+ "quatb", "quatf", "quatd", "quath",
153
+ "color3h", "color3f", "color3d",
154
+ "color4h", "color4f", "color4d",
155
+ "texCoord2h", "texCoord2f", "texCoord2d",
156
+ "texCoord3h", "texCoord3f", "texCoord3d",
157
+ "normal3h", "normal3f", "normal3d",
158
+ "point3h", "point3f", "point3d",
159
+ "vector3h", "vector3f", "vector3d",
160
+ "frame4d",
161
+
162
+ "abs", "sign", "floor", "ceil", "trunc", "round", "roundEven", "fract", "mod",
163
+ "min", "max", "clamp", "mix", "step", "smoothstep", "sqrt", "inversesqrt",
164
+ "pow", "exp", "exp2", "exp10", "log", "log2", "log10",
165
+ "sin", "cos", "tan", "asin", "acos", "atan",
166
+ "sinh", "cosh", "tanh", "asinh", "acosh", "atanh",
167
+ "length", "normalize", "distance", "dot", "cross", "faceforward", "reflect", "refract",
168
+ "transpose", "determinant", "inverse", "trace", "conjugate",
169
+ "matrixCompMult", "outerProduct", "lessThan", "lessThanEqual",
170
+ "greaterThan", "greaterThanEqual", "equal", "notEqual", "any", "all", "not_", "sizeof"
171
+ ]
172
+
173
+ patch_nparray()
@@ -0,0 +1,84 @@
1
+ from .double2 import double2
2
+ from .double3 import double3
3
+ from .double4 import double4
4
+ from .float2 import float2
5
+ from .float3 import float3
6
+ from .float4 import float4
7
+ from .half2 import half2
8
+ from .half3 import half3
9
+ from .half4 import half4
10
+ from .matrix4d import matrix4d
11
+
12
+
13
+ class color3d(double3):
14
+ pass
15
+
16
+ class color3f(float3):
17
+ pass
18
+
19
+ class color3h(half3):
20
+ pass
21
+
22
+
23
+ class color4d(double4):
24
+ pass
25
+
26
+ class color4f(float4):
27
+ pass
28
+
29
+ class color4h(half4):
30
+ pass
31
+
32
+
33
+ class normal3d(double3):
34
+ pass
35
+
36
+ class normal3f(float3):
37
+ pass
38
+
39
+ class normal3h(half3):
40
+ pass
41
+
42
+
43
+ class point3d(double3):
44
+ pass
45
+
46
+ class point3f(float3):
47
+ pass
48
+
49
+ class point3h(half3):
50
+ pass
51
+
52
+
53
+ class vector3d(double3):
54
+ pass
55
+
56
+ class vector3f(float3):
57
+ pass
58
+
59
+ class vector3h(half3):
60
+ pass
61
+
62
+
63
+ class frame4d(matrix4d):
64
+ pass
65
+
66
+
67
+ class texCoord2d(double2):
68
+ pass
69
+
70
+ class texCoord2f(float2):
71
+ pass
72
+
73
+ class texCoord2h(half2):
74
+ pass
75
+
76
+
77
+ class texCoord3d(double3):
78
+ pass
79
+
80
+ class texCoord3f(float3):
81
+ pass
82
+
83
+ class texCoord3h(half3):
84
+ pass