@@ -100,6 +100,8 @@ showErrorMessage = do
100100 getElementById " error" (toNonElementParentNode d) >>= traverse_
101101 (setAttribute " style" " display:auto;" )
102102
103+ foreign import uggggggh :: Float32Array -> Float32Array
104+
103105freshIdentityMatrix :: forall t20 . TypedArray t20 Float32 => Effect (ArrayView t20 )
104106freshIdentityMatrix = fromArray $ hackyFloatConv
105107 [ 1.0
@@ -120,6 +122,26 @@ freshIdentityMatrix = fromArray $ hackyFloatConv
120122 , 1.0
121123 ]
122124
125+ freshTranslateMatrix :: forall t20 . TypedArray t20 Float32 => Number -> Number -> Number -> Effect (ArrayView t20 )
126+ freshTranslateMatrix x y z = fromArray $ hackyFloatConv
127+ [ 1.0
128+ , 0.0
129+ , 0.0
130+ , x
131+ , 0.0
132+ , 1.0
133+ , 0.0
134+ , y
135+ , 0.0
136+ , 0.0
137+ , 1.0
138+ , z
139+ , 0.0
140+ , 0.0
141+ , 0.0
142+ , 1.0
143+ ]
144+
123145main :: Effect Unit
124146main = do
125147 startsAt <- getTime <$> now
@@ -266,6 +288,25 @@ main = do
266288 rotateXResultData :: Float32Array <- freshIdentityMatrix
267289 rotateYData :: Float32Array <- freshIdentityMatrix
268290 rotateYResultData :: Float32Array <- freshIdentityMatrix
291+ translateZData :: Float32Array <- map identity $ freshTranslateMatrix 0.0 0.0 (-5.0 )
292+ translateZResultData :: Float32Array <- freshIdentityMatrix
293+ let
294+ fovy = pi / 2.0
295+ aspect = 1.0
296+ f = 1.0 / Math .tan (fovy / 2.0 )
297+ near = 0.1
298+ far = 10.0
299+ nf = 1.0 / (near - far)
300+ perspectiveData :: Float32Array <- map identity $ fromArray $ hackyFloatConv [f / aspect, 0.0 , 0.0 , 0.0 , 0.0 , f, 0.0 , 0.0 ,
301+ 0.0 ,
302+ 0.0 ,
303+ far * nf,
304+ (-1.0 ),
305+ 0.0 ,
306+ 0.0 ,
307+ far * near * nf,
308+ 0.0 ]
309+ perspectiveResultData :: Float32Array <- freshIdentityMatrix
269310 -- 📇 Index Buffer Data
270311 indices :: Uint16Array <- fromArray $ hackyIntConv
271312 [
@@ -381,6 +422,14 @@ main = do
381422 (GPUBufferUsage .storage )
382423 rotateYResultBuffer <- liftEffect $ createBufferF rotateYResultData
383424 (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc)
425+ translateZBuffer <- liftEffect $ createBufferF translateZData
426+ (GPUBufferUsage .storage)
427+ translateZResultBuffer <- liftEffect $ createBufferF translateZResultData
428+ (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc)
429+ perspectiveBuffer <- liftEffect $ createBufferF perspectiveData
430+ (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc)
431+ perspectiveResultBuffer <- liftEffect $ createBufferF perspectiveResultData
432+ (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc)
384433 -- 🖍️ Shaders
385434 let
386435 resetDesc = x
@@ -732,6 +781,28 @@ fn main(@location(0) inColor: vec3<f32>) -> @location(0) vec4<f32> {
732781 (x { buffer: rotateYResultBuffer } :: GPUBufferBinding )
733782 ]
734783 }
784+ translateZResultIOComputeBindGroup <- liftEffect $ createBindGroup device $ x
785+ { layout: matrixMultiplicationComputeBindGroupLayout
786+ , entries:
787+ [ gpuBindGroupEntry 0
788+ (x { buffer: translateZBuffer } :: GPUBufferBinding )
789+ , gpuBindGroupEntry 1
790+ (x { buffer: rotateYResultBuffer } :: GPUBufferBinding )
791+ , gpuBindGroupEntry 2
792+ (x { buffer: translateZResultBuffer } :: GPUBufferBinding )
793+ ]
794+ }
795+ perspectiveResultIOComputeBindGroup <- liftEffect $ createBindGroup device $ x
796+ { layout: matrixMultiplicationComputeBindGroupLayout
797+ , entries:
798+ [ gpuBindGroupEntry 0
799+ (x { buffer: perspectiveBuffer } :: GPUBufferBinding )
800+ , gpuBindGroupEntry 1
801+ (x { buffer: translateZResultBuffer } :: GPUBufferBinding )
802+ , gpuBindGroupEntry 2
803+ (x { buffer: perspectiveResultBuffer } :: GPUBufferBinding )
804+ ]
805+ }
735806 timeComputeBindGroup <- liftEffect $ createBindGroup device $ x
736807 { layout: timeBindGroupLayout
737808 , entries:
@@ -968,6 +1039,23 @@ fn main(@location(0) inColor: vec3<f32>) -> @location(0) vec4<f32> {
9681039 GPUComputePassEncoder .dispatchWorkgroupsXY rotateYMulPassEncoder 4 4
9691040 GPUComputePassEncoder .end rotateYMulPassEncoder
9701041 -- -------------------
1042+ translateZMulPassEncoder <- beginComputePass commandEncoder (x {})
1043+ GPUComputePassEncoder .setPipeline translateZMulPassEncoder
1044+ matrixMultiplicationPipeline
1045+ GPUComputePassEncoder .setBindGroup translateZMulPassEncoder 0
1046+ translateZResultIOComputeBindGroup
1047+ GPUComputePassEncoder .dispatchWorkgroupsXY translateZMulPassEncoder 4 4
1048+ GPUComputePassEncoder .end translateZMulPassEncoder
1049+ -- -------------------
1050+ perspectiveMulPassEncoder <- beginComputePass commandEncoder (x {})
1051+ GPUComputePassEncoder .setPipeline perspectiveMulPassEncoder
1052+ matrixMultiplicationPipeline
1053+ GPUComputePassEncoder .setBindGroup perspectiveMulPassEncoder 0
1054+ perspectiveResultIOComputeBindGroup
1055+ GPUComputePassEncoder .dispatchWorkgroupsXY perspectiveMulPassEncoder 4 4
1056+ GPUComputePassEncoder .end perspectiveMulPassEncoder
1057+
1058+
9711059 -- xTransTestPassEncoder <- beginComputePass commandEncoder (x {})
9721060 -- GPUComputePassEncoder.setPipeline xTransTestPassEncoder
9731061 -- xTransTestPipeline
@@ -976,7 +1064,7 @@ fn main(@location(0) inColor: vec3<f32>) -> @location(0) vec4<f32> {
9761064 -- GPUComputePassEncoder.dispatchWorkgroupsX xTransTestPassEncoder 1
9771065 -- GPUComputePassEncoder.end xTransTestPassEncoder
9781066 --
979- copyBufferToBuffer commandEncoder rotateYResultBuffer 0 uniformBuffer 0
1067+ copyBufferToBuffer commandEncoder perspectiveResultBuffer 0 uniformBuffer 0
9801068 (4 * 16 )
9811069 -- 🖌️ Encode drawing commands
9821070 let
0 commit comments