#N canvas 506 110 1450 697 12;
#X obj 21 209 GEMglLoadIdentity;
#X obj 21 174 gemhead;
#X obj 21 255 translateXYZ;
#X obj 21 302 scaleXYZ;
#X obj 21 348 rotateXYZ;
#X obj 21 371 gemlist_matrix;
#X floatatom 48 232 5 0 0 0 - - - 0;
#X floatatom 87 232 5 0 0 0 - - - 0;
#X floatatom 126 232 5 0 0 0 - - - 0;
#X floatatom 38 278 5 0 0 0 - - - 0;
#X floatatom 77 279 5 0 0 0 - - - 0;
#X floatatom 116 279 5 0 0 0 - - - 0;
#X floatatom 41 325 5 0 0 0 - - - 0;
#X floatatom 80 326 5 0 0 0 - - - 0;
#X floatatom 119 327 5 0 0 0 - - - 0;
#X obj 128 399 print;
#X obj 22 427 list split 4;
#X obj 22 452 list split 4;
#X obj 21 476 list split 4;
#X obj 21 501 list split 4;
#X listbox 119 429 20 0 0 0 - - - 0;
#X listbox 118 455 20 0 0 0 - - - 0;
#X listbox 118 480 20 0 0 0 - - - 0;
#X listbox 118 504 20 0 0 0 - - - 0;
#X obj 288 175 gemhead;
#X obj 288 208 gemlist_matrix;
#X obj 394 242 print;
#X obj 288 430 list split 4;
#X obj 288 455 list split 4;
#X obj 287 479 list split 4;
#X obj 287 504 list split 4;
#X listbox 385 432 20 0 0 0 - - - 0;
#X listbox 384 458 20 0 0 0 - - - 0;
#X listbox 384 483 20 0 0 0 - - - 0;
#X listbox 384 507 20 0 0 0 - - - 0;
#X obj 543 178 gemhead;
#X obj 543 259 translateXYZ;
#X obj 543 306 scaleXYZ;
#X obj 543 352 rotateXYZ;
#X obj 543 375 gemlist_matrix;
#X floatatom 570 236 5 0 0 0 - - - 0;
#X floatatom 609 236 5 0 0 0 - - - 0;
#X floatatom 648 236 5 0 0 0 - - - 0;
#X floatatom 560 282 5 0 0 0 - - - 0;
#X floatatom 599 283 5 0 0 0 - - - 0;
#X floatatom 638 283 5 0 0 0 - - - 0;
#X floatatom 563 329 5 0 0 0 - - - 0;
#X floatatom 602 330 5 0 0 0 - - - 0;
#X floatatom 641 331 5 0 0 0 - - - 0;
#X obj 650 403 print;
#X obj 544 431 list split 4;
#X obj 544 456 list split 4;
#X obj 543 480 list split 4;
#X obj 543 505 list split 4;
#X listbox 641 433 20 0 0 0 - - - 0;
#X listbox 640 459 20 0 0 0 - - - 0;
#X listbox 640 484 20 0 0 0 - - - 0;
#X listbox 640 508 20 0 0 0 - - - 0;
#N canvas 115 312 498 411 build_ortho 0;
#X obj 28 19 inlet;
#X text 89 22 left \, right \, bottom \, top \, nearZ \, farZ;
#X msg 28 97 \$2 \$1;
#X obj 60 153 -;
#X text 95 154 width;
#X obj 28 154 +;
#X msg 60 178 2 \$1;
#X obj 60 202 /;
#X obj 28 129 t a a;
#X obj 28 202 /;
#X obj 28 65 t a a a;
#X obj 179 155 -;
#X obj 147 156 +;
#X msg 179 180 2 \$1;
#X obj 179 204 /;
#X obj 147 131 t a a;
#X obj 147 204 /;
#X obj 298 156 -;
#X obj 266 157 +;
#X obj 298 205 /;
#X obj 266 132 t a a;
#X obj 266 205 /;
#X msg 147 99 \$4 \$3;
#X text 207 156 height;
#X msg 266 100 \$6 \$5;
#X text 333 157 depth;
#X obj 28 268 pack f f f f f f, f 43;
#X obj 28 335 outlet;
#X obj 28 236 * -1;
#X obj 147 237 * -1;
#X obj 266 237 * -1;
#X msg 28 301 \$2 0 0 0 0 \$4 0 0 0 0 \$6 0 \$1 \$3 \$5 1;
#X msg 298 181 -2 \$1;
#X connect 0 0 10 0;
#X connect 2 0 8 0;
#X connect 3 0 6 0;
#X connect 3 0 9 1;
#X connect 5 0 9 0;
#X connect 6 0 7 0;
#X connect 7 0 26 1;
#X connect 8 0 5 0;
#X connect 8 1 3 0;
#X connect 9 0 28 0;
#X connect 10 0 2 0;
#X connect 10 1 22 0;
#X connect 10 2 24 0;
#X connect 11 0 13 0;
#X connect 11 0 16 1;
#X connect 12 0 16 0;
#X connect 13 0 14 0;
#X connect 14 0 26 3;
#X connect 15 0 12 0;
#X connect 15 1 11 0;
#X connect 16 0 29 0;
#X connect 17 0 32 0;
#X connect 17 0 21 1;
#X connect 18 0 21 0;
#X connect 19 0 26 5;
#X connect 20 0 18 0;
#X connect 20 1 17 0;
#X connect 21 0 30 0;
#X connect 22 0 15 0;
#X connect 24 0 20 0;
#X connect 26 0 31 0;
#X connect 28 0 26 0;
#X connect 29 0 26 2;
#X connect 30 0 26 4;
#X connect 31 0 27 0;
#X connect 32 0 19 0;
#X restore 843 220 pd build_ortho;
#X text 953 195 left \, right \, bottom \, top \, nearZ \, farZ;
#X obj 853 253 list split 4;
#X obj 853 278 list split 4;
#X obj 852 302 list split 4;
#X obj 852 327 list split 4;
#X listbox 950 255 20 0 0 0 - - - 0;
#X listbox 949 281 20 0 0 0 - - - 0;
#X listbox 949 306 20 0 0 0 - - - 0;
#X listbox 949 330 20 0 0 0 - - - 0;
#X text 19 140 Model Matrix :;
#X text 287 137 View Matrix :;
#X text 541 138 Model * View Matrix;
#X text 839 145 Projection Matrix;
#X msg 843 193 -4 4 -4 4 0 20;
#X text 853 399 fovY (field of view) \, aspect ratio \, nearZ \, farZ;
#X text 840 378 perspective projection :;
#X text 838 162 orthographic projection :;
#X obj 1233 413 /;
#X obj 1232 272 r __gem;
#X obj 1232 297 route dimen;
#X obj 1232 322 /;
#X floatatom 1233 440 5 0 0 0 - - - 0;
#X obj 843 515 list split 4;
#X obj 843 540 list split 4;
#X obj 842 564 list split 4;
#X obj 842 589 list split 4;
#X listbox 940 517 20 0 0 0 - - - 0;
#X listbox 939 543 20 0 0 0 - - - 0;
#X listbox 939 568 20 0 0 0 - - - 0;
#X listbox 939 592 20 0 0 0 - - - 0;
#X floatatom 1232 351 5 0 0 0 - - - 0;
#X text 1234 240 tips :;
#X obj 27 551 list prepend modelMatrix;
#X obj 287 551 list prepend viewMatrix;
#X obj 814 622 list prepend projMatrix;
#X obj 27 574 list trim;
#X obj 287 574 list trim;
#X obj 814 646 list trim;
#X obj 27 598 s shader_matrix;
#X obj 287 596 s shader_matrix;
#X obj 814 670 s shader_matrix;
#X text 27 35 The model matrix combines the geometry transformations. It can be computed with a specific library \, or with standard openGL objects., f 30;
#N canvas 234 350 511 439 build_perspective 0;
#X obj 37 24 inlet;
#X obj 37 108 * 0.5;
#X obj 37 132 tan;
#X msg 37 83 \$1;
#X msg 37 156 1 \$1;
#X obj 37 181 /;
#X obj 323 190 -;
#X obj 69 234 pack f f;
#X msg 122 210 \$2;
#X msg 183 167 \$3 \$4;
#X obj 183 197 +;
#X msg 261 160 \$3 \$4;
#X obj 261 190 *;
#X obj 37 209 t f f;
#X msg 37 314 \$2 0 0 0 0 \$1 0 0 0 0 \$3 -1 0 0 \$4 0;
#X obj 37 52 t a a a a a, f 35;
#X obj 37 284 pack f f f f, f 32;
#X obj 37 342 outlet;
#X obj 69 259 /;
#X obj 183 240 /;
#X obj 261 217 * 2;
#X obj 261 243 /;
#X msg 323 165 \$3 \$4;
#X connect 0 0 15 0;
#X connect 1 0 2 0;
#X connect 2 0 4 0;
#X connect 3 0 1 0;
#X connect 4 0 5 0;
#X connect 5 0 13 0;
#X connect 6 0 19 1;
#X connect 6 0 21 1;
#X connect 7 0 18 0;
#X connect 8 0 7 1;
#X connect 9 0 10 0;
#X connect 10 0 19 0;
#X connect 11 0 12 0;
#X connect 12 0 20 0;
#X connect 13 0 16 0;
#X connect 13 1 7 0;
#X connect 14 0 17 0;
#X connect 15 0 3 0;
#X connect 15 1 8 0;
#X connect 15 2 9 0;
#X connect 15 3 11 0;
#X connect 15 4 22 0;
#X connect 16 0 14 0;
#X connect 18 0 16 1;
#X connect 19 0 16 2;
#X connect 20 0 21 0;
#X connect 21 0 16 3;
#X connect 22 0 6 0;
#X restore 843 484 pd build_perspective;
#X text 274 38 The view matrix represents the camera position and orientation. It can be set via a message to the gemwin object, f 31;
#X text 535 34 Since the shader needs only the multiplication of the model matrix and the view matrix \, you can get this combination directly : (not used in this example), f 35;
#N canvas 130 82 1016 644 shader 0;
#X obj 53 27 gemhead;
#X obj 65 164 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000;
#X obj 411 94 bng 18 250 50 0 empty empty empty 0 -9 0 10 #fcfcfc #000000 #000000;
#X msg 438 110 modelMatrix 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1;
#X msg 438 137 viewMatrix 1 0 0 0 0 1 0 0 0 0 1 0 0 0 -4 1;
#X msg 438 164 projMatrix 1.8 0 0 0 0 1.8 0 0 0 0 -1 -1 0 0 -0.2 0;
#X obj 53 79 translateXYZ;
#X floatatom 76 53 5 0 0 0 - - - 0;
#X obj 133 150 r shader_matrix;
#X text 119 52 <- this is useless since the shader can't access the transformation matrix. See next patch for more explanations, f 117;
#X msg 229 283 program \$1;
#X obj 229 432 print vb;
#X obj 197 408 t a a;
#X obj 669 306 table \$0_position 9;
#X obj 666 384 loadbang;
#X obj 666 432 s \$0_position;
#X msg 666 409 0 -0.8 -0.8 0 0 0.8 0 0.8 -0.8 0;
#X obj 665 466 loadbang;
#X obj 197 312 \$0;
#X floatatom 243 227 5 0 0 0 - - - 0;
#X obj 669 328 table \$0_normal 9;
#X obj 665 513 s \$0_normal;
#X obj 53 501 gemvertexbuffer \; resize 3 \; draw tri;
#X msg 665 490 0 0 0 1 0 0 1 0 0 1 0 0 1;
#X obj 197 257 t b f;
#X obj 670 351 table \$0_color 9;
#X obj 664 540 loadbang;
#X obj 664 587 s \$0_color;
#X msg 664 564 0 1 0 0 0 1 0 0 0 1;
#X obj 53 189 glsl shader/03.matrix;
#X msg 221 380 print_attributes;
#X msg 197 336 attribute position \$1_position \, attribute normal \$1_normal \, attribute color \$1_color;
#X obj 329 465 loadbang;
#X obj 329 565 textfile;
#X obj 349 518 textfile;
#X msg 391 566 print;
#X msg 411 518 print;
#X msg 349 495 read shader/03.matrix.vert cr;
#X msg 329 541 read shader/03.matrix.frag cr;
#X connect 0 0 6 0;
#X connect 1 0 29 0;
#X connect 2 0 3 0;
#X connect 2 0 5 0;
#X connect 2 0 4 0;
#X connect 3 0 29 1;
#X connect 4 0 29 1;
#X connect 5 0 29 1;
#X connect 6 0 29 0;
#X connect 7 0 6 1;
#X connect 8 0 29 1;
#X connect 10 0 22 0;
#X connect 12 0 22 0;
#X connect 12 1 11 0;
#X connect 14 0 16 0;
#X connect 16 0 15 0;
#X connect 17 0 23 0;
#X connect 18 0 31 0;
#X connect 23 0 21 0;
#X connect 24 0 18 0;
#X connect 24 1 10 0;
#X connect 26 0 28 0;
#X connect 28 0 27 0;
#X connect 29 0 22 0;
#X connect 29 1 2 0;
#X connect 29 1 19 0;
#X connect 29 1 24 0;
#X connect 30 0 12 0;
#X connect 31 0 12 0;
#X connect 32 0 38 0;
#X connect 32 0 37 0;
#X connect 35 0 33 0;
#X connect 36 0 34 0;
#X connect 37 0 34 0;
#X connect 38 0 33 0;
#X restore 1228 514 pd shader;
#X obj 1228 550 _gemwin;
#X text 27 8 This patch creates the various matrices used by the rendering pipeline, f 103;
#X text 834 28 The projection matrix transforms 3D coordinates from view space to clip space \, defining what is visible to the camera. It determines how objects are projected onto the 2D screen \, either with perspective effects (objects appear smaller with distance) or orthographically (maintaining consistent size regardless of distance). it represents the camera;
#X msg 843 427 1.57 1 0 20;
#X text 948 429 Gem wild angle;
#X text 1264 321 real gemwin aspect ratio;
#X msg 870 457 0.5 1 0 20;
#X msg 1233 385 3.14159 4;
#X text 1282 412 45° fov (this is a wild angle), f 21;
#X floatatom 1139 586 5 0 0 0 - - - 0;
#X msg 1138 617 \$1 1 1 100;
#X msg 1169 481 1.57 1 1 100;
#X text 959 460 smaller vision angle;
#X connect 0 0 2 0;
#X connect 1 0 0 0;
#X connect 2 0 3 0;
#X connect 3 0 4 0;
#X connect 4 0 5 0;
#X connect 5 1 16 0;
#X connect 5 1 91 0;
#X connect 6 0 2 1;
#X connect 7 0 2 2;
#X connect 8 0 2 3;
#X connect 9 0 3 1;
#X connect 10 0 3 2;
#X connect 11 0 3 3;
#X connect 12 0 4 1;
#X connect 13 0 4 2;
#X connect 14 0 4 3;
#X connect 16 0 20 0;
#X connect 16 1 17 0;
#X connect 17 0 21 0;
#X connect 17 1 18 0;
#X connect 18 0 22 0;
#X connect 18 1 19 0;
#X connect 19 0 23 0;
#X connect 24 0 25 0;
#X connect 25 1 27 0;
#X connect 25 1 92 0;
#X connect 27 0 31 0;
#X connect 27 1 28 0;
#X connect 28 0 32 0;
#X connect 28 1 29 0;
#X connect 29 0 33 0;
#X connect 29 1 30 0;
#X connect 30 0 34 0;
#X connect 35 0 36 0;
#X connect 36 0 37 0;
#X connect 37 0 38 0;
#X connect 38 0 39 0;
#X connect 39 1 50 0;
#X connect 40 0 36 1;
#X connect 41 0 36 2;
#X connect 42 0 36 3;
#X connect 43 0 37 1;
#X connect 44 0 37 2;
#X connect 45 0 37 3;
#X connect 46 0 38 1;
#X connect 47 0 38 2;
#X connect 48 0 38 3;
#X connect 50 0 54 0;
#X connect 50 1 51 0;
#X connect 51 0 55 0;
#X connect 51 1 52 0;
#X connect 52 0 56 0;
#X connect 52 1 53 0;
#X connect 53 0 57 0;
#X connect 58 0 60 0;
#X connect 58 0 93 0;
#X connect 60 0 64 0;
#X connect 60 1 61 0;
#X connect 61 0 65 0;
#X connect 61 1 62 0;
#X connect 62 0 66 0;
#X connect 62 1 63 0;
#X connect 63 0 67 0;
#X connect 72 0 58 0;
#X connect 76 0 80 0;
#X connect 77 0 78 0;
#X connect 78 0 79 0;
#X connect 79 0 89 0;
#X connect 81 0 85 0;
#X connect 81 1 82 0;
#X connect 82 0 86 0;
#X connect 82 1 83 0;
#X connect 83 0 87 0;
#X connect 83 1 84 0;
#X connect 84 0 88 0;
#X connect 91 0 94 0;
#X connect 92 0 95 0;
#X connect 93 0 96 0;
#X connect 94 0 97 0;
#X connect 95 0 98 0;
#X connect 96 0 99 0;
#X connect 101 0 81 0;
#X connect 101 0 93 0;
#X connect 108 0 101 0;
#X connect 111 0 101 0;
#X connect 112 0 76 0;
#X connect 114 0 115 0;
#X connect 115 0 101 0;
#X connect 116 0 101 0;
