@woosh/meep-engine 3.46.0 → 3.47.0

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 (230) hide show
  1. package/editor/actions/concrete/TransformModifyAction.d.ts.map +1 -1
  2. package/editor/actions/concrete/TransformModifyAction.js +10 -2
  3. package/editor/ecs/component/FieldDescriptor.js +15 -0
  4. package/editor/ecs/component/createObjectEditor.js +41 -12
  5. package/editor/ecs/component/editors/ecs/Transform64Editor.d.ts.map +1 -1
  6. package/editor/ecs/component/editors/ecs/Transform64Editor.js +77 -70
  7. package/editor/tools/TransformToolV2.d.ts.map +1 -1
  8. package/editor/tools/TransformToolV2.js +4 -0
  9. package/editor/tools/v2/TransformControls.d.ts.map +1 -1
  10. package/editor/tools/v2/TransformControls.js +7 -0
  11. package/editor/view/ecs/EntityEditor.d.ts.map +1 -1
  12. package/editor/view/ecs/EntityEditor.js +4 -2
  13. package/package.json +1 -1
  14. package/src/core/collection/array/array_insert_at.d.ts +16 -0
  15. package/src/core/collection/array/array_insert_at.d.ts.map +1 -0
  16. package/src/core/collection/array/array_insert_at.js +32 -0
  17. package/src/core/collection/array/array_remove_at.d.ts +15 -0
  18. package/src/core/collection/array/array_remove_at.d.ts.map +1 -0
  19. package/src/core/collection/array/array_remove_at.js +30 -0
  20. package/src/core/geom/3d/quaternion/quat3_look_rotation.d.ts +37 -0
  21. package/src/core/geom/3d/quaternion/quat3_look_rotation.d.ts.map +1 -0
  22. package/src/core/geom/3d/quaternion/quat3_look_rotation.js +172 -0
  23. package/src/core/geom/Quaternion.d.ts +1 -0
  24. package/src/core/geom/Quaternion.d.ts.map +1 -1
  25. package/src/core/geom/Quaternion.js +12 -48
  26. package/src/engine/Engine.d.ts.map +1 -1
  27. package/src/engine/Engine.js +9 -4
  28. package/src/engine/ecs/storage/populateEngineSerializationRegistry.d.ts.map +1 -1
  29. package/src/engine/ecs/storage/populateEngineSerializationRegistry.js +10 -0
  30. package/src/engine/ecs/transform/t64_look_rotation.d.ts +4 -4
  31. package/src/engine/ecs/transform/t64_look_rotation.d.ts.map +1 -1
  32. package/src/engine/ecs/transform/t64_look_rotation.js +7 -18
  33. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.d.ts.map +1 -1
  34. package/src/engine/graphics/ecs/camera/topdown/TopDownCameraControllerSystem.js +30 -1
  35. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts +6 -0
  36. package/src/engine/graphics3/GPUParticleEmitterSystem.d.ts.map +1 -1
  37. package/src/engine/graphics3/GPUParticleEmitterSystem.js +72 -29
  38. package/src/engine/input/devices/KeyboardDevice.d.ts +1 -0
  39. package/src/engine/input/devices/KeyboardDevice.d.ts.map +1 -1
  40. package/src/engine/input/devices/KeyboardDevice.js +7 -6
  41. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.d.ts.map +1 -1
  42. package/src/engine/navigation/ecs/path_following/PathFollowingSystem.js +15 -2
  43. package/src/engine/network/CONGESTION_CONTROL.md +9 -9
  44. package/src/engine/network/MESSAGE_TRANSPORT.md +364 -0
  45. package/src/engine/network/NetworkSession.d.ts +31 -11
  46. package/src/engine/network/NetworkSession.d.ts.map +1 -1
  47. package/src/engine/network/NetworkSession.js +453 -286
  48. package/src/engine/network/README.md +77 -27
  49. package/src/engine/network/SMOOTHNESS_DESIGN.md +13 -5
  50. package/src/engine/network/diagnostics/BandwidthMeter.d.ts +1 -1
  51. package/src/engine/network/diagnostics/BandwidthMeter.js +1 -1
  52. package/src/engine/network/orchestrator/HostJoin.d.ts +111 -0
  53. package/src/engine/network/orchestrator/HostJoin.d.ts.map +1 -0
  54. package/src/engine/network/orchestrator/HostJoin.js +271 -0
  55. package/src/engine/network/orchestrator/NetworkPeer.d.ts +151 -112
  56. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  57. package/src/engine/network/orchestrator/NetworkPeer.js +450 -499
  58. package/src/engine/network/orchestrator/PendingSlices.d.ts +30 -0
  59. package/src/engine/network/orchestrator/PendingSlices.d.ts.map +1 -0
  60. package/src/engine/network/orchestrator/PendingSlices.js +83 -0
  61. package/src/engine/network/orchestrator/ReliableFrames.d.ts +34 -0
  62. package/src/engine/network/orchestrator/ReliableFrames.d.ts.map +1 -0
  63. package/src/engine/network/orchestrator/ReliableFrames.js +96 -0
  64. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts +77 -10
  65. package/src/engine/network/orchestrator/ServerAuthoritativeClient.d.ts.map +1 -1
  66. package/src/engine/network/orchestrator/ServerAuthoritativeClient.js +236 -61
  67. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts +20 -6
  68. package/src/engine/network/orchestrator/ServerAuthoritativeServer.d.ts.map +1 -1
  69. package/src/engine/network/orchestrator/ServerAuthoritativeServer.js +33 -8
  70. package/src/engine/network/replication/Replicator.d.ts.map +1 -1
  71. package/src/engine/network/replication/Replicator.js +7 -1
  72. package/src/engine/network/sim/ActionLog.d.ts +32 -5
  73. package/src/engine/network/sim/ActionLog.d.ts.map +1 -1
  74. package/src/engine/network/sim/ActionLog.js +47 -5
  75. package/src/engine/network/sim/SimActionExecutor.d.ts +42 -2
  76. package/src/engine/network/sim/SimActionExecutor.d.ts.map +1 -1
  77. package/src/engine/network/sim/SimActionExecutor.js +100 -4
  78. package/src/engine/network/sim/Snapshotter.d.ts +12 -0
  79. package/src/engine/network/sim/Snapshotter.d.ts.map +1 -1
  80. package/src/engine/network/sim/Snapshotter.js +43 -0
  81. package/src/engine/network/state/Baseline.d.ts +1 -1
  82. package/src/engine/network/state/Baseline.js +1 -1
  83. package/src/engine/network/state/FrameBufferRing.d.ts +25 -6
  84. package/src/engine/network/state/FrameBufferRing.d.ts.map +1 -1
  85. package/src/engine/network/state/FrameBufferRing.js +51 -6
  86. package/src/engine/network/state/InputRing.d.ts +4 -0
  87. package/src/engine/network/state/InputRing.d.ts.map +1 -1
  88. package/src/engine/network/state/InputRing.js +7 -0
  89. package/src/engine/network/transport/DeferredTransport.d.ts.map +1 -1
  90. package/src/engine/network/transport/DeferredTransport.js +1 -0
  91. package/src/engine/network/transport/LoopbackTransport.d.ts.map +1 -1
  92. package/src/engine/network/transport/LoopbackTransport.js +4 -2
  93. package/src/engine/network/transport/Transport.d.ts +7 -0
  94. package/src/engine/network/transport/Transport.d.ts.map +1 -1
  95. package/src/engine/network/transport/Transport.js +8 -0
  96. package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts.map +1 -1
  97. package/src/engine/network/transport/adapters/NodeUDPTransport.js +20 -5
  98. package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.d.ts.map +1 -1
  99. package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.js +8 -0
  100. package/src/engine/network/transport/adapters/WebTransportTransport.d.ts.map +1 -1
  101. package/src/engine/network/transport/adapters/WebTransportTransport.js +6 -0
  102. package/src/engine/network/transport/connection/Connection.d.ts +191 -0
  103. package/src/engine/network/transport/connection/Connection.d.ts.map +1 -0
  104. package/src/engine/network/transport/connection/Connection.js +1262 -0
  105. package/src/engine/network/transport/connection/RangeSet.d.ts +94 -0
  106. package/src/engine/network/transport/connection/RangeSet.d.ts.map +1 -0
  107. package/src/engine/network/transport/connection/RangeSet.js +260 -0
  108. package/src/engine/network/transport/connection/RxStream.d.ts +48 -0
  109. package/src/engine/network/transport/connection/RxStream.d.ts.map +1 -0
  110. package/src/engine/network/transport/connection/RxStream.js +211 -0
  111. package/src/engine/network/transport/connection/TxStream.d.ts +90 -0
  112. package/src/engine/network/transport/connection/TxStream.d.ts.map +1 -0
  113. package/src/engine/network/transport/connection/TxStream.js +243 -0
  114. package/src/engine/network/transport/connection/bytes_copy.d.ts +17 -0
  115. package/src/engine/network/transport/connection/bytes_copy.d.ts.map +1 -0
  116. package/src/engine/network/transport/connection/bytes_copy.js +34 -0
  117. package/src/engine/network/transport/connection/varint.d.ts +46 -0
  118. package/src/engine/network/transport/connection/varint.d.ts.map +1 -0
  119. package/src/engine/network/transport/connection/varint.js +107 -0
  120. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  121. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts +38 -7
  122. package/src/engine/sound/ecs/audio/AudioEmitter.d.ts.map +1 -1
  123. package/src/engine/sound/ecs/audio/AudioEmitter.js +35 -7
  124. package/src/engine/sound/ecs/audio/AudioEmitterSerializationAdapter.d.ts.map +1 -1
  125. package/src/engine/sound/ecs/audio/AudioEmitterSerializationAdapter.js +5 -1
  126. package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.d.ts +18 -0
  127. package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.d.ts.map +1 -0
  128. package/src/engine/sound/ecs/audio/AudioEmitterSerializationUpgrader_0_1.js +48 -0
  129. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts +12 -2
  130. package/src/engine/sound/ecs/audio/AudioEmitterSystem.d.ts.map +1 -1
  131. package/src/engine/sound/ecs/audio/AudioEmitterSystem.js +173 -9
  132. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts +9 -3
  133. package/src/engine/sound/ecs/audio/LiveEmitterSet.d.ts.map +1 -1
  134. package/src/engine/sound/ecs/audio/LiveEmitterSet.js +28 -8
  135. package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts +8 -0
  136. package/src/engine/sound/ecs/trigger/AudioEventTrigger.d.ts.map +1 -1
  137. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationAdapter.d.ts.map +1 -1
  138. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationAdapter.js +5 -1
  139. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.d.ts +18 -0
  140. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.d.ts.map +1 -0
  141. package/src/engine/sound/ecs/trigger/AudioEventTriggerSerializationUpgrader_0_1.js +51 -0
  142. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.d.ts.map +1 -1
  143. package/src/engine/sound/ecs/trigger/AudioEventTriggerSystem.js +15 -1
  144. package/src/engine/sound/sopra/README.md +768 -644
  145. package/src/engine/sound/sopra/SopraEngine.d.ts +104 -8
  146. package/src/engine/sound/sopra/SopraEngine.d.ts.map +1 -1
  147. package/src/engine/sound/sopra/SopraEngine.js +327 -12
  148. package/src/engine/sound/sopra/definition/EventDescription.d.ts +28 -2
  149. package/src/engine/sound/sopra/definition/EventDescription.d.ts.map +1 -1
  150. package/src/engine/sound/sopra/definition/EventDescription.js +55 -5
  151. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts +10 -0
  152. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts.map +1 -1
  153. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +77 -55
  154. package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.d.ts +31 -0
  155. package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.d.ts.map +1 -0
  156. package/src/engine/sound/sopra/definition/EventDescriptionSerializationUpgrader_0_1.js +75 -0
  157. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts +38 -9
  158. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.d.ts.map +1 -1
  159. package/src/engine/sound/sopra/definition/effect/AbstractAudioEffect.js +34 -5
  160. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts +7 -2
  161. package/src/engine/sound/sopra/definition/effect/CompressorEffect.d.ts.map +1 -1
  162. package/src/engine/sound/sopra/definition/effect/CompressorEffect.js +137 -122
  163. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts +3 -1
  164. package/src/engine/sound/sopra/definition/effect/EqEffect.d.ts.map +1 -1
  165. package/src/engine/sound/sopra/definition/effect/EqEffect.js +146 -131
  166. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts +1 -0
  167. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts.map +1 -1
  168. package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +6 -1
  169. package/src/engine/sound/sopra/runtime/BusGraph.d.ts +44 -2
  170. package/src/engine/sound/sopra/runtime/BusGraph.d.ts.map +1 -1
  171. package/src/engine/sound/sopra/runtime/BusGraph.js +83 -43
  172. package/src/engine/sound/sopra/runtime/EffectChain.d.ts +96 -0
  173. package/src/engine/sound/sopra/runtime/EffectChain.d.ts.map +1 -0
  174. package/src/engine/sound/sopra/runtime/EffectChain.js +286 -0
  175. package/src/engine/sound/sopra/runtime/EffectParamOverrides.d.ts +123 -0
  176. package/src/engine/sound/sopra/runtime/EffectParamOverrides.d.ts.map +1 -0
  177. package/src/engine/sound/sopra/runtime/EffectParamOverrides.js +320 -0
  178. package/src/engine/sound/sopra/runtime/EventInstance.d.ts +55 -5
  179. package/src/engine/sound/sopra/runtime/EventInstance.d.ts.map +1 -1
  180. package/src/engine/sound/sopra/runtime/EventInstance.js +201 -26
  181. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts +2 -1
  182. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.d.ts.map +1 -1
  183. package/src/engine/sound/sopra/serialization/populateSopraSerializationRegistry.js +6 -1
  184. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts +15 -0
  185. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.d.ts.map +1 -1
  186. package/src/engine/sound/sopra/serialization/sopraSerializationHarness.js +32 -0
  187. package/src/engine/sound/sopra/util/MockAudioContext.d.ts.map +1 -1
  188. package/src/engine/sound/sopra/util/MockAudioContext.js +3 -0
  189. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts +13 -3
  190. package/src/engine/sound/sopra/util/fadeOutAndStop.d.ts.map +1 -1
  191. package/src/engine/sound/sopra/util/fadeOutAndStop.js +25 -13
  192. package/src/shade/RENDERER_CONTRACT.md +6 -3
  193. package/src/shade/device/SHADE_DEVICE_FLOOR.d.ts +24 -0
  194. package/src/shade/device/SHADE_DEVICE_FLOOR.d.ts.map +1 -0
  195. package/src/shade/device/SHADE_DEVICE_FLOOR.js +34 -0
  196. package/src/shade/device/ShadeDeviceFailure.d.ts +12 -5
  197. package/src/shade/device/ShadeDeviceFailure.d.ts.map +1 -1
  198. package/src/shade/device/ShadeDeviceFailure.js +17 -8
  199. package/src/shade/device/ShadeDeviceFailureReason.d.ts +1 -1
  200. package/src/shade/device/ShadeDeviceFailureReason.js +2 -2
  201. package/src/shade/device/shade_device_floor_unmet.d.ts +13 -0
  202. package/src/shade/device/shade_device_floor_unmet.d.ts.map +1 -0
  203. package/src/shade/device/shade_device_floor_unmet.js +32 -0
  204. package/src/shade/renderer/Renderer.d.ts +2 -0
  205. package/src/shade/renderer/Renderer.d.ts.map +1 -1
  206. package/src/shade/renderer/Renderer.js +29 -55
  207. package/src/shade/renderer/buffer/GPUBufferAllocator.d.ts.map +1 -1
  208. package/src/shade/renderer/buffer/GPUBufferAllocator.js +9 -0
  209. package/src/shade/renderer/buffer/buffer_pool_ops.d.ts +21 -12
  210. package/src/shade/renderer/buffer/buffer_pool_ops.d.ts.map +1 -1
  211. package/src/shade/renderer/buffer/buffer_pool_ops.js +18 -19
  212. package/src/shade/renderer/gpu_primitive/test/gpu_test.d.ts.map +1 -1
  213. package/src/shade/renderer/gpu_primitive/test/gpu_test.js +8 -11
  214. package/src/shade/renderer/loader/gltf/tiny-gltf.d.ts +1 -1
  215. package/src/shade/renderer/pool/TransientResourcePool.d.ts +24 -0
  216. package/src/shade/renderer/pool/TransientResourcePool.d.ts.map +1 -1
  217. package/src/shade/renderer/pool/TransientResourcePool.js +41 -10
  218. package/src/shade/renderer/shader/ComputeShader.d.ts.map +1 -1
  219. package/src/shade/renderer/shader/ComputeShader.js +18 -2
  220. package/src/shade/renderer/shader/ImageShader.d.ts.map +1 -1
  221. package/src/shade/renderer/shader/ImageShader.js +230 -218
  222. package/src/view/graphics/GraphicsContextFailureView.d.ts +1 -2
  223. package/src/view/graphics/GraphicsContextFailureView.d.ts.map +1 -1
  224. package/src/view/graphics/GraphicsContextFailureView.js +1 -2
  225. package/src/engine/network/transport/Channel.js +0 -336
  226. package/src/engine/network/transport/ReliableCommandPipeline.js +0 -335
  227. package/src/engine/network/transport/fragments/FragmentAssembler.js +0 -350
  228. package/src/engine/network/transport/fragments/FragmentRetention.js +0 -191
  229. package/src/engine/network/transport/fragments/fragment_send.js +0 -157
  230. package/src/engine/network/transport/fragments/packet_size.js +0 -107
@@ -1,219 +1,231 @@
1
- import { assert } from "../../../core/assert.js";
2
- import {
3
- rp_validate_and_rewrite_for_color_attachments
4
- } from "../../device/pipeline/rp_validate_and_rewrite_for_color_attachments.js";
5
- import { create_full_quad_pipeline_descriptor } from "./fullscreen/create_full_quad_pipeline_descriptor.js";
6
-
7
- const VALIDATION_ENABLED = true;
8
-
9
- /**
10
- * Full-screen render shader
11
- */
12
- export class ImageShader {
13
- /**
14
- * @type {ShaderDescriptor}
15
- */
16
- #descriptor
17
-
18
- /**
19
- *
20
- * @returns {ShaderDescriptor}
21
- */
22
- get descriptor() {
23
- return this.#descriptor;
24
- }
25
-
26
- /**
27
- * Optional clear values for each target
28
- * @type {number[][]}
29
- */
30
- clear_values = [];
31
-
32
- /**
33
- * @type {RenderPipelineDescriptor}
34
- */
35
- #pipeline;
36
-
37
- /**
38
- *
39
- * @returns {RenderPipelineDescriptor}
40
- */
41
- get pipeline() {
42
- return this.#pipeline
43
- }
44
-
45
- /**
46
- *
47
- * @returns {boolean}
48
- */
49
- get isImageShader() {
50
- return true;
51
- }
52
-
53
- /**
54
- *
55
- * @param {ShaderDescriptor} descriptor
56
- * @param {(ColorTargetState|{clearValue?:number[]})[]} [targets]
57
- * @param {DepthStencilState} [depthStencil]
58
- */
59
- constructor({
60
- descriptor,
61
- targets = [],
62
- depthStencil,
63
- }) {
64
-
65
- this.#descriptor = descriptor;
66
-
67
- // process optional clearValue parameter
68
- for (let i = 0; i < targets.length; i++) {
69
- const target = targets[i];
70
-
71
- const clearValue = target.clearValue;
72
- if (clearValue !== undefined) {
73
- assert.isArrayLike(clearValue, 'clearValue');
74
-
75
- let sanitizedClearValue = clearValue;
76
-
77
- // we need exactly 4 values according to spec
78
-
79
- const value_count = sanitizedClearValue.length;
80
-
81
- // TODO validate count against number of channels in the target
82
-
83
- if (value_count === 4) {
84
- // correct length
85
-
86
- } else if (value_count < 4) {
87
- // too few
88
-
89
- sanitizedClearValue = sanitizedClearValue.slice();
90
-
91
- for (let j = value_count; j < 4; j++) {
92
- // pad with 0
93
- sanitizedClearValue[j] = 0;
94
- }
95
- } else if (value_count > 4) {
96
- // too many, drop the remainder
97
-
98
- sanitizedClearValue = sanitizedClearValue.slice(0, 4);
99
-
100
- }
101
-
102
- this.clear_values[i] = sanitizedClearValue;
103
- }
104
-
105
- }
106
-
107
- this.#pipeline = create_full_quad_pipeline_descriptor({
108
- label: descriptor.label,
109
- fragment_code: descriptor.source,
110
- layout: descriptor.resources.generatePipelineLayout(GPUShaderStage.FRAGMENT),
111
- targets,
112
- depthStencil,
113
- });
114
- }
115
-
116
- // TODO simplify constructor
117
- /**
118
- * Utility constructor, matching general Shade API
119
- * @param {Object} options
120
- * @param {ShaderDescriptor} options.descriptor
121
- * @param {ColorTargetState[]} options.targets
122
- * @param {DepthStencilState} [options.depthStencil]
123
- * @returns {ImageShader}
124
- */
125
- static from({
126
- descriptor,
127
- targets,
128
- depthStencil,
129
- }) {
130
-
131
- return new ImageShader({
132
- descriptor,
133
- depthStencil,
134
- targets
135
- });
136
- }
137
-
138
- /**
139
- * Note the absence of depth target, image shader is a full-screen pass, so depth is not used.
140
- *
141
- * @param {ShadeGPUCommandContext} encoder
142
- * @param {Object} [bindings] data bindings. It's optional, but in 99.99% of use cases you will want to specify this.
143
- * @param {GPURenderPassColorAttachment[]} [colorAttachments] where to draw, these are fragment shader outputs.
144
- * @param {GPURenderPassDepthStencilAttachment} [depthStencilAttachment]
145
- * @param {GPUTextureFormat[]} [color_formats] optional, if specified will be used to rewrite the pipeline for compatibility
146
- * @param {number[]} [viewport] [x0, y0, width, height ]
147
- */
148
- draw({
149
- encoder,
150
- bindings = {},
151
- colorAttachments = [],
152
- depthStencilAttachment,
153
- color_formats,
154
- viewport
155
- }) {
156
-
157
- assert.defined(encoder, 'encoder');
158
-
159
- // TODO I hate the separate color_formats parameter. Make a wrapper around GPURenderPassColorAttachment instead, and have a pointer to the GPUTextureContext in there so we can access the texture format
160
-
161
- const shader_descriptor = this.#descriptor;
162
-
163
- if (VALIDATION_ENABLED) {
164
- shader_descriptor.validate_against_device(encoder.device);
165
- }
166
-
167
- const resolved_bindings = shader_descriptor.resources.generateBindings(bindings, encoder);
168
-
169
- const immediate = encoder.writeImmediate(shader_descriptor.resources, bindings);
170
-
171
- encoder.pushDebugGroup(shader_descriptor.label);
172
-
173
- let pipeline = this.#pipeline;
174
-
175
- if (color_formats !== undefined) {
176
- // potentially rewrite the pipeline to be compatible with output formats
177
- // example: rgba8unorm -> rgba16float
178
- pipeline = rp_validate_and_rewrite_for_color_attachments(pipeline, color_formats);
179
- }
180
-
181
- const pass = encoder.constructRenderPass({
182
- pipeline,
183
- bindings: resolved_bindings,
184
- colorAttachments,
185
- depthStencilAttachment,
186
- immediate
187
- });
188
-
189
- if (viewport !== undefined) {
190
- const _x = viewport[0];
191
- const _y = viewport[1];
192
- const _width = viewport[2];
193
- const _height = viewport[3];
194
-
195
- assert.greaterThanOrEqual(_width, 0, 'viewport width must be positive');
196
- assert.greaterThanOrEqual(_height, 0, 'viewport width must be positive');
197
-
198
- assert.notNaN(_x, '_x');
199
- assert.notNaN(_y, '_y');
200
-
201
-
202
- pass.setViewport(
203
- _x,
204
- _y,
205
- _width,
206
- _height,
207
- 0,
208
- 1
209
- );
210
- }
211
-
212
- pass.draw(3);
213
-
214
- pass.end();
215
-
216
- encoder.popDebugGroup();
217
-
218
- }
1
+ import { assert } from "../../../core/assert.js";
2
+ import {
3
+ rp_validate_and_rewrite_for_color_attachments
4
+ } from "../../device/pipeline/rp_validate_and_rewrite_for_color_attachments.js";
5
+ import { create_full_quad_pipeline_descriptor } from "./fullscreen/create_full_quad_pipeline_descriptor.js";
6
+
7
+ const VALIDATION_ENABLED = true;
8
+
9
+ /**
10
+ * Full-screen render shader
11
+ */
12
+ export class ImageShader {
13
+ /**
14
+ * @type {ShaderDescriptor}
15
+ */
16
+ #descriptor
17
+
18
+ /**
19
+ *
20
+ * @returns {ShaderDescriptor}
21
+ */
22
+ get descriptor() {
23
+ return this.#descriptor;
24
+ }
25
+
26
+ /**
27
+ * Optional clear values for each target
28
+ * @type {number[][]}
29
+ */
30
+ clear_values = [];
31
+
32
+ /**
33
+ * @type {RenderPipelineDescriptor}
34
+ */
35
+ #pipeline;
36
+
37
+ /**
38
+ * The device this shader last passed {@link ShaderDescriptor#validate_against_device} on, or null:
39
+ * one check per device rather than one per draw. See `ComputeShader`'s field of the same name.
40
+ *
41
+ * @type {GPUDevice|null}
42
+ */
43
+ #validated_device = null;
44
+
45
+ /**
46
+ *
47
+ * @returns {RenderPipelineDescriptor}
48
+ */
49
+ get pipeline() {
50
+ return this.#pipeline
51
+ }
52
+
53
+ /**
54
+ *
55
+ * @returns {boolean}
56
+ */
57
+ get isImageShader() {
58
+ return true;
59
+ }
60
+
61
+ /**
62
+ *
63
+ * @param {ShaderDescriptor} descriptor
64
+ * @param {(ColorTargetState|{clearValue?:number[]})[]} [targets]
65
+ * @param {DepthStencilState} [depthStencil]
66
+ */
67
+ constructor({
68
+ descriptor,
69
+ targets = [],
70
+ depthStencil,
71
+ }) {
72
+
73
+ this.#descriptor = descriptor;
74
+
75
+ // process optional clearValue parameter
76
+ for (let i = 0; i < targets.length; i++) {
77
+ const target = targets[i];
78
+
79
+ const clearValue = target.clearValue;
80
+ if (clearValue !== undefined) {
81
+ assert.isArrayLike(clearValue, 'clearValue');
82
+
83
+ let sanitizedClearValue = clearValue;
84
+
85
+ // we need exactly 4 values according to spec
86
+
87
+ const value_count = sanitizedClearValue.length;
88
+
89
+ // TODO validate count against number of channels in the target
90
+
91
+ if (value_count === 4) {
92
+ // correct length
93
+
94
+ } else if (value_count < 4) {
95
+ // too few
96
+
97
+ sanitizedClearValue = sanitizedClearValue.slice();
98
+
99
+ for (let j = value_count; j < 4; j++) {
100
+ // pad with 0
101
+ sanitizedClearValue[j] = 0;
102
+ }
103
+ } else if (value_count > 4) {
104
+ // too many, drop the remainder
105
+
106
+ sanitizedClearValue = sanitizedClearValue.slice(0, 4);
107
+
108
+ }
109
+
110
+ this.clear_values[i] = sanitizedClearValue;
111
+ }
112
+
113
+ }
114
+
115
+ this.#pipeline = create_full_quad_pipeline_descriptor({
116
+ label: descriptor.label,
117
+ fragment_code: descriptor.source,
118
+ layout: descriptor.resources.generatePipelineLayout(GPUShaderStage.FRAGMENT),
119
+ targets,
120
+ depthStencil,
121
+ });
122
+ }
123
+
124
+ // TODO simplify constructor
125
+ /**
126
+ * Utility constructor, matching general Shade API
127
+ * @param {Object} options
128
+ * @param {ShaderDescriptor} options.descriptor
129
+ * @param {ColorTargetState[]} options.targets
130
+ * @param {DepthStencilState} [options.depthStencil]
131
+ * @returns {ImageShader}
132
+ */
133
+ static from({
134
+ descriptor,
135
+ targets,
136
+ depthStencil,
137
+ }) {
138
+
139
+ return new ImageShader({
140
+ descriptor,
141
+ depthStencil,
142
+ targets
143
+ });
144
+ }
145
+
146
+ /**
147
+ * Note the absence of depth target, image shader is a full-screen pass, so depth is not used.
148
+ *
149
+ * @param {ShadeGPUCommandContext} encoder
150
+ * @param {Object} [bindings] data bindings. It's optional, but in 99.99% of use cases you will want to specify this.
151
+ * @param {GPURenderPassColorAttachment[]} [colorAttachments] where to draw, these are fragment shader outputs.
152
+ * @param {GPURenderPassDepthStencilAttachment} [depthStencilAttachment]
153
+ * @param {GPUTextureFormat[]} [color_formats] optional, if specified will be used to rewrite the pipeline for compatibility
154
+ * @param {number[]} [viewport] [x0, y0, width, height ]
155
+ */
156
+ draw({
157
+ encoder,
158
+ bindings = {},
159
+ colorAttachments = [],
160
+ depthStencilAttachment,
161
+ color_formats,
162
+ viewport
163
+ }) {
164
+
165
+ assert.defined(encoder, 'encoder');
166
+
167
+ // TODO I hate the separate color_formats parameter. Make a wrapper around GPURenderPassColorAttachment instead, and have a pointer to the GPUTextureContext in there so we can access the texture format
168
+
169
+ const shader_descriptor = this.#descriptor;
170
+
171
+ const device = encoder.device;
172
+
173
+ if (VALIDATION_ENABLED && device !== this.#validated_device) {
174
+ shader_descriptor.validate_against_device(device);
175
+
176
+ this.#validated_device = device;
177
+ }
178
+
179
+ const resolved_bindings = shader_descriptor.resources.generateBindings(bindings, encoder);
180
+
181
+ const immediate = encoder.writeImmediate(shader_descriptor.resources, bindings);
182
+
183
+ encoder.pushDebugGroup(shader_descriptor.label);
184
+
185
+ let pipeline = this.#pipeline;
186
+
187
+ if (color_formats !== undefined) {
188
+ // potentially rewrite the pipeline to be compatible with output formats
189
+ // example: rgba8unorm -> rgba16float
190
+ pipeline = rp_validate_and_rewrite_for_color_attachments(pipeline, color_formats);
191
+ }
192
+
193
+ const pass = encoder.constructRenderPass({
194
+ pipeline,
195
+ bindings: resolved_bindings,
196
+ colorAttachments,
197
+ depthStencilAttachment,
198
+ immediate
199
+ });
200
+
201
+ if (viewport !== undefined) {
202
+ const _x = viewport[0];
203
+ const _y = viewport[1];
204
+ const _width = viewport[2];
205
+ const _height = viewport[3];
206
+
207
+ assert.greaterThanOrEqual(_width, 0, 'viewport width must be positive');
208
+ assert.greaterThanOrEqual(_height, 0, 'viewport width must be positive');
209
+
210
+ assert.notNaN(_x, '_x');
211
+ assert.notNaN(_y, '_y');
212
+
213
+
214
+ pass.setViewport(
215
+ _x,
216
+ _y,
217
+ _width,
218
+ _height,
219
+ 0,
220
+ 1
221
+ );
222
+ }
223
+
224
+ pass.draw(3);
225
+
226
+ pass.end();
227
+
228
+ encoder.popDebugGroup();
229
+
230
+ }
219
231
  }
@@ -1,6 +1,5 @@
1
1
  /**
2
- * Shown when WebGL context recovery has been abandoned, so the player sees an explanation instead of a
3
- * black canvas.
2
+ * Shown when there will be no rendering, so the person sees an explanation instead of a black canvas.
4
3
  *
5
4
  * Strings are supplied by the caller. They default to English because this view exists precisely for the
6
5
  * case where the renderer is dead, which is not a good moment to depend on the localization pipeline
@@ -1 +1 @@
1
- {"version":3,"file":"GraphicsContextFailureView.d.ts","sourceRoot":"","sources":["../../../../src/view/graphics/GraphicsContextFailureView.js"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH;IACI;;;;;;OAMG;IACH;QAL4B,KAAK,GAAtB,MAAM;QACW,IAAI,GAArB,MAAM;QACW,YAAY,GAA7B,MAAM;QACa,MAAM;OAyDnC;CACJ;sBA3EqB,0BAA0B"}
1
+ {"version":3,"file":"GraphicsContextFailureView.d.ts","sourceRoot":"","sources":["../../../../src/view/graphics/GraphicsContextFailureView.js"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH;IACI;;;;;;OAMG;IACH;QAL4B,KAAK,GAAtB,MAAM;QACW,IAAI,GAArB,MAAM;QACW,YAAY,GAA7B,MAAM;QACa,MAAM;OAyDnC;CACJ;sBA1EqB,0BAA0B"}
@@ -3,8 +3,7 @@ import EmptyView from "../elements/EmptyView.js";
3
3
  import LabelView from "../common/LabelView.js";
4
4
 
5
5
  /**
6
- * Shown when WebGL context recovery has been abandoned, so the player sees an explanation instead of a
7
- * black canvas.
6
+ * Shown when there will be no rendering, so the person sees an explanation instead of a black canvas.
8
7
  *
9
8
  * Strings are supplied by the caller. They default to English because this view exists precisely for the
10
9
  * case where the renderer is dead, which is not a good moment to depend on the localization pipeline