Skip to content

Commit 81637c9

Browse files
author
Mike Solomon
committed
Adds projection matrix
1 parent 11cd010 commit 81637c9

File tree

2 files changed

+109
-1
lines changed

2 files changed

+109
-1
lines changed

sandbox/Sandbox.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
export const uggggggh = (f32) => {
2+
const out = new Float32Array(16);
3+
out[0] = out[0];
4+
out[4] = out[1];
5+
out[8] = out[2];
6+
out[12] = out[3];
7+
out[1] = out[4];
8+
out[5] = out[5];
9+
out[9] = out[6];
10+
out[13] = out[7];
11+
out[2] = out[8];
12+
out[6] = out[9];
13+
out[10] = out[10];
14+
out[14] = out[11];
15+
out[3] = out[12];
16+
out[7] = out[13];
17+
out[11] = out[14];
18+
out[15] = out[15];
19+
return out;
20+
}

sandbox/Sandbox.purs

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
103105
freshIdentityMatrix :: forall t20. TypedArray t20 Float32 => Effect (ArrayView t20)
104106
freshIdentityMatrix = 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+
123145
main :: Effect Unit
124146
main = 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

Comments
 (0)