ncca-ngl 0.3.5__py3-none-any.whl → 0.5.0__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.
Files changed (56) hide show
  1. ncca/ngl/PrimData/pack_arrays.py +2 -3
  2. ncca/ngl/__init__.py +3 -4
  3. ncca/ngl/base_mesh.py +28 -20
  4. ncca/ngl/image.py +1 -3
  5. ncca/ngl/mat2.py +79 -53
  6. ncca/ngl/mat3.py +104 -185
  7. ncca/ngl/mat4.py +144 -309
  8. ncca/ngl/prim_data.py +42 -36
  9. ncca/ngl/primitives.py +2 -2
  10. ncca/ngl/pyside_event_handling_mixin.py +0 -108
  11. ncca/ngl/quaternion.py +69 -36
  12. ncca/ngl/shader.py +0 -116
  13. ncca/ngl/shader_program.py +94 -117
  14. ncca/ngl/texture.py +5 -2
  15. ncca/ngl/util.py +0 -2
  16. ncca/ngl/vec2.py +59 -302
  17. ncca/ngl/vec2_array.py +79 -28
  18. ncca/ngl/vec3.py +60 -350
  19. ncca/ngl/vec3_array.py +76 -23
  20. ncca/ngl/vec4.py +90 -200
  21. ncca/ngl/vec4_array.py +78 -27
  22. ncca/ngl/vector_base.py +542 -0
  23. ncca/ngl/webgpu/__init__.py +20 -0
  24. ncca/ngl/webgpu/__main__.py +640 -0
  25. ncca/ngl/webgpu/__main__.py.backup +640 -0
  26. ncca/ngl/webgpu/base_webgpu_pipeline.py +354 -0
  27. ncca/ngl/webgpu/custom_shader_pipeline.py +288 -0
  28. ncca/ngl/webgpu/instanced_geometry_pipeline.py +594 -0
  29. ncca/ngl/webgpu/line_pipeline.py +405 -0
  30. ncca/ngl/webgpu/pipeline_factory.py +190 -0
  31. ncca/ngl/webgpu/pipeline_shaders.py +497 -0
  32. ncca/ngl/webgpu/point_list_pipeline.py +349 -0
  33. ncca/ngl/webgpu/point_pipeline.py +336 -0
  34. ncca/ngl/webgpu/triangle_pipeline.py +419 -0
  35. ncca/ngl/webgpu/webgpu_constants.py +31 -0
  36. ncca/ngl/webgpu/webgpu_widget.py +322 -0
  37. ncca/ngl/webgpu/wip/REFACTORING_SUMMARY.md +82 -0
  38. ncca/ngl/webgpu/wip/UNIFIED_SYSTEM.md +314 -0
  39. ncca/ngl/webgpu/wip/buffer_manager.py +396 -0
  40. ncca/ngl/webgpu/wip/pipeline_config.py +463 -0
  41. ncca/ngl/webgpu/wip/shader_constants.py +328 -0
  42. ncca/ngl/webgpu/wip/shader_templates.py +563 -0
  43. ncca/ngl/webgpu/wip/unified_examples.py +390 -0
  44. ncca/ngl/webgpu/wip/unified_factory.py +449 -0
  45. ncca/ngl/webgpu/wip/unified_pipeline.py +469 -0
  46. ncca/ngl/widgets/__init__.py +18 -2
  47. ncca/ngl/widgets/__main__.py +2 -1
  48. ncca/ngl/widgets/lookatwidget.py +2 -1
  49. ncca/ngl/widgets/mat4widget.py +2 -2
  50. ncca/ngl/widgets/vec2widget.py +1 -1
  51. ncca/ngl/widgets/vec3widget.py +1 -0
  52. {ncca_ngl-0.3.5.dist-info → ncca_ngl-0.5.0.dist-info}/METADATA +3 -2
  53. ncca_ngl-0.5.0.dist-info/RECORD +105 -0
  54. ncca/ngl/widgets/transformation_widget.py +0 -299
  55. ncca_ngl-0.3.5.dist-info/RECORD +0 -82
  56. {ncca_ngl-0.3.5.dist-info → ncca_ngl-0.5.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,105 @@
1
+ ncca/ngl/.ruff_cache/.gitignore,sha256=njpg8ebsSuYCFcEdVLFxOSdF7CXp3e1DPVvZITY68xY,35
2
+ ncca/ngl/.ruff_cache/0.13.0/10564494386971134025,sha256=cw-J0gIy5ofUkDLcl9l1KuyGeSnM8hZtj8urcZcsVJI,1210
3
+ ncca/ngl/.ruff_cache/0.13.0/7783445477288392980,sha256=eeVnGNALeos37aECRfh4CHPcV_ubWjMAfxMhg3IId5c,82
4
+ ncca/ngl/.ruff_cache/CACHEDIR.TAG,sha256=WVMVbX4MVkpCclExbq8m-IcOZIOuIZf5FrYw5Pk-Ma4,43
5
+ ncca/ngl/PrimData/NGLDebug.log,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ ncca/ngl/PrimData/Primitives.npz,sha256=8viufkX_FyT6afB4ZJR_ikv3D3tBG6IuHIXBdw0nE0o,15016264
7
+ ncca/ngl/PrimData/buddah.npy,sha256=D9fBmoqKJdynSqPq9_AWFlGIGFb983G8ZCfvUQogXkk,9600128
8
+ ncca/ngl/PrimData/bunny.npy,sha256=URHm_8eGdFjIzosEbYxVYr-YeQyuAz7fq-V0Ake4mcg,6688064
9
+ ncca/ngl/PrimData/cube.npy,sha256=2_Bim6hRXw0ocfylM9IZHotQbg4-4zIBd_L6Qy83kQM,1280
10
+ ncca/ngl/PrimData/dodecahedron.npy,sha256=o7SI6Thh1Gt_ngS3CUs7oNjKGAXF7KB6K1rXYiX_O7k,3584
11
+ ncca/ngl/PrimData/dragon.npy,sha256=ZVYY3wNlAzcdnycHgrEQNAaQE3uTadTqKNqP4me-Bsk,9600128
12
+ ncca/ngl/PrimData/football.npy,sha256=AQY4VU6ci2ipinNcaBkL1Z6fi5wWsZTzrw8Lk41LX6k,11264
13
+ ncca/ngl/PrimData/icosahedron.npy,sha256=z5CRCy7KMbOUiIOx54Wc8n0CvLlA0F1TIASoFThfb2w,2048
14
+ ncca/ngl/PrimData/octahedron.npy,sha256=Y9qEzBMFGeoB554Jl08zGQQg6NGs_J0ErhZXMQrTE8Q,896
15
+ ncca/ngl/PrimData/pack_arrays.py,sha256=CYUmnS8rfKY0wDyTl9uyVIRRxXzYkal8YlZpx4B332E,299
16
+ ncca/ngl/PrimData/teapot.npy,sha256=fiOfYtB5SkegO7uTSitpjl_HmnS_iIy0sXAGfxCXXjY,1350560
17
+ ncca/ngl/PrimData/tetrahedron.npy,sha256=_KCSpflFXhYB4gGVxFmF5Cv6pQyPHuUlCj9xfL2oyEM,512
18
+ ncca/ngl/PrimData/troll.npy,sha256=ohgGgxLCJrmsFdNrlfRY2Rg9eJgcmvArf6IAspO2BKA,3505280
19
+ ncca/ngl/__init__.py,sha256=t0EdoLVwrOFEEzN7nMo3iArOG3D2o-ZbZt4caXUNR7g,2705
20
+ ncca/ngl/abstract_vao.py,sha256=fi7-BIfw1jefcXe09Qj2gGmnqqA9kzJK-hAwfG14Hrc,2068
21
+ ncca/ngl/base_mesh.py,sha256=ZhpOuUguqHH0HiQw-QGMa91iIMl4GkwS7k6fe_zw1Pc,6053
22
+ ncca/ngl/base_mesh.pyi,sha256=kobLuNnCSZlRRobIgVopQaS7Bjg0tJ3m4M64WXt5I-M,173
23
+ ncca/ngl/bbox.py,sha256=PylB6ju_bkdDUqQkzO1n2E-jsmxiviNkyBLY-sN59n8,6578
24
+ ncca/ngl/bezier_curve.py,sha256=A0aidWJ7c8Bh2KGCgCJ7aH8c8MakP8xrFFEFvCjva38,2297
25
+ ncca/ngl/first_person_camera.py,sha256=IUIdiy17bMnx7Z210bH9Hr5D0RKvq_3lQs7tPt_7WJ0,6104
26
+ ncca/ngl/image.py,sha256=NcQuHB2VAdG3QCErwU68IPc3bPF-LNlbmdkk-j8BFVQ,2646
27
+ ncca/ngl/log.py,sha256=b7l-XNJIpP36VqcCGXBV_0XT5Nkd5eyuC7043lWegcw,1282
28
+ ncca/ngl/mat2.py,sha256=YuLAk8pmOCZzyg7QPyZ0YbRRvUvlGpDvAVykdX5a0Pc,4752
29
+ ncca/ngl/mat3.py,sha256=ik0d7vJWEgOioVXxJHZBluR4XleYiM9PR6OiWUmdavA,9736
30
+ ncca/ngl/mat4.py,sha256=dc2QB59vl_DRkJSoOb-0E5SEzQQ3sdiNMT256nMjrEw,8055
31
+ ncca/ngl/multi_buffer_vao.py,sha256=cuNE6gSrqkNcYvfIOYOZp4MVnpCvChUgnzsf7b60pWg,1752
32
+ ncca/ngl/obj.py,sha256=AGldNouHrkrDs2UhATClGkgo4dzr6lzArR4YeCxQKmo,13667
33
+ ncca/ngl/plane.py,sha256=96WuGzexYKhoeRVevGP2pZcustt9fzyyAjuwJHT25tk,1299
34
+ ncca/ngl/prim_data.py,sha256=FPoIHz5IsI0VcvFGxyCORhWE2TJqGtv0pWnhdbU-Pi4,19518
35
+ ncca/ngl/primitives.py,sha256=Gsu17UgFyT9adJnLJXhzrCzU5Aw6YqYVtQD5XbNHCY0,4828
36
+ ncca/ngl/pyside_event_handling_mixin.py,sha256=rZeeJy4PNVXaedt4X_tE5WGj8Q-iLr3StAq7pdcQR6U,6895
37
+ ncca/ngl/quaternion.py,sha256=5ImlTYQBAtKmrmiedMoaHG9Qc7tLu2nLecpATAN4lho,6771
38
+ ncca/ngl/random.py,sha256=wX1R2rMpb76TP4rk44NUp5XoVuMisH9d-eBG5kFBZsM,5579
39
+ ncca/ngl/shader.py,sha256=wfobb49jrkNO0NusvQQAMO6PluBQqNjnccR7yF9j_ns,3315
40
+ ncca/ngl/shader_lib.py,sha256=YmF3EJM9roTEt5OI5sHonAVN_ydIseyiOUBFZTX4KdA,18627
41
+ ncca/ngl/shader_program.py,sha256=V_y968mSUZU3XDBX_8IxjturBS2-rM0wO49KfIbz3QY,33325
42
+ ncca/ngl/shaders/checker_fragment.glsl,sha256=FGReGg5l_l9QfGyfdXeOQg5i9KCqw3qpKEJ5H0TAW8Q,640
43
+ ncca/ngl/shaders/checker_vertex.glsl,sha256=Xb3SYKs9iSkw1ejtfttrBrTDTgfdlBy2hVcxrUXIzos,411
44
+ ncca/ngl/shaders/colour_fragment.glsl,sha256=Y8CeWyDyQAK7u3-rQhURO6Ee3ibturZR3B75e5vcb2U,118
45
+ ncca/ngl/shaders/colour_vertex.glsl,sha256=MZTFp0KIeiMEi6XPFScxp6I-enpr4wX2Cx8LYmaBnC8,154
46
+ ncca/ngl/shaders/diffuse_fragment.glsl,sha256=vkKJ9R683yk5OlyUGUwdoqrLyOsvFz3CjZS-wRCuzaY,615
47
+ ncca/ngl/shaders/diffuse_vertex.glsl,sha256=j1t1Zv5iky0gsBG0HOQGOix6qyj09RHo7c_irMMJZHo,621
48
+ ncca/ngl/shaders/text_fragment.glsl,sha256=1jrKOSl5EjJOFonWdgj7dNiQtzFSbZy1QaZrUwUidNQ,220
49
+ ncca/ngl/shaders/text_geometry.glsl,sha256=OTLdn4pdZj2BOMh33rE6JBfQ9SHQ1L1e8qn3Hl3YV6w,1015
50
+ ncca/ngl/shaders/text_vertex.glsl,sha256=uPym1x87SJOd0E3zPN1Fx44warJ6IYfvhzPQEtLOO3w,289
51
+ ncca/ngl/simple_index_vao.py,sha256=1IVy1WQH4V8_viZbRoIMbDRJsiH7iAhw0GEWUV9KpAU,2338
52
+ ncca/ngl/simple_vao.py,sha256=jfU2O3yliaM6iWNvfcRbjQ6o2_IVSPrOR3GthDiul6Q,1419
53
+ ncca/ngl/text.py,sha256=yWNfKHnuWn0bxbwhW1H-EkRZ7bEM9DAyjES16cxTnME,13608
54
+ ncca/ngl/texture.py,sha256=GEAOAOV-nEEccc_t7YVByok9smxzqRrmXKyzzBwvFBo,2473
55
+ ncca/ngl/transform.py,sha256=_PibgtFoU_exfvQUWucmts0WF5OreSTNbftvSa3zT8g,2938
56
+ ncca/ngl/util.py,sha256=ljJyaMMMr1iFUnJa42Qr5md6Jq2Up7Rn7BitdwDBmRs,4616
57
+ ncca/ngl/vao_factory.py,sha256=v87VfrUMaoqcsE-CS9kM7h5Fyk_e0LGl_iA6xqaomPg,930
58
+ ncca/ngl/vec2.py,sha256=anhrK8Ac-GZLdaAbHmrXBiLnZx-eQj9NsfOFK-X5Z-I,3292
59
+ ncca/ngl/vec2_array.py,sha256=XwDrpscx82q_nlz9fP010r-89SUkxgMA6ZiWQkippeo,5425
60
+ ncca/ngl/vec3.py,sha256=xZ7e_Ce15rzJ9HtkOrn5z_4WhJzVHSG0H4aXqXFFXqg,3362
61
+ ncca/ngl/vec3_array.py,sha256=rxoyjrblzQx1pbCjGIMrHAog89oudbe3XSsp8h4H5QA,5646
62
+ ncca/ngl/vec4.py,sha256=Gq5_0A0MJ13AA1bmpg3qwo4LzI6hWsHexfhw-ZBL9bY,3862
63
+ ncca/ngl/vec4_array.py,sha256=i4B9zLgo_O55-QGjyV3tuFEx_HHZIQKYRjgEdt-co20,5567
64
+ ncca/ngl/vector_base.py,sha256=PezlSub-1j1SE1qV2VtkBpXWskdhZPsqP5XWvidLiOw,16784
65
+ ncca/ngl/webgpu/__init__.py,sha256=3V3tZ3esdVhvBfs4GyRuX_IaOkoJ7mep-LIUHyXCP1Y,511
66
+ ncca/ngl/webgpu/__main__.py,sha256=dafKxgGcilErhpKheQut1gwko92MNtr3NJnq2jVVGNI,24925
67
+ ncca/ngl/webgpu/__main__.py.backup,sha256=dafKxgGcilErhpKheQut1gwko92MNtr3NJnq2jVVGNI,24925
68
+ ncca/ngl/webgpu/base_webgpu_pipeline.py,sha256=DD4Bxjlg7dk4OrEIWjK_2eufp53H6Ege4A-YgVJNO40,11420
69
+ ncca/ngl/webgpu/custom_shader_pipeline.py,sha256=wAIYJ5nY8K5jLpMzgo3xsgq18xEs-YJNkY7pUQ8Uats,10621
70
+ ncca/ngl/webgpu/instanced_geometry_pipeline.py,sha256=7n2uwhXuOyy0zz_GbCqIn1QLWUX5l0rv8ze7pjT0-bA,23455
71
+ ncca/ngl/webgpu/line_pipeline.py,sha256=oXDfoB6-B1-cZ_M3r6K43XwMmRh9nFwu8YK7OISsQbo,13970
72
+ ncca/ngl/webgpu/pipeline_factory.py,sha256=2YU6FkxJ0-C9YWVp97rsMqpSPza0QsVVYf7Zu-kIZJk,7174
73
+ ncca/ngl/webgpu/pipeline_shaders.py,sha256=JW-VwM58Qx3BbOPT2y40FJAB4MNOcr6r7cdkLovQvKs,15382
74
+ ncca/ngl/webgpu/point_list_pipeline.py,sha256=yZ1_v7QUJgHPP-2eIZ-o0eLI5Jh19741ux92Lr1qdlQ,12120
75
+ ncca/ngl/webgpu/point_pipeline.py,sha256=u8DT_PjOONhBU2kCFYK00EGf-om-AFgQyA_d_egjzcY,12208
76
+ ncca/ngl/webgpu/triangle_pipeline.py,sha256=Sx_HAznveXONNR93WWheNwcepi6aPxSb5yDLG7wHRq4,14691
77
+ ncca/ngl/webgpu/webgpu_constants.py,sha256=s9ssAM6cN25Jy06Xxj2EwLxqexg7pEyB4Af_ezQ6f3g,715
78
+ ncca/ngl/webgpu/webgpu_widget.py,sha256=B_H124q0YJ7WxeOE_C_LVtl--53XlV23R5B6CPNXQT8,11716
79
+ ncca/ngl/webgpu/wip/REFACTORING_SUMMARY.md,sha256=0rwWSCBTHEX11I50d_g2cJL-ZZ-579okeBGedc0Fsq0,3440
80
+ ncca/ngl/webgpu/wip/UNIFIED_SYSTEM.md,sha256=FrltaW0lU_ZVHxpuRqwazstAEblxNiLlAXCgkkuVaYo,8845
81
+ ncca/ngl/webgpu/wip/buffer_manager.py,sha256=VPKjvY_em4vGJ23wZl52XKVqvSkcwCNiKdqPDnWLYQ4,12263
82
+ ncca/ngl/webgpu/wip/pipeline_config.py,sha256=qeNsoL_Tzxw7EfJc5iTPMa76CCYpuzDaHzKTFUtVVkc,14017
83
+ ncca/ngl/webgpu/wip/shader_constants.py,sha256=rbPgwCUEcK5kq2b0i5V7sYnAXRvHfqVrWNZ2AS-HWBI,9371
84
+ ncca/ngl/webgpu/wip/shader_templates.py,sha256=sd_HbmOuvNgp4yVLTb7ZYmD101mLrWYJzqrf1LHLpEs,19112
85
+ ncca/ngl/webgpu/wip/unified_examples.py,sha256=MZFzpL9L81-oeKhq9mjwZ6JETN3gV_UCS_FQ_PxFAWM,12286
86
+ ncca/ngl/webgpu/wip/unified_factory.py,sha256=zV3yZmd7HDDMAfd6__UoYeRhIMc-KXpcZNTWykqnNcg,15123
87
+ ncca/ngl/webgpu/wip/unified_pipeline.py,sha256=uSqhg3Rg4tgWiXD3pdH0a6gBj8Mx9HZGCosOUb6N7rA,17351
88
+ ncca/ngl/widgets/NGLDebug.log,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
+ ncca/ngl/widgets/__init__.py,sha256=FSGKC1zbk22GWUbq1TpWUXOWHY5CkxwMryykbgAkbQE,713
90
+ ncca/ngl/widgets/__main__.py,sha256=Co0vZy-s8HW95LUdotYP2e5vR2V7R6ck-ljSxui1zgk,2760
91
+ ncca/ngl/widgets/glsl/phong.frag,sha256=iP-4cx0Qh7CS4tDbQmSdDX4huW3_XqleQaXdRBAiZ3A,853
92
+ ncca/ngl/widgets/glsl/phong.vert,sha256=3v1dZba9FTS0ly-3rtEYMTiKPGIzfezDjhu-4m4SwDY,333
93
+ ncca/ngl/widgets/glsl/picking.frag,sha256=372ZzBC1KME9i6lmO7yvUnio9YHp7u6wqiV2cGesTxs,100
94
+ ncca/ngl/widgets/glsl/picking.vert,sha256=Bbn2vZ-lk3nD8qfXfIIaxan2V85XkpWUipYRWCMXobw,128
95
+ ncca/ngl/widgets/lookatwidget.py,sha256=FsBTIhkd3sG2pmP-AJV941exevrbR7MZq8T-HEOrngk,3826
96
+ ncca/ngl/widgets/mat4widget.py,sha256=49IpjnMzIktqL68qoyYaMIxULaaTUyxIa7VdHjcgovA,206
97
+ ncca/ngl/widgets/rgbacolourwidget.py,sha256=dA_Ph7kTtd6ZqSvINt4qCbksMOWrsnT4TeuPfvaw4IQ,5411
98
+ ncca/ngl/widgets/rgbcolourwidget.py,sha256=Z5t_JNUggbCDIpT3kmBtOWXtxrMNJZJxZCBGBOjBFlI,4741
99
+ ncca/ngl/widgets/transformwidget.py,sha256=U5pDZN_uhtBDv0BX28J7_fa1AGg8vc8Q2uG70NsBCJY,4011
100
+ ncca/ngl/widgets/vec2widget.py,sha256=Usfr_vYN8FHl__CqveoJ1OpWijHo4MewS79ETZAh5DQ,4298
101
+ ncca/ngl/widgets/vec3widget.py,sha256=DJRBFM_0jL_RNpiKjVP4loAcAv2fr4Ul1n0T4cwzXMw,4935
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,,
@@ -1,299 +0,0 @@
1
- import sys
2
-
3
- from OpenGL.GL import *
4
- from PySide6.QtCore import Property, QEasingCurve, QPoint, QPropertyAnimation, Signal, Slot
5
- from PySide6.QtGui import QQuaternion
6
- from PySide6.QtOpenGLWidgets import QOpenGLWidget
7
- from PySide6.QtWidgets import (
8
- QApplication,
9
- QMainWindow,
10
- QTextEdit,
11
- QVBoxLayout,
12
- QWidget,
13
- )
14
-
15
- from ncca.ngl.mat4 import Mat4
16
- from ncca.ngl.prim_data import PrimData, Prims
17
- from ncca.ngl.quaternion import Quaternion
18
- from ncca.ngl.shader_lib import ShaderLib
19
- from ncca.ngl.simple_vao import SimpleVAO, VertexData
20
- from ncca.ngl.transform import Transform
21
- from ncca.ngl.vec3 import Vec3
22
-
23
-
24
- class TransformationWidget(QOpenGLWidget):
25
- matrix_updated = Signal(Mat4)
26
-
27
- def __init__(self, parent=None):
28
- super().__init__(parent)
29
- self.transform = Transform()
30
- self.projection = Mat4()
31
- self.view = Mat4()
32
- self.mouse_pos = QPoint()
33
- self.vao = SimpleVAO()
34
-
35
- self.face_rotations = {
36
- "front": Quaternion.from_axis_angle(Vec3(0, 1, 0), 0),
37
- "back": Quaternion.from_axis_angle(Vec3(0, 1, 0), 180),
38
- "left": Quaternion.from_axis_angle(Vec3(0, 1, 0), -90),
39
- "right": Quaternion.from_axis_angle(Vec3(0, 1, 0), 90),
40
- "top": Quaternion.from_axis_angle(Vec3(1, 0, 0), -90),
41
- "bottom": Quaternion.from_axis_angle(Vec3(1, 0, 0), 90),
42
- }
43
-
44
- self.face_ids = {
45
- 1: "right",
46
- 2: "left",
47
- 3: "top",
48
- 4: "bottom",
49
- 5: "front",
50
- 6: "back",
51
- }
52
- self.picking_fbo = None
53
- self.picking_texture = None
54
- self.depth_texture = None
55
-
56
- def initializeGL(self):
57
- glClearColor(0.4, 0.4, 0.4, 1.0)
58
- glEnable(GL_DEPTH_TEST)
59
- glEnable(GL_MULTISAMPLE)
60
-
61
- # ShaderLib.load_shader("picking", "glsl/picking.vert", "glsl/picking.frag")
62
- # ShaderLib.load_shader("phong", "glsl/phong.vert", "glsl/phong.frag")
63
-
64
- # cube_data = PrimData.primitive(Prims.CUBE)
65
- # print(f"Cube data size: {cube_data.size}")
66
- # print(f"Cube data shape: {cube_data.shape}")
67
- # with self.vao:
68
- # data = VertexData(data=cube_data, size=cube_data.size)
69
- # self.vao.set_data(data)
70
- # vert_data_size = 8 * 4 # 4 is sizeof float and 8 is x,y,z,nx,ny,nz,uv
71
- # self.vao.set_vertex_attribute_pointer(0, 3, GL_FLOAT, vert_data_size, 0)
72
- # self.vao.set_vertex_attribute_pointer(1, 3, GL_FLOAT, vert_data_size, Vec3.sizeof())
73
- # self.vao.set_vertex_attribute_pointer(2, 2, GL_FLOAT, vert_data_size, 2 * Vec3.sizeof())
74
- # self.vao.set_num_indices(cube_data.size // 8)
75
-
76
- self.view.look_at(Vec3(0, 0, 3), Vec3(0, 0, 0), Vec3(0, 1, 0))
77
- self.setFocus()
78
-
79
- def resizeGL(self, w, h):
80
- if h == 0:
81
- h = 1
82
- # self.projection.perspective(45, w / h, 0.01, 20)
83
- # self._create_picking_buffer(w, h)
84
-
85
- def paintGL(self):
86
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
87
- # if self.picking_fbo is None:
88
- # self._create_picking_buffer(self.width(), self.height())
89
- # self._render_picking_pass()
90
- # self._render_scene_pass()
91
- # self.matrix_updated.emit(self.transform.get_matrix())
92
-
93
- def _create_picking_buffer(self, w, h):
94
- if self.picking_fbo is not None:
95
- glDeleteFramebuffers(1, [self.picking_fbo])
96
- glDeleteTextures(1, [self.picking_texture])
97
- glDeleteTextures(1, [self.depth_texture])
98
-
99
- self.picking_fbo = glGenFramebuffers(1)
100
- glBindFramebuffer(GL_FRAMEBUFFER, self.picking_fbo)
101
-
102
- self.picking_texture = glGenTextures(1)
103
- glBindTexture(GL_TEXTURE_2D, self.picking_texture)
104
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, GL_UNSIGNED_BYTE, None)
105
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, self.picking_texture, 0)
106
-
107
- self.depth_texture = glGenTextures(1)
108
- glBindTexture(GL_TEXTURE_2D, self.depth_texture)
109
- glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, GL_FLOAT, None)
110
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, self.depth_texture, 0)
111
-
112
- if glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE:
113
- print("Framebuffer is not complete")
114
-
115
- glBindFramebuffer(GL_FRAMEBUFFER, 0)
116
-
117
- def _render_picking_pass(self):
118
- glBindFramebuffer(GL_FRAMEBUFFER, self.picking_fbo)
119
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
120
-
121
- ShaderLib.use("picking")
122
- mvp = self.projection @ self.view @ self.transform.get_matrix()
123
- ShaderLib.set_uniform("MVP", mvp)
124
- with self.vao:
125
- for i, face_id in self.face_ids.items():
126
- r = (i & 0x0000FF) / 255.0
127
- g = ((i & 0x00FF00) >> 8) / 255.0
128
- b = ((i & 0xFF0000) >> 16) / 255.0
129
- ShaderLib.set_uniform("face_id", Vec3(r, g, b))
130
- glDrawArrays(GL_TRIANGLES, (i - 1) * 6, 6)
131
-
132
- glBindFramebuffer(GL_FRAMEBUFFER, 0)
133
-
134
- def _render_scene_pass(self):
135
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
136
-
137
- ShaderLib.use("phong")
138
- mvp = self.projection @ self.view @ self.transform.get_matrix()
139
- ShaderLib.set_uniform("MVP", mvp)
140
- ShaderLib.set_uniform("model", self.transform.get_matrix())
141
- ShaderLib.set_uniform("normal_matrix", self.transform.get_matrix().inverse().transpose())
142
- ShaderLib.set_uniform("light_pos", Vec3(0, 0, 3))
143
- ShaderLib.set_uniform("view_pos", Vec3(0, 0, 3))
144
- ShaderLib.set_uniform("light_color", Vec3(1, 1, 1))
145
- ShaderLib.set_uniform("object_color", Vec3(0.6, 0.6, 0.6))
146
-
147
- with self.vao:
148
- self.vao.draw()
149
-
150
- def mousePressEvent(self, event):
151
- self.mouse_pos = event.pos()
152
-
153
- glBindFramebuffer(GL_FRAMEBUFFER, self.picking_fbo)
154
- x, y = int(event.position().x()), int(self.height() - event.position().y())
155
- pixel = glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE)
156
- face_id = pixel[0] + (pixel[1] << 8) + (pixel[2] << 16)
157
- glBindFramebuffer(GL_FRAMEBUFFER, 0)
158
-
159
- if face_id in self.face_ids:
160
- face_name = self.face_ids[face_id]
161
- self.snap_to_face(face_name)
162
-
163
- def mouseMoveEvent(self, event):
164
- if event.buttons():
165
- diff = event.position() - self.mouse_pos
166
- self.mouse_pos = event.position()
167
-
168
- axis = Vec3(diff.y(), diff.x(), 0)
169
- angle = axis.length() * 0.5
170
- if angle > 0:
171
- rotation = Quaternion.from_axis_angle(axis.normalize(), angle)
172
- self.transform.add_rotation(rotation)
173
- self.update()
174
-
175
- def snap_to_face(self, face_name):
176
- target_rotation = self.face_rotations[face_name]
177
-
178
- animation = QPropertyAnimation(self, b"qrotation")
179
- animation.setDuration(400)
180
- animation.setStartValue(self.transform.get_rotation())
181
- animation.setEndValue(target_rotation)
182
- animation.setEasingCurve(QEasingCurve.InOutQuad)
183
- animation.start(QPropertyAnimation.DeletionPolicy.DeleteWhenStopped)
184
-
185
- @Property(QQuaternion)
186
- def qrotation(self):
187
- q = self.transform.get_rotation()
188
- return QQuaternion(q.w, q.x, q.y, q.z)
189
-
190
- @qrotation.setter
191
- def set_qrotation(self, rotation):
192
- q = Quaternion(rotation.scalar(), rotation.x(), rotation.y(), rotation.z())
193
- self.transform.set_rotation(q)
194
- self.update()
195
-
196
-
197
- class MainWindow(QMainWindow):
198
- def __init__(self):
199
- super().__init__()
200
- self.setWindowTitle("3D Transformation Widget")
201
- self.setGeometry(100, 100, 800, 600)
202
-
203
- central_widget = QWidget()
204
- self.setCentralWidget(central_widget)
205
- layout = QVBoxLayout(central_widget)
206
-
207
- self.gl_widget = TransformationWidget()
208
- layout.addWidget(self.gl_widget, 1)
209
-
210
- self.matrix_display = QTextEdit()
211
- self.matrix_display.setReadOnly(True)
212
- self.matrix_display.setFixedHeight(120)
213
- layout.addWidget(self.matrix_display)
214
-
215
- self.gl_widget.matrix_updated.connect(self.update_matrix_display)
216
-
217
- @Slot(Mat4)
218
- def update_matrix_display(self, matrix):
219
- self.matrix_display.setText(str(matrix))
220
-
221
-
222
- if __name__ == "__main__":
223
- # We need to create some dummy shaders for this to run
224
- # as the shader lib will fail otherwise.
225
- import os
226
-
227
- from PySide6.QtGui import QSurfaceFormat
228
-
229
- if not os.path.exists("glsl"):
230
- os.makedirs("glsl")
231
- with open("glsl/picking.vert", "w") as f:
232
- f.write("""#version 330 core
233
- layout (location = 0) in vec3 aPos;
234
- uniform mat4 MVP;
235
- void main()
236
- {
237
- gl_Position = MVP * vec4(aPos, 1.0);
238
- }""")
239
- with open("glsl/picking.frag", "w") as f:
240
- f.write("""#version 330 core
241
- out vec3 FragColor;
242
- uniform vec3 face_id;
243
- void main()
244
- {
245
- FragColor = face_id;
246
- }""")
247
- with open("glsl/phong.vert", "w") as f:
248
- f.write("""#version 330 core
249
- layout (location = 0) in vec3 aPos;
250
- layout (location = 1) in vec3 aNormal;
251
- out vec3 FragPos;
252
- out vec3 Normal;
253
- uniform mat4 model;
254
- uniform mat4 MVP;
255
- uniform mat3 normal_matrix;
256
- void main()
257
- {
258
- FragPos = vec3(model * vec4(aPos, 1.0));
259
- Normal = normal_matrix * aNormal;
260
- gl_Position = MVP * vec4(aPos, 1.0);
261
- }""")
262
- with open("glsl/phong.frag", "w") as f:
263
- f.write("""#version 330 core
264
- out vec4 FragColor;
265
- in vec3 FragPos;
266
- in vec3 Normal;
267
- uniform vec3 light_pos;
268
- uniform vec3 view_pos;
269
- uniform vec3 light_color;
270
- uniform vec3 object_color;
271
- void main()
272
- {
273
- // Ambient
274
- float ambient_strength = 0.1;
275
- vec3 ambient = ambient_strength * light_color;
276
- // Diffuse
277
- vec3 norm = normalize(Normal);
278
- vec3 light_dir = normalize(light_pos - FragPos);
279
- float diff = max(dot(norm, light_dir), 0.0);
280
- vec3 diffuse = diff * light_color;
281
- // Specular
282
- float specular_strength = 0.5;
283
- vec3 view_dir = normalize(view_pos - FragPos);
284
- vec3 reflect_dir = reflect(-light_dir, norm);
285
- float spec = pow(max(dot(view_dir, reflect_dir), 0.0), 32);
286
- vec3 specular = specular_strength * spec * light_color;
287
- vec3 result = (ambient + diffuse + specular) * object_color;
288
- FragColor = vec4(result, 1.0);
289
- }""")
290
-
291
- app = QApplication(sys.argv)
292
- format = QSurfaceFormat()
293
- format.setProfile(QSurfaceFormat.CoreProfile)
294
- format.setVersion(4, 1)
295
- QSurfaceFormat.setDefaultFormat(format)
296
-
297
- main_win = MainWindow()
298
- main_win.show()
299
- sys.exit(app.exec())
@@ -1,82 +0,0 @@
1
- ncca/ngl/.ruff_cache/.gitignore,sha256=njpg8ebsSuYCFcEdVLFxOSdF7CXp3e1DPVvZITY68xY,35
2
- ncca/ngl/.ruff_cache/0.13.0/10564494386971134025,sha256=cw-J0gIy5ofUkDLcl9l1KuyGeSnM8hZtj8urcZcsVJI,1210
3
- ncca/ngl/.ruff_cache/0.13.0/7783445477288392980,sha256=eeVnGNALeos37aECRfh4CHPcV_ubWjMAfxMhg3IId5c,82
4
- ncca/ngl/.ruff_cache/CACHEDIR.TAG,sha256=WVMVbX4MVkpCclExbq8m-IcOZIOuIZf5FrYw5Pk-Ma4,43
5
- ncca/ngl/PrimData/NGLDebug.log,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- ncca/ngl/PrimData/Primitives.npz,sha256=8viufkX_FyT6afB4ZJR_ikv3D3tBG6IuHIXBdw0nE0o,15016264
7
- ncca/ngl/PrimData/buddah.npy,sha256=D9fBmoqKJdynSqPq9_AWFlGIGFb983G8ZCfvUQogXkk,9600128
8
- ncca/ngl/PrimData/bunny.npy,sha256=URHm_8eGdFjIzosEbYxVYr-YeQyuAz7fq-V0Ake4mcg,6688064
9
- ncca/ngl/PrimData/cube.npy,sha256=2_Bim6hRXw0ocfylM9IZHotQbg4-4zIBd_L6Qy83kQM,1280
10
- ncca/ngl/PrimData/dodecahedron.npy,sha256=o7SI6Thh1Gt_ngS3CUs7oNjKGAXF7KB6K1rXYiX_O7k,3584
11
- ncca/ngl/PrimData/dragon.npy,sha256=ZVYY3wNlAzcdnycHgrEQNAaQE3uTadTqKNqP4me-Bsk,9600128
12
- ncca/ngl/PrimData/football.npy,sha256=AQY4VU6ci2ipinNcaBkL1Z6fi5wWsZTzrw8Lk41LX6k,11264
13
- ncca/ngl/PrimData/icosahedron.npy,sha256=z5CRCy7KMbOUiIOx54Wc8n0CvLlA0F1TIASoFThfb2w,2048
14
- ncca/ngl/PrimData/octahedron.npy,sha256=Y9qEzBMFGeoB554Jl08zGQQg6NGs_J0ErhZXMQrTE8Q,896
15
- ncca/ngl/PrimData/pack_arrays.py,sha256=aWShJX8QPHXKTj66C8yu1DskmD3VEzFXyaADcxw6YKs,362
16
- ncca/ngl/PrimData/teapot.npy,sha256=fiOfYtB5SkegO7uTSitpjl_HmnS_iIy0sXAGfxCXXjY,1350560
17
- ncca/ngl/PrimData/tetrahedron.npy,sha256=_KCSpflFXhYB4gGVxFmF5Cv6pQyPHuUlCj9xfL2oyEM,512
18
- ncca/ngl/PrimData/troll.npy,sha256=ohgGgxLCJrmsFdNrlfRY2Rg9eJgcmvArf6IAspO2BKA,3505280
19
- ncca/ngl/__init__.py,sha256=2zCMEMQLSZNeWUTY1i7GnRZqhmerPy1F220NoFPfJB0,2640
20
- ncca/ngl/abstract_vao.py,sha256=fi7-BIfw1jefcXe09Qj2gGmnqqA9kzJK-hAwfG14Hrc,2068
21
- ncca/ngl/base_mesh.py,sha256=2JmVT5_bvgLHra1VnwRld-mh-20IqqekgEu1dbGU1a4,5736
22
- ncca/ngl/base_mesh.pyi,sha256=kobLuNnCSZlRRobIgVopQaS7Bjg0tJ3m4M64WXt5I-M,173
23
- ncca/ngl/bbox.py,sha256=PylB6ju_bkdDUqQkzO1n2E-jsmxiviNkyBLY-sN59n8,6578
24
- ncca/ngl/bezier_curve.py,sha256=A0aidWJ7c8Bh2KGCgCJ7aH8c8MakP8xrFFEFvCjva38,2297
25
- ncca/ngl/first_person_camera.py,sha256=IUIdiy17bMnx7Z210bH9Hr5D0RKvq_3lQs7tPt_7WJ0,6104
26
- ncca/ngl/image.py,sha256=zpG8egzXWkUJKQxpRhXndpRxJDKOKHZkDjQuKSRXN2E,2692
27
- ncca/ngl/log.py,sha256=b7l-XNJIpP36VqcCGXBV_0XT5Nkd5eyuC7043lWegcw,1282
28
- ncca/ngl/mat2.py,sha256=kHyrxLWQ_zGBf5t6huKL6BDrjF5a1skU_9PpcyMFi0I,3710
29
- ncca/ngl/mat3.py,sha256=k4kD9a5QqamxZZbnSECe4p0kQdVM6bEj5VaUBAf5AOs,12355
30
- ncca/ngl/mat4.py,sha256=i6ZKnMpwJdh8ULTjcnWKPo9UK39ulU4WeUdoet4yZAE,17574
31
- ncca/ngl/multi_buffer_vao.py,sha256=cuNE6gSrqkNcYvfIOYOZp4MVnpCvChUgnzsf7b60pWg,1752
32
- ncca/ngl/obj.py,sha256=AGldNouHrkrDs2UhATClGkgo4dzr6lzArR4YeCxQKmo,13667
33
- ncca/ngl/plane.py,sha256=96WuGzexYKhoeRVevGP2pZcustt9fzyyAjuwJHT25tk,1299
34
- ncca/ngl/prim_data.py,sha256=Ji08CdnCJP4KPYEwh5P_NcltC76rPfNPx3MXgnkUW-E,19114
35
- ncca/ngl/primitives.py,sha256=pThdSWLv7jJa9weBVOXhRgTfVVH54AWCbsDFCEI1YLg,4841
36
- ncca/ngl/pyside_event_handling_mixin.py,sha256=L8obXeTp-g2Va2eXyd1hnmSp-sY7p4GX6EcFYRnH1F4,10588
37
- ncca/ngl/quaternion.py,sha256=sKCoHTzKyN-rx-A4q_eAz_4yLWjFcNYS8H8ay6eCBeA,5868
38
- ncca/ngl/random.py,sha256=wX1R2rMpb76TP4rk44NUp5XoVuMisH9d-eBG5kFBZsM,5579
39
- ncca/ngl/shader.py,sha256=fEz8R_itsQssIxQp1E8-PhY3aOaTdm7sXpyFYoARSic,7696
40
- ncca/ngl/shader_lib.py,sha256=YmF3EJM9roTEt5OI5sHonAVN_ydIseyiOUBFZTX4KdA,18627
41
- ncca/ngl/shader_program.py,sha256=WNEUOl4N4giC6caC0uMXm5ikDUtzCuZl7dqZl4M7p6k,33655
42
- ncca/ngl/shaders/checker_fragment.glsl,sha256=FGReGg5l_l9QfGyfdXeOQg5i9KCqw3qpKEJ5H0TAW8Q,640
43
- ncca/ngl/shaders/checker_vertex.glsl,sha256=Xb3SYKs9iSkw1ejtfttrBrTDTgfdlBy2hVcxrUXIzos,411
44
- ncca/ngl/shaders/colour_fragment.glsl,sha256=Y8CeWyDyQAK7u3-rQhURO6Ee3ibturZR3B75e5vcb2U,118
45
- ncca/ngl/shaders/colour_vertex.glsl,sha256=MZTFp0KIeiMEi6XPFScxp6I-enpr4wX2Cx8LYmaBnC8,154
46
- ncca/ngl/shaders/diffuse_fragment.glsl,sha256=vkKJ9R683yk5OlyUGUwdoqrLyOsvFz3CjZS-wRCuzaY,615
47
- ncca/ngl/shaders/diffuse_vertex.glsl,sha256=j1t1Zv5iky0gsBG0HOQGOix6qyj09RHo7c_irMMJZHo,621
48
- ncca/ngl/shaders/text_fragment.glsl,sha256=1jrKOSl5EjJOFonWdgj7dNiQtzFSbZy1QaZrUwUidNQ,220
49
- ncca/ngl/shaders/text_geometry.glsl,sha256=OTLdn4pdZj2BOMh33rE6JBfQ9SHQ1L1e8qn3Hl3YV6w,1015
50
- ncca/ngl/shaders/text_vertex.glsl,sha256=uPym1x87SJOd0E3zPN1Fx44warJ6IYfvhzPQEtLOO3w,289
51
- ncca/ngl/simple_index_vao.py,sha256=1IVy1WQH4V8_viZbRoIMbDRJsiH7iAhw0GEWUV9KpAU,2338
52
- ncca/ngl/simple_vao.py,sha256=jfU2O3yliaM6iWNvfcRbjQ6o2_IVSPrOR3GthDiul6Q,1419
53
- ncca/ngl/text.py,sha256=yWNfKHnuWn0bxbwhW1H-EkRZ7bEM9DAyjES16cxTnME,13608
54
- ncca/ngl/texture.py,sha256=OgBBEItgUDohCsVWgmjEWcQWBJaXl9w070PTOOywPx4,2303
55
- ncca/ngl/transform.py,sha256=_PibgtFoU_exfvQUWucmts0WF5OreSTNbftvSa3zT8g,2938
56
- ncca/ngl/util.py,sha256=HAr_Xgj7r48OY3m3xP5HBZgyDFHQwv4qwffguViP3Cw,4618
57
- ncca/ngl/vao_factory.py,sha256=v87VfrUMaoqcsE-CS9kM7h5Fyk_e0LGl_iA6xqaomPg,930
58
- ncca/ngl/vec2.py,sha256=4Obw_CK5uwdG9LkAVR6zBV9MkTyD-GE4AwpfaLcGLZ0,10531
59
- ncca/ngl/vec2_array.py,sha256=7QRgXh75fORsmNnSnNxNQWk6_rnDgfmRX3tmJZ4ES9E,3420
60
- ncca/ngl/vec3.py,sha256=2i-QXJ-VlhLw60WlGRf3mUv5zyOa1DQBkSV6oATiXLI,12578
61
- ncca/ngl/vec3_array.py,sha256=fLRC8k0TwcaU7CnR2GmJ0prud4dcvvUX0JTbQH_2W3Y,3535
62
- ncca/ngl/vec4.py,sha256=81kFd3rDFTw4caKzRz9EzZ-tQzAcWv_1JGx0CKTfujQ,7079
63
- ncca/ngl/vec4_array.py,sha256=PSJXfG0g2AT4oQCLHiVAP6EC5n7vMXRQy0N1rGvv1iw,3426
64
- ncca/ngl/widgets/NGLDebug.log,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
- ncca/ngl/widgets/__init__.py,sha256=KBrwCwgDLIl-eAp0Q5HQcmNkfZ9q6waPC_4A8-g9PG0,413
66
- ncca/ngl/widgets/__main__.py,sha256=EetuulVqYJV7zxxFXunb12XA6boza7vm5Raayj3UeMI,2729
67
- ncca/ngl/widgets/glsl/phong.frag,sha256=iP-4cx0Qh7CS4tDbQmSdDX4huW3_XqleQaXdRBAiZ3A,853
68
- ncca/ngl/widgets/glsl/phong.vert,sha256=3v1dZba9FTS0ly-3rtEYMTiKPGIzfezDjhu-4m4SwDY,333
69
- ncca/ngl/widgets/glsl/picking.frag,sha256=372ZzBC1KME9i6lmO7yvUnio9YHp7u6wqiV2cGesTxs,100
70
- ncca/ngl/widgets/glsl/picking.vert,sha256=Bbn2vZ-lk3nD8qfXfIIaxan2V85XkpWUipYRWCMXobw,128
71
- ncca/ngl/widgets/lookatwidget.py,sha256=A2OS4Bsp5nLKFk3EfrTrnAlk7LNUWX_TEseyGpeT9hI,3803
72
- ncca/ngl/widgets/mat4widget.py,sha256=7vXs5h2EtA6zy3rTpXd8dtlOg2CFeQHlrg4a4F1RMak,202
73
- ncca/ngl/widgets/rgbacolourwidget.py,sha256=dA_Ph7kTtd6ZqSvINt4qCbksMOWrsnT4TeuPfvaw4IQ,5411
74
- ncca/ngl/widgets/rgbcolourwidget.py,sha256=Z5t_JNUggbCDIpT3kmBtOWXtxrMNJZJxZCBGBOjBFlI,4741
75
- ncca/ngl/widgets/transformation_widget.py,sha256=qeEYXKEwUVdWBKz3oXiW6kbTm-MyXghoh0rfU7J3yAE,10568
76
- ncca/ngl/widgets/transformwidget.py,sha256=U5pDZN_uhtBDv0BX28J7_fa1AGg8vc8Q2uG70NsBCJY,4011
77
- ncca/ngl/widgets/vec2widget.py,sha256=w4GqwuiNewc2UI5PrSn6ZZYEaB_cxkpxGgrpMQ82WsM,4330
78
- ncca/ngl/widgets/vec3widget.py,sha256=PnmqdQ1j77v0PQC-p4lT3mTQd_Qi2Iwv9XzSP1Mpa7M,4934
79
- ncca/ngl/widgets/vec4widget.py,sha256=mT7c5paDaRxn-vSv7lbffg7isyD8T-6sUxOUMqJXBZs,5631
80
- ncca_ngl-0.3.5.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
81
- ncca_ngl-0.3.5.dist-info/METADATA,sha256=ypLb9CnfpTInsKt3q9g76OVDrccixIEzKOHhly8ibkY,1596
82
- ncca_ngl-0.3.5.dist-info/RECORD,,