From 6e36d7596cd3f72804bc8954c2841f0291a7c873 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Fri, 18 Feb 2022 15:58:19 +0100 Subject: [PATCH] Obj parser, plane is loading correctly with texcoords etc! now OS defines the bitmap layout and format --- assets/cube.obj | 48 ++++ assets/cube.png | Bin 0 -> 545 bytes assets/f22.obj | 707 ++++++++++++++++++++++++++++++++++++++++++++++++ main.cpp | 97 +++++-- objparser.cpp | 240 ++++++++++++++++ objparser.h | 14 + platform.cpp | 61 ++++- platform.h | 3 +- 8 files changed, 1137 insertions(+), 33 deletions(-) create mode 100644 assets/cube.obj create mode 100644 assets/cube.png create mode 100644 assets/f22.obj create mode 100644 objparser.cpp create mode 100644 objparser.h diff --git a/assets/cube.obj b/assets/cube.obj new file mode 100644 index 0000000..4e3c3f9 --- /dev/null +++ b/assets/cube.obj @@ -0,0 +1,48 @@ + +# cube.obj +# + +mtllib cube.mtl +o cube + +v -1.000000 -1.000000 1.000000 +v 1.000000 -1.000000 1.000000 +v -1.000000 1.000000 1.000000 +v 1.000000 1.000000 1.000000 +v -1.000000 1.000000 -1.000000 +v 1.000000 1.000000 -1.000000 +v -1.000000 -1.000000 -1.000000 +v 1.000000 -1.000000 -1.000000 + +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 + +vn 0.000000 0.000000 1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 + +g cube +usemtl cube +s 1 +f 1/1/1 2/2/1 3/3/1 +f 3/3/1 2/2/1 4/4/1 +s 2 +f 3/1/2 4/2/2 5/3/2 +f 5/3/2 4/2/2 6/4/2 +s 3 +f 5/4/3 6/3/3 7/2/3 +f 7/2/3 6/3/3 8/1/3 +s 4 +f 7/1/4 8/2/4 1/3/4 +f 1/3/4 8/2/4 2/4/4 +s 5 +f 2/1/5 8/2/5 4/3/5 +f 4/3/5 8/2/5 6/4/5 +s 6 +f 7/1/6 1/2/6 5/3/6 +f 5/3/6 1/2/6 3/4/6 diff --git a/assets/cube.png b/assets/cube.png new file mode 100644 index 0000000000000000000000000000000000000000..9f858726e9e784b277d10f1429a4d79490cc1819 GIT binary patch literal 545 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV0_`};uumf=k4sheoT%ct>+IY zDRt*0_LziSTG=_*><3fZj`fS|nmSuQMt)d+@t9L3!~KJY#IE#;9g5PF7MOANOu?Ok z{Vi=g<>%^(({H9WcNNMwPuI94=e0EEn%t~n31#69hB5{-r3TrCUXBFz1ZAchj5okS zakCD-dUqz2Z}kz2t8&)gWfkBuNQ!gBdk!Bc^E{IH;rAxrG%JU#R(`M2+#0&CvY%i& zXYRe@hE`^O`9)SgmKSfXH*aO~d*v#VD{^s-=(1}eYx^ead3>#I;Imr2CHCy&wEPc$ z-eqm?nfu$^rnFi(``>H63$b&jvbG*?v;XwZ`S9_qz{t7Y?AlD1ShC)SZ+O!ymvJ;W z!(8h^aDso+M==jJNxrE$H<#{ly0XS^P3ZUH7wwFHUh6Ho_h9AU9nHOm4^%`;lse1` zol*9|^ImX|>06e?d>+MVarGIzy0IbvIPuR#J*lXx`nxCyF<{SB?jl^ z|E}Cxx2vw=O+oD3pCucMgi1rxz)O2>IQL+95uGisBRtDS7SUlUu?80Ep zAT4-+?|>W22IdWdjBgln5JD&G+n&kbkbEYsHmz{t1W%T!z^G^NboFyt=akR{08DS} AQUCw| literal 0 HcmV?d00001 diff --git a/assets/f22.obj b/assets/f22.obj new file mode 100644 index 0000000..3f4bf9e --- /dev/null +++ b/assets/f22.obj @@ -0,0 +1,707 @@ +# Blender v2.79 (sub 0) OBJ File: 'fighters_0.blend' +# www.blender.org +mtllib f-22.mtl +o F-22 +v 0.885739 0.001910 -0.380334 +v 0.322026 0.035470 -0.433102 +v -0.907053 0.017201 -0.352922 +v 1.047128 0.048117 -0.183264 +v 0.362277 0.114239 -0.142520 +v 1.125941 0.131116 -0.101088 +v 1.199510 0.242528 -0.056765 +v 1.529867 0.098373 -0.067674 +v 1.566378 0.011323 -0.146393 +v 1.762624 0.050007 -0.049581 +v 1.789931 -0.007335 -0.103633 +v -1.226703 0.083896 -0.231401 +v -1.226703 0.083896 -0.043034 +v -1.304689 0.083896 -0.142520 +v -0.560223 0.071221 -0.299735 +v 0.779234 -0.185506 -0.231401 +v -0.408812 -0.168000 -0.231401 +v -1.226703 -0.023036 -0.043034 +v -1.226703 -0.023036 -0.231464 +v -1.304556 -0.023036 -0.142520 +v -0.442164 -0.009523 -0.406435 +v -0.875984 0.035470 -1.161559 +v -0.727243 0.035470 -1.316844 +v -0.494141 0.035470 -1.316844 +v -1.376274 0.035470 -0.874979 +v -1.417826 0.035470 -0.043034 +v 1.016889 0.247035 -0.041089 +v -0.910201 0.071705 -0.260759 +v -0.910201 0.114239 -0.142520 +v -1.347072 0.053931 -0.291132 +v -0.949411 0.058716 -0.324121 +v -1.086356 0.618995 -0.582384 +v -0.945513 0.618995 -0.582384 +v -0.820765 0.618995 -0.582384 +v -1.074394 0.035470 -0.526090 +v -1.347072 0.017010 -0.291132 +v -1.420792 0.035470 -0.231401 +v -1.704863 0.035470 -0.554642 +v -1.607890 0.035470 -0.874979 +v 1.142508 0.156204 -0.091107 +v 0.821684 0.218761 -0.028011 +v 1.453805 0.131564 -0.065163 +v 0.835981 0.180467 -0.042103 +v 0.885739 0.001910 0.380334 +v 0.322026 0.035470 0.433102 +v -0.907053 0.017201 0.352922 +v 1.047128 0.048117 0.183264 +v 0.362277 0.114239 0.142520 +v 1.125941 0.131116 0.101088 +v 1.199510 0.242528 0.056765 +v 1.529867 0.098373 0.067674 +v 1.566378 0.011323 0.146393 +v 1.762624 0.050007 0.049581 +v 1.789931 -0.007335 0.103633 +v -1.226703 0.083896 0.231401 +v -1.226703 0.083896 0.043034 +v -1.304689 0.083896 0.142520 +v -0.560223 0.071221 0.299735 +v 0.779234 -0.185506 0.231401 +v -0.408812 -0.168000 0.231401 +v -1.226703 -0.023036 0.043034 +v -1.226703 -0.023036 0.231464 +v -1.304556 -0.023036 0.142520 +v -0.442164 -0.009523 0.406435 +v -0.875984 0.035470 1.161559 +v -0.727243 0.035470 1.316844 +v -0.494141 0.035470 1.316844 +v -1.376274 0.035470 0.874979 +v -1.417826 0.035470 0.043034 +v 1.016889 0.247035 0.041089 +v -0.910201 0.071705 0.260759 +v -0.910201 0.114239 0.142520 +v -1.347072 0.053931 0.291132 +v -0.949411 0.058716 0.324121 +v -1.086356 0.618995 0.582384 +v -0.945513 0.618995 0.582384 +v -0.820765 0.618995 0.582384 +v -1.074394 0.035470 0.526090 +v -1.347072 0.017010 0.291132 +v -1.420792 0.035470 0.231401 +v -1.704863 0.035470 0.554642 +v -1.607890 0.035470 0.874979 +v 1.142508 0.156204 0.091107 +v 0.821684 0.218761 0.028011 +v 1.453805 0.131564 0.065163 +v 0.835981 0.180467 0.042103 +v -0.910201 0.094558 0.000000 +v 0.403590 0.158204 0.000000 +v 1.236021 0.268974 0.000000 +v 1.568094 0.113851 0.000000 +v 1.791648 0.062518 0.000000 +v 2.014232 -0.030625 0.000000 +v 1.566378 -0.120168 0.000000 +v 1.789931 -0.082458 0.000000 +v 0.919486 -0.169810 0.000000 +v -0.408812 -0.167592 0.000000 +v -1.226703 0.078200 0.000000 +v -1.226703 -0.023036 0.000000 +v -1.442453 0.035470 0.000000 +v 1.016889 0.266178 0.000000 +v 1.487051 0.151710 0.000000 +v 0.817113 0.231006 0.000000 +vt 0.302940 0.699066 +vt 0.442081 0.762279 +vt 0.260042 0.751449 +vt 0.780315 0.800162 +vt 0.431099 0.800162 +vt 0.239093 0.773292 +vt 0.316239 0.628907 +vt 0.320312 0.648438 +vt 0.269531 0.648438 +vt 0.268080 0.668033 +vt 0.209833 0.668033 +vt 0.152344 0.648438 +vt 0.218750 0.648438 +vt 0.234686 0.622186 +vt 0.122021 0.761249 +vt 0.069858 0.786983 +vt 0.062599 0.772615 +vt 0.121565 0.800162 +vt 0.131726 0.782173 +vt 0.002978 0.800162 +vt 0.062143 0.800162 +vt 0.687288 0.720490 +vt 0.780315 0.762279 +vt 0.117476 0.888175 +vt 0.176898 0.858183 +vt 0.176898 0.893135 +vt 0.057855 0.881984 +vt 0.117476 0.868207 +vt 0.314919 0.902915 +vt 0.348847 0.844988 +vt 0.350939 0.448650 +vt 0.338144 0.510748 +vt 0.289431 0.452822 +vt 0.329981 0.132766 +vt 0.645773 0.071258 +vt 0.645773 0.132766 +vt 0.452780 0.685040 +vt 0.669723 0.450134 +vt 0.731683 0.450134 +vt 0.771220 0.491410 +vt 0.823959 0.660323 +vt 0.507656 0.899553 +vt 0.357817 0.890633 +vt 0.386127 0.840816 +vt 0.701919 0.845469 +vt 0.896439 0.722777 +vt 0.916034 0.738294 +vt 0.864444 0.738294 +vt 0.445843 0.497454 +vt 0.469468 0.469031 +vt 0.469468 0.497454 +vt 0.495912 0.497454 +vt 0.654638 0.182832 +vt 0.668454 0.424826 +vt 0.451511 0.189920 +vt 0.654638 0.179292 +vt 0.778209 0.165068 +vt 0.822690 0.211097 +vt 0.864444 0.469031 +vt 0.864444 0.497454 +vt 0.916034 0.484582 +vt 0.863174 0.082019 +vt 0.863174 0.071258 +vt 0.913977 0.082019 +vt 0.864444 0.800162 +vt 0.864444 0.789083 +vt 0.809306 0.497454 +vt 0.809306 0.469031 +vt 0.860108 0.484582 +vt 0.915246 0.789083 +vt 0.921792 0.800162 +vt 0.822690 0.214637 +vt 0.769951 0.383550 +vt 0.730414 0.424826 +vt 0.834355 0.894697 +vt 0.919320 0.884002 +vt 0.141653 0.276624 +vt 0.107458 0.425551 +vt 0.038204 0.279948 +vt 0.178054 0.425551 +vt 0.140617 0.425551 +vt 0.883868 0.109141 +vt 0.863174 0.132783 +vt 0.780315 0.730850 +vt 0.904201 0.567586 +vt 0.790737 0.714008 +vt 0.991542 0.652734 +vt 0.385137 0.280077 +vt 0.361364 0.425551 +vt 0.394523 0.425551 +vt 0.431960 0.425551 +vt 0.501261 0.275352 +vt 0.895170 0.148643 +vt 0.914765 0.132766 +vt 0.902932 0.303834 +vt 0.990273 0.218686 +vt 0.964497 0.303834 +vt 0.965766 0.567586 +vt 0.885173 0.762279 +vt 0.151941 0.583698 +vt 0.239090 0.583579 +vt 0.234686 0.590248 +vt 0.316239 0.596969 +vt 0.431096 0.590779 +vt 0.321182 0.614322 +vt 0.319967 0.606876 +vt 0.431099 0.614322 +vt 0.143107 0.601016 +vt 0.131726 0.583028 +vt 0.321182 0.668033 +vt 0.121565 0.601016 +vt 0.131723 0.574876 +vt 0.292110 0.279948 +vt 0.247354 0.275352 +vt 0.710784 0.887594 +vt 0.920523 0.071258 +vt 0.495912 0.469031 +vt 0.445826 0.469031 +vt 0.292701 0.071258 +vt 0.390527 0.498466 +vt 0.143107 0.668033 +vt 0.302940 0.699066 +vt 0.260042 0.751449 +vt 0.442081 0.762279 +vt 0.239093 0.773292 +vt 0.316239 0.628907 +vt 0.269531 0.648438 +vt 0.320312 0.648438 +vt 0.218750 0.648438 +vt 0.152344 0.648438 +vt 0.234686 0.622186 +vt 0.122021 0.761249 +vt 0.062599 0.772615 +vt 0.069858 0.786983 +vt 0.131726 0.782173 +vt 0.687288 0.720490 +vt 0.780315 0.762279 +vt 0.117476 0.888175 +vt 0.176898 0.893135 +vt 0.314919 0.902915 +vt 0.350939 0.448650 +vt 0.338144 0.510748 +vt 0.329981 0.132766 +vt 0.645773 0.132766 +vt 0.452780 0.685040 +vt 0.731683 0.450134 +vt 0.669723 0.450134 +vt 0.823959 0.660323 +vt 0.771220 0.491410 +vt 0.507656 0.899553 +vt 0.386127 0.840816 +vt 0.357817 0.890633 +vt 0.701919 0.845469 +vt 0.896439 0.722777 +vt 0.864444 0.738294 +vt 0.916034 0.738294 +vt 0.445843 0.497454 +vt 0.469468 0.497454 +vt 0.469468 0.469031 +vt 0.495912 0.497454 +vt 0.654638 0.182832 +vt 0.451511 0.189920 +vt 0.668454 0.424826 +vt 0.654638 0.179292 +vt 0.822690 0.211097 +vt 0.778209 0.165068 +vt 0.864444 0.469031 +vt 0.916034 0.484582 +vt 0.864444 0.497454 +vt 0.863174 0.082019 +vt 0.913977 0.082019 +vt 0.864444 0.789083 +vt 0.809306 0.497454 +vt 0.860108 0.484582 +vt 0.809306 0.469031 +vt 0.915246 0.789083 +vt 0.822690 0.214637 +vt 0.769951 0.383550 +vt 0.730414 0.424826 +vt 0.834355 0.894697 +vt 0.919320 0.884002 +vt 0.141653 0.276624 +vt 0.038204 0.279948 +vt 0.107458 0.425551 +vt 0.140617 0.425551 +vt 0.178054 0.425551 +vt 0.883868 0.109141 +vt 0.863174 0.132783 +vt 0.780315 0.730850 +vt 0.904201 0.567586 +vt 0.790737 0.714008 +vt 0.991542 0.652734 +vt 0.385137 0.280077 +vt 0.394523 0.425551 +vt 0.361364 0.425551 +vt 0.501261 0.275352 +vt 0.431960 0.425551 +vt 0.895170 0.148643 +vt 0.914765 0.132766 +vt 0.902932 0.303834 +vt 0.964497 0.303834 +vt 0.990273 0.218686 +vt 0.965766 0.567586 +vt 0.885173 0.762279 +vt 0.151941 0.583698 +vt 0.234686 0.590248 +vt 0.239090 0.583579 +vt 0.316239 0.596969 +vt 0.319967 0.606876 +vt 0.131726 0.583028 +vt 0.131723 0.574876 +vt 0.292110 0.279948 +vt 0.247354 0.275352 +vt 0.710784 0.887594 +vt 0.495912 0.469031 +vt 0.445826 0.469031 +vt 0.390527 0.498466 +vn 0.0752 0.9554 -0.2856 +vn -0.0464 0.9582 -0.2821 +vn -0.0672 0.7335 -0.6764 +vn -0.1079 0.3076 -0.9454 +vn -0.1576 0.8951 -0.4170 +vn 0.3158 0.7660 -0.5600 +vn 0.1032 0.3081 -0.9457 +vn 0.0996 0.6507 -0.7527 +vn 0.1879 0.7196 -0.6685 +vn 0.2166 0.9180 -0.3323 +vn 0.3493 0.7254 -0.5931 +vn 0.3509 0.8385 -0.4170 +vn 0.0000 0.9645 -0.2639 +vn 0.0656 -0.7424 -0.6668 +vn 0.1839 -0.7958 -0.5769 +vn 0.0506 -0.6600 -0.7496 +vn 0.6508 -0.6744 -0.3487 +vn -0.0147 -0.9999 0.0018 +vn -0.0004 0.9652 -0.2616 +vn 0.0000 0.9994 -0.0351 +vn -0.0610 0.9980 -0.0190 +vn 0.0346 -0.6338 -0.7728 +vn -0.0101 -0.6854 -0.7281 +vn -0.2421 0.9703 0.0011 +vn -0.7517 -0.0009 -0.6595 +vn -0.7870 -0.0010 0.6169 +vn 0.0569 -0.9970 -0.0525 +vn -0.0625 -0.9970 -0.0448 +vn 0.0001 -0.0006 1.0000 +vn -0.0313 0.9991 -0.0300 +vn -0.1740 -0.9847 0.0000 +vn -0.2927 -0.9562 0.0000 +vn -0.0512 0.9901 0.1310 +vn 0.0000 0.0000 -1.0000 +vn -0.1931 0.9749 -0.1105 +vn -0.0670 -0.9975 -0.0209 +vn -0.0388 -0.9986 -0.0372 +vn -0.1372 -0.7744 -0.6176 +vn 0.0702 -0.4308 -0.8997 +vn 0.0000 -0.4186 -0.9082 +vn -0.1725 -0.9734 -0.1510 +vn -0.1596 -0.9872 0.0017 +vn -0.1795 -0.9737 0.1405 +vn 0.0048 0.9410 -0.3385 +vn 0.0000 0.9906 0.1368 +vn 0.0387 0.9987 -0.0335 +vn -0.0258 0.9948 -0.0985 +vn -0.0061 0.8987 -0.4386 +vn -0.0204 0.9946 -0.1018 +vn -0.1436 0.9816 0.1262 +vn 0.0000 0.5067 0.8621 +vn -0.0803 0.4857 0.8704 +vn -0.2881 -0.9557 -0.0602 +vn 0.0387 -0.9987 -0.0335 +vn -0.0421 -0.9990 -0.0128 +vn -0.0126 -0.9956 -0.0929 +vn -0.0646 -0.8840 -0.4629 +vn -0.0000 0.9995 -0.0316 +vn 0.0000 -0.9995 -0.0316 +vn -0.0766 0.9953 0.0600 +vn -0.0765 0.9948 -0.0671 +vn -0.0519 0.9893 0.1366 +vn -0.1094 0.4290 -0.8967 +vn 0.3481 0.8307 -0.4344 +vn -0.0681 0.4073 -0.9107 +vn -0.1215 0.3445 -0.9309 +vn -0.0116 0.9064 -0.4223 +vn -0.0132 0.9096 -0.4153 +vn 0.3865 0.8274 -0.4075 +vn -0.1436 -0.9816 0.1262 +vn 0.0970 0.4924 0.8649 +vn -0.0421 0.9990 -0.0128 +vn -0.0694 -0.4316 -0.8994 +vn -0.1182 -0.7472 -0.6540 +vn -0.2436 0.9615 0.1273 +vn -0.2588 -0.9545 -0.1481 +vn 0.0000 -0.9988 -0.0494 +vn -0.7875 0.0000 0.6163 +vn -0.7525 0.0004 -0.6586 +vn 0.0200 -0.7392 -0.6731 +vn 0.0355 0.9988 -0.0328 +vn -0.0017 -0.9976 0.0687 +vn 0.6468 -0.6647 -0.3739 +vn -0.0053 -0.7439 -0.6682 +vn 0.1353 -0.8022 -0.5815 +vn -0.0364 0.9403 -0.3383 +vn 0.2094 0.9120 -0.3527 +vn 0.1990 0.7019 -0.6839 +vn 0.1150 0.6924 -0.7123 +vn 0.3792 0.8117 -0.4444 +vn 0.0728 0.9469 -0.3132 +vn 0.0825 0.9589 -0.2714 +vn 0.0752 0.9554 0.2856 +vn -0.0464 0.9582 0.2821 +vn -0.0672 0.7335 0.6764 +vn -0.1079 0.3076 0.9454 +vn -0.1576 0.8951 0.4170 +vn 0.3158 0.7660 0.5600 +vn 0.1032 0.3081 0.9457 +vn 0.0996 0.6507 0.7527 +vn 0.1879 0.7196 0.6685 +vn 0.2166 0.9180 0.3323 +vn 0.3493 0.7254 0.5931 +vn 0.3509 0.8385 0.4170 +vn 0.0000 0.9645 0.2639 +vn 0.0656 -0.7424 0.6668 +vn 0.1839 -0.7958 0.5769 +vn 0.0506 -0.6600 0.7496 +vn 0.6508 -0.6744 0.3487 +vn -0.0147 -0.9999 -0.0018 +vn -0.0004 0.9652 0.2616 +vn 0.0000 0.9994 0.0351 +vn -0.0610 0.9980 0.0190 +vn 0.0346 -0.6338 0.7728 +vn -0.0101 -0.6854 0.7281 +vn -0.2421 0.9703 -0.0011 +vn -0.7517 -0.0009 0.6595 +vn -0.7870 -0.0010 -0.6169 +vn 0.0569 -0.9970 0.0525 +vn -0.0625 -0.9970 0.0448 +vn 0.0001 -0.0006 -1.0000 +vn -0.0313 0.9991 0.0300 +vn -0.0512 0.9901 -0.1310 +vn 0.0000 0.0000 1.0000 +vn -0.1931 0.9749 0.1105 +vn -0.0670 -0.9975 0.0209 +vn -0.0388 -0.9986 0.0372 +vn -0.1372 -0.7744 0.6176 +vn 0.0702 -0.4308 0.8997 +vn 0.0000 -0.4186 0.9082 +vn -0.1725 -0.9734 0.1510 +vn -0.1596 -0.9872 -0.0017 +vn -0.1795 -0.9737 -0.1405 +vn 0.0048 0.9410 0.3385 +vn 0.0000 0.9906 -0.1368 +vn 0.0387 0.9987 0.0335 +vn -0.0258 0.9948 0.0985 +vn -0.0061 0.8987 0.4386 +vn -0.0204 0.9946 0.1018 +vn -0.1436 0.9816 -0.1262 +vn 0.0000 0.5067 -0.8621 +vn -0.0803 0.4857 -0.8704 +vn -0.2881 -0.9557 0.0602 +vn 0.0387 -0.9987 0.0335 +vn -0.0421 -0.9990 0.0128 +vn -0.0126 -0.9956 0.0929 +vn -0.0646 -0.8840 0.4629 +vn -0.0000 0.9995 0.0316 +vn 0.0000 -0.9995 0.0316 +vn -0.0766 0.9953 -0.0600 +vn -0.0765 0.9948 0.0671 +vn -0.0519 0.9893 -0.1366 +vn -0.1094 0.4290 0.8967 +vn 0.3481 0.8307 0.4344 +vn -0.0681 0.4073 0.9107 +vn -0.1215 0.3445 0.9309 +vn -0.0116 0.9064 0.4223 +vn -0.0132 0.9096 0.4153 +vn 0.3865 0.8274 0.4075 +vn -0.1436 -0.9816 -0.1262 +vn 0.0970 0.4924 -0.8649 +vn -0.0421 0.9990 0.0128 +vn -0.0694 -0.4316 0.8994 +vn -0.1182 -0.7472 0.6540 +vn -0.2436 0.9615 -0.1273 +vn -0.2588 -0.9545 0.1481 +vn 0.0000 -0.9988 0.0494 +vn -0.7875 0.0000 -0.6163 +vn -0.7525 0.0004 0.6586 +vn 0.0200 -0.7392 0.6731 +vn 0.0355 0.9988 0.0328 +vn -0.0017 -0.9976 -0.0687 +vn 0.6468 -0.6647 0.3739 +vn -0.0053 -0.7439 0.6682 +vn 0.1353 -0.8022 0.5815 +vn -0.0364 0.9403 0.3383 +vn 0.2094 0.9120 0.3527 +vn 0.1990 0.7019 0.6839 +vn 0.1150 0.6924 0.7123 +vn 0.3792 0.8117 0.4444 +vn 0.0728 0.9469 0.3132 +vn 0.0825 0.9589 0.2714 +usemtl Material.001 +s off +f 1/1/1 5/2/1 4/3/1 +f 5/2/2 87/4/2 88/5/2 +f 4/3/3 88/5/3 6/6/3 +f 43/7/4 41/8/4 27/9/4 +f 41/8/5 100/10/5 27/9/5 +f 89/11/6 42/12/6 7/13/6 +f 7/13/7 42/12/7 40/14/7 +f 6/6/8 9/15/8 4/3/8 +f 9/15/9 10/16/9 11/17/9 +f 90/18/10 10/16/10 8/19/10 +f 11/17/11 10/16/11 92/20/11 +f 10/16/12 91/21/12 92/20/12 +f 15/22/13 29/23/13 5/2/13 +f 11/24/14 93/25/14 9/26/14 +f 11/24/15 92/27/15 94/28/15 +f 4/29/16 93/25/16 95/30/16 +f 16/31/17 4/32/17 95/33/17 +f 16/34/18 96/35/18 17/36/18 +f 5/2/19 2/37/19 15/22/19 +f 15/22/20 24/38/20 23/39/20 +f 15/22/21 22/40/21 35/41/21 +f 2/42/22 1/43/22 16/44/22 +f 17/45/23 2/42/23 16/44/23 +f 30/46/24 37/47/24 12/48/24 +f 12/49/25 20/50/25 14/51/25 +f 20/50/26 13/52/26 14/51/26 +f 21/53/27 24/54/27 2/55/27 +f 21/56/28 3/57/28 35/58/28 +f 19/59/29 12/60/29 37/61/29 +f 15/22/30 23/39/30 22/40/30 +f 18/62/31 96/35/31 98/63/31 +f 98/63/32 26/64/32 18/62/32 +f 97/65/33 87/4/33 13/66/33 +f 13/67/34 18/68/34 26/69/34 +f 97/65/35 26/70/35 99/71/35 +f 35/72/36 22/73/36 21/53/36 +f 22/73/37 23/74/37 21/53/37 +f 3/75/38 17/45/38 19/76/38 +f 31/77/39 34/78/39 15/79/39 +f 31/77/40 32/80/40 33/81/40 +f 20/82/41 19/83/41 17/36/41 +f 20/82/42 17/36/42 96/35/42 +f 18/62/43 20/82/43 96/35/43 +f 29/23/44 28/84/44 12/48/44 +f 87/4/45 5/2/45 29/23/45 +f 25/85/46 30/46/46 35/41/46 +f 31/86/47 15/22/47 35/41/47 +f 30/46/48 12/48/48 28/84/48 +f 30/46/49 31/86/49 35/41/49 +f 30/46/50 38/87/50 37/47/50 +f 28/88/51 34/89/51 33/90/51 +f 28/88/52 32/91/52 30/92/52 +f 36/93/53 19/83/53 37/94/53 +f 36/93/54 25/95/54 35/58/54 +f 36/93/55 38/96/55 39/97/55 +f 36/93/56 35/58/56 3/57/56 +f 3/57/57 19/83/57 36/93/57 +f 25/85/58 39/98/58 30/46/58 +f 36/93/59 39/97/59 25/95/59 +f 29/23/60 14/99/60 13/66/60 +f 14/99/61 29/23/61 12/48/61 +f 87/4/62 29/23/62 13/66/62 +f 42/100/7 6/101/7 40/102/7 +f 43/103/63 6/101/63 88/104/63 +f 102/105/5 41/106/5 88/107/5 +f 101/108/64 8/109/64 42/100/64 +f 27/9/65 7/13/65 40/14/65 +f 40/14/66 43/7/66 27/9/66 +f 41/8/5 102/110/5 100/10/5 +f 100/10/67 89/11/67 27/9/67 +f 89/11/68 7/13/68 27/9/68 +f 101/108/69 90/111/69 8/109/69 +f 43/103/63 40/102/63 6/101/63 +f 88/104/4 41/106/4 43/103/4 +f 42/100/7 8/112/7 6/101/7 +f 36/93/70 37/94/70 38/96/70 +f 28/88/51 33/90/51 32/91/51 +f 28/88/71 15/113/71 34/89/71 +f 30/46/72 39/98/72 38/87/72 +f 31/77/73 30/114/73 32/80/73 +f 31/77/40 33/81/40 34/78/40 +f 3/75/74 21/115/74 17/45/74 +f 97/65/75 13/66/75 26/70/75 +f 98/63/76 99/116/76 26/64/76 +f 21/53/77 23/74/77 24/54/77 +f 20/50/78 18/117/78 13/52/78 +f 12/49/79 19/118/79 20/50/79 +f 17/45/80 21/115/80 2/42/80 +f 15/22/81 2/37/81 24/38/81 +f 16/34/82 95/119/82 96/35/82 +f 16/31/83 1/120/83 4/32/83 +f 4/29/84 9/26/84 93/25/84 +f 11/24/85 94/28/85 93/25/85 +f 15/22/86 28/84/86 29/23/86 +f 90/18/87 91/21/87 10/16/87 +f 9/15/88 8/19/88 10/16/88 +f 6/6/89 8/19/89 9/15/89 +f 89/11/90 101/121/90 42/12/90 +f 4/3/91 5/2/91 88/5/91 +f 1/1/92 2/37/92 5/2/92 +f 44/122/93 47/123/93 48/124/93 +f 48/124/94 88/5/94 87/4/94 +f 47/123/95 49/125/95 88/5/95 +f 86/126/96 70/127/96 84/128/96 +f 84/128/97 70/127/97 100/10/97 +f 89/11/98 50/129/98 85/130/98 +f 50/129/99 83/131/99 85/130/99 +f 49/125/100 47/123/100 52/132/100 +f 52/132/101 54/133/101 53/134/101 +f 90/18/102 51/135/102 53/134/102 +f 54/133/103 92/20/103 53/134/103 +f 53/134/104 92/20/104 91/21/104 +f 58/136/105 48/124/105 72/137/105 +f 54/138/106 52/139/106 93/25/106 +f 54/138/107 94/28/107 92/27/107 +f 47/140/108 95/30/108 93/25/108 +f 59/141/109 95/33/109 47/142/109 +f 59/143/110 60/144/110 96/35/110 +f 48/124/111 58/136/111 45/145/111 +f 58/136/112 66/146/112 67/147/112 +f 58/136/113 78/148/113 65/149/113 +f 45/150/114 59/151/114 44/152/114 +f 60/153/115 59/151/115 45/150/115 +f 73/154/116 55/155/116 80/156/116 +f 55/157/117 57/158/117 63/159/117 +f 63/159/118 57/158/118 56/160/118 +f 64/161/119 45/162/119 67/163/119 +f 64/164/120 78/165/120 46/166/120 +f 62/167/121 80/168/121 55/169/121 +f 58/136/122 65/149/122 66/146/122 +f 61/170/31 98/63/31 96/35/31 +f 98/63/32 61/170/32 69/171/32 +f 97/65/123 56/172/123 87/4/123 +f 56/173/124 69/174/124 61/175/124 +f 97/65/125 99/71/125 69/176/125 +f 78/177/126 64/161/126 65/178/126 +f 65/178/127 64/161/127 66/179/127 +f 46/180/128 62/181/128 60/153/128 +f 74/182/129 58/183/129 77/184/129 +f 74/182/130 76/185/130 75/186/130 +f 63/187/131 60/144/131 62/188/131 +f 63/187/132 96/35/132 60/144/132 +f 61/170/133 96/35/133 63/187/133 +f 72/137/134 55/155/134 71/189/134 +f 87/4/135 72/137/135 48/124/135 +f 68/190/136 78/148/136 73/154/136 +f 74/191/137 78/148/137 58/136/137 +f 73/154/138 71/189/138 55/155/138 +f 73/154/139 78/148/139 74/191/139 +f 73/154/140 80/156/140 81/192/140 +f 71/193/141 76/194/141 77/195/141 +f 71/193/142 73/196/142 75/197/142 +f 79/198/143 80/199/143 62/188/143 +f 79/198/144 78/165/144 68/200/144 +f 79/198/145 82/201/145 81/202/145 +f 79/198/146 46/166/146 78/165/146 +f 46/166/147 79/198/147 62/188/147 +f 68/190/148 73/154/148 82/203/148 +f 79/198/149 68/200/149 82/201/149 +f 72/137/150 56/172/150 57/204/150 +f 57/204/151 55/155/151 72/137/151 +f 87/4/152 56/172/152 72/137/152 +f 85/205/99 83/206/99 49/207/99 +f 86/208/153 88/104/153 49/207/153 +f 102/105/97 88/107/97 84/209/97 +f 101/108/154 85/205/154 51/210/154 +f 70/127/155 83/131/155 50/129/155 +f 83/131/156 70/127/156 86/126/156 +f 84/128/97 100/10/97 102/110/97 +f 100/10/157 70/127/157 89/11/157 +f 89/11/158 70/127/158 50/129/158 +f 101/108/159 51/210/159 90/111/159 +f 86/208/153 49/207/153 83/206/153 +f 88/104/96 86/208/96 84/209/96 +f 85/205/99 49/207/99 51/211/99 +f 79/198/160 81/202/160 80/199/160 +f 71/193/141 75/197/141 76/194/141 +f 71/193/161 77/195/161 58/212/161 +f 73/154/162 81/192/162 82/203/162 +f 74/182/163 75/186/163 73/213/163 +f 74/182/130 77/184/130 76/185/130 +f 46/180/164 60/153/164 64/214/164 +f 97/65/165 69/176/165 56/172/165 +f 98/63/166 69/171/166 99/116/166 +f 64/161/167 67/163/167 66/179/167 +f 63/159/168 56/160/168 61/215/168 +f 55/157/169 63/159/169 62/216/169 +f 60/153/170 45/150/170 64/214/170 +f 58/136/171 67/147/171 45/145/171 +f 59/143/172 96/35/172 95/119/172 +f 59/141/173 47/142/173 44/217/173 +f 47/140/174 93/25/174 52/139/174 +f 54/138/175 93/25/175 94/28/175 +f 58/136/176 72/137/176 71/189/176 +f 90/18/177 53/134/177 91/21/177 +f 52/132/178 53/134/178 51/135/178 +f 49/125/179 52/132/179 51/135/179 +f 89/11/180 85/130/180 101/121/180 +f 47/123/181 88/5/181 48/124/181 +f 44/122/182 48/124/182 45/145/182 diff --git a/main.cpp b/main.cpp index 1742e14..33489cf 100644 --- a/main.cpp +++ b/main.cpp @@ -14,6 +14,7 @@ OK Fix the gaps between triangles (it also improved look of triangle edges) * Depth buffer * FPS Camera * Reading OBJ files +* Loading a model from PMX? * Rendering multiple objects, queue renderer * Clipping * Optimizations @@ -22,14 +23,24 @@ OK Fix the gaps between triangles (it also improved look of triangle edges) * */ +/* What a codebase needs: +* Macros for debug, release, slow, fast builds, where debug - tooling, slow - enable asserts +* Macros for OS, Compiler, Architecture +* Nice way of outputing visible error messages +* FatalError and Assert function for release builds with an error message, Debug Assert with error message for slow builds +* +*/ +#define OS_WINDOWS 1 #define BILINEAR_BLEND 1 #define PERSPECTIVE_CORRECT_INTERPOLATION 1 #define DRAW_WIREFRAME 1 +#define DRAW_RECTS 0 #include "main.h" #include "platform.h" #include "math.h" #include "stb_image.h" +#include "objparser.h" struct Face { int p[3]; @@ -71,15 +82,15 @@ void DrawRect(Image* dst, float X, float Y, float w, float h, U32 color) { for (int y = min_y; y < max_y; y++) { for (int x = min_x; x < max_x; x++) { - dst->pixels[x + (dst->y - 1 - y) * dst->x] = color; + dst->pixels[x + y * dst->x] = color; } } } FUNCTION void DrawBitmap(Image* dst, Image* src, Vec2 pos) { - I64 minx = (I64)(pos.x + 0.5f); - I64 miny = (I64)(pos.y + 0.5f); + I64 minx = (I64)(pos.x + 0.5); + I64 miny = (I64)(pos.y + 0.5); I64 maxx = minx + src->x; I64 maxy = miny + src->y; I64 offsetx = 0; @@ -105,7 +116,7 @@ void DrawBitmap(Image* dst, Image* src, Vec2 pos) { for (I64 x = minx; x < maxx; x++) { I64 tx = x - minx + offsetx; I64 ty = y - miny + offsety; - dst->pixels[x + (dst->y - 1 - y) * dst->x] = src->pixels[tx + (src->y - 1 - ty) * src->x]; + dst->pixels[x + y * dst->x] = src->pixels[tx + ty * src->x]; } } } @@ -127,8 +138,6 @@ void DrawTriangle(Image* dst, Image *src, Vec4 p0, Vec4 p1, Vec4 p2, I64 min_y = (I64)MAX(0, Floor(min_y1)); I64 max_x = (I64)MIN(dst->x, Ceil(max_x1)); I64 max_y = (I64)MIN(dst->y, Ceil(max_y1)); - //@Todo: Fix the proper rounding - //@Todo: Determine whether we need subprecision etc float area = EdgeFunction(p0, p1, p2); for (I64 y = min_y; y < max_y; y++) { @@ -158,6 +167,7 @@ void DrawTriangle(Image* dst, Image *src, Vec4 p0, Vec4 p1, Vec4 p2, I64 vi = (I64)(v); float udiff = u - (float)ui; float vdiff = v - (float)vi; + // Origin UV (0,0) is in bottom left U32 *pixel = src->pixels + (ui + (src->y - 1ll - vi) * src->x); #if BILINEAR_BLEND Vec4 pixelx1y1 = V4ABGR(*pixel); @@ -173,13 +183,15 @@ void DrawTriangle(Image* dst, Image *src, Vec4 p0, Vec4 p1, Vec4 p2, U32 color32 = *pixel; #endif - dst->pixels[x + (dst->y - 1 - y) * dst->x] = color32; + dst->pixels[x + y * dst->x] = color32; } } } +#if DRAW_RECTS DrawRect(dst, p0.x-4, p0.y-4, 8,8, 0x00ff0000); DrawRect(dst, p1.x-4, p1.y-4, 8,8, 0x0000ff00); DrawRect(dst, p2.x-4, p2.y-4, 8,8, 0x000000ff); +#endif } FUNCTION @@ -194,20 +206,50 @@ void DrawLine(Image *dst, float x0, float y0, float x1, float y1) { for (int i = 0; i <= longest_side_length; i++) { int x = (int)(current_x + 0.5f); int y = (int)(current_y + 0.5f); - dst->pixels[x + (dst->y - 1 - y) * dst->x] = 0xffffffff; + dst->pixels[x + y * dst->x] = 0xffffffff; current_x += x_inc; current_y += y_inc; } } +struct FaceA { + int vertex[3]; + int tex[3]; + int normal[3]; +}; + +FUNCTION +Obj LoadObj(const char* file) { + char* data = OS_ReadFile(file); + char* memory = (char*)malloc(100000); + Obj result = Obj_Parse(memory, 100000, data); + free(data); + return result; +} + +FUNCTION +Image LoadImage(const char* path) { + int x, y, n; + unsigned char* data = stbi_load(path, &x, &y, &n, 4); + Image result = { (U32*)data, x, y }; + return result; +} + int main() { + Obj_Test(); OS_Init({ 1280,720 }); float rotation = 0; Vec3 camera_pos = {0,0,-5}; - int x,y,n; - unsigned char *data = stbi_load("assets/bricksx64.png", &x, &y, &n, 4); - Image img = {(U32 *)data, x, y}; - Image screen320 = {(U32 *)malloc(320*180*sizeof(U32)), 140, 140}; + + Obj obj = LoadObj("assets/f22.obj"); + Vec3* vertices = (Vec3 *)obj.vertices; + Vec2* tex_coords = (Vec2*)obj.texture; + FaceA* faces = (FaceA*)obj.indices; + I64 face_count = obj.indices_count; + + + Image img = LoadImage("assets/bricksx64.png"); + Image screen320 = {(U32 *)malloc(320*180*sizeof(U32)), 320, 180}; while (OS_GameLoop()) { Mat4 perspective = Mat4Perspective(60.f, (float)screen.x, (float)screen.y, 0.1f, 100.f); for (int y = 0; y < screen320.y; y++) { @@ -215,21 +257,22 @@ int main() { screen320.pixels[x + y * screen320.x] = 0; } } -#if 0 - DrawTriangle(&screen320, &img, { 100,100 }, { 100,400 }, { 400,400 }, { 0,0 }, { 0,1 }, { 1,1 }); - DrawTriangle(&screen320, &img, { 100,100 }, { 400,400 }, { 400,100}, { 0,0 }, { 1,1 }, { 1,0 }); -#else - //DrawBitmap(&screen320, &img, {0,0}); + DrawBitmap(&screen320, &img, {0,0}); Mat4 transform = Mat4RotationZ(rotation); transform = transform * Mat4RotationX(rotation); if (keydown_a) rotation += 0.05f; if (keydown_b) rotation -= 0.05f; - for (int i = 0; i < ARRAY_CAP(cube_faces); i++) { - Face* face = cube_faces + i; + for (int i = 0; i < face_count; i++) { + FaceA* face = faces + i; Vec4 pos[3] = { - vec4(cube_vertices[face->p[0] - 1], 1), - vec4(cube_vertices[face->p[1] - 1], 1), - vec4(cube_vertices[face->p[2] - 1], 1), + vec4(vertices[face->vertex[0] - 1], 1), + vec4(vertices[face->vertex[1] - 1], 1), + vec4(vertices[face->vertex[2] - 1], 1), + }; + Vec2 tex[3] = { + tex_coords[face->tex[0] - 1], + tex_coords[face->tex[1] - 1], + tex_coords[face->tex[2] - 1], }; //@Note: Transform @@ -256,7 +299,8 @@ int main() { pos[j].x += screen320.x / 2; pos[j].y += screen320.y / 2; } - DrawTriangle(&screen320, &img, pos[0], pos[1], pos[2], face->tex[0], face->tex[1], face->tex[2]); + + DrawTriangle(&screen320, &img, pos[0], pos[1], pos[2], tex[0], tex[1], tex[2]); #if DRAW_WIREFRAME DrawLine(&screen320, pos[0].x, pos[0].y, pos[1].x, pos[1].y); DrawLine(&screen320, pos[1].x, pos[1].y, pos[2].x, pos[2].y); @@ -265,6 +309,7 @@ int main() { } } + // @Note: Draw 320screen to OS screen U32* ptr = screen.pixels; for (int y = 0; y < screen.y; y++) { for (int x = 0; x < screen.x; x++) { @@ -272,12 +317,8 @@ int main() { float v = (float)y / (float)screen.y; int tx = (int)(u * screen320.x + 0.5f); int ty = (int)(v * screen320.y + 0.5f); - U32 pixel = screen320.pixels[tx + ty * (screen320.x)]; - // 0xABGR to 0xARGB - // b > 24 g > 8 r < 8 - *ptr++ = ((pixel & 0xff000000)) | ((pixel & 0x00ff0000) >> 16) | ((pixel & 0x0000ff00)) | ((pixel & 0x000000ff) << 16); + *ptr++ = screen320.pixels[tx + ty * (screen320.x)]; } } -#endif } } diff --git a/objparser.cpp b/objparser.cpp new file mode 100644 index 0000000..6e2a0c9 --- /dev/null +++ b/objparser.cpp @@ -0,0 +1,240 @@ +#include "objparser.h" +#include +#include +#include + +enum class TokenType { + none, word, number, whitespace, end +}; + +struct Token { + TokenType type; + union { + struct { + char* s; + int len; + }; + double number; + }; +}; + +static +bool Obj_IsAlphabetic(char w) { + bool result = (w >= 'a' && w <= 'z') || (w >= 'A' && w <= 'Z'); + return result; +} + +static +bool Obj_IsNumber(char w) { + bool result = w >= '0' && w <= '9'; + return result; +} + +static +bool Obj_IsWhitespace(char w) { + bool result = w == '\n' || w == ' ' || w == '\t' || w == '\v' || w == '\r'; + return result; +} + +static +int Obj_StringLen(char* a) { + int result = 0; + while (*a++ != 0) result++; + return result; +} + +static +bool Obj_Equals(Token a, const char* b) { + int len = Obj_StringLen((char*)b); + if (a.type != TokenType::word) return false; + if (a.len != len) return false; + for (int i = 0; i < len; i++) { + if (a.s[i] != b[i]) return false; + } + return true; +} + +static +Token Obj_NextTokenRaw(char** data) { + Token result = {}; + result.s = *data; + *data += 1; + + if (Obj_IsAlphabetic(*result.s)) { + result.type = TokenType::word; + while (!Obj_IsWhitespace(**data)) { + *data+=1; + } + result.len = (int)(*data - result.s); + } + else if (Obj_IsNumber(*result.s) || *result.s == '-') { + result.type = TokenType::number; + while (Obj_IsNumber(**data) || **data == '.') { + *data += 1; + } + result.number = atof(result.s); + } + else if (*result.s == '#') { + while (**data != '\n') *data += 1; + result = Obj_NextTokenRaw(data); + } + else if (Obj_IsWhitespace(*result.s)) { + result.type = TokenType::whitespace; + while (Obj_IsWhitespace(**data)) *data += 1; + result.len = (int)(*data - result.s); + } + else if (*result.s == 0) { + result.type = TokenType::end; + } + else if(*result.s >= '!') { + result.type = (TokenType)*result.s; + } + + return result; +} + +static +Token Obj_NextToken(char** data) { + Token result; + do { + result = Obj_NextTokenRaw(data); + } while (result.type == TokenType::whitespace); + return result; +} + +static +double Obj_ExpectNumber(char** data) { + Token t = Obj_NextToken(data); + assert(t.type == TokenType::number); // @Todo: Error handling, error flag + return t.number; +} + +static +void Obj_ExpectToken(char** data, char token) { + Token t = Obj_NextToken(data); + assert(t.type == (TokenType)token); // @Todo: Error handling, error flag +} + +static +void Obj_Debug_ExpectRaw(char** data, TokenType type) { + char* data_temp = *data; + assert(Obj_NextTokenRaw(&data_temp).type == type); +} + +struct Obj_Arena { + char* base; + size_t size; + size_t p; +}; + +static +char* Obj_Push(Obj_Arena *a, size_t size) { + char* ptr = a->base; + if (a->p + size < a->size) { + ptr += a->p; + a->p += size; + } + else { + assert(!"Buffer is too small to hold the data!"); + } + return ptr; +} + +Obj Obj_Parse(char* memory, size_t memory_size, char* data) { + Obj_Arena arena = { memory, memory_size }; + Obj result = {}; + int parsing_vertices = 0; + int parsing_normals = 0; + int parsing_textures = 0; + + for (;;) { + Token token = Obj_NextToken(&data); + if (token.type == TokenType::end) break; + else if (token.type == TokenType::word) { + if (Obj_Equals(token, "v")) { + assert(parsing_vertices != 2); + parsing_vertices = 1; + float* ptr = (float*)Obj_Push(&arena, sizeof(float) * 3); + ptr[0] = (float)Obj_ExpectNumber(&data); + ptr[1] = (float)Obj_ExpectNumber(&data); + ptr[2] = (float)Obj_ExpectNumber(&data); + if (result.vertices == 0) result.vertices = ptr; + result.vertices_count++; + Obj_Debug_ExpectRaw(&data, TokenType::whitespace); + } + else if (Obj_Equals(token, "vt")) { + assert(parsing_textures != 2); + parsing_textures = 1; + parsing_vertices = 2; + + float* ptr = (float*)Obj_Push(&arena, sizeof(float) * 2); + ptr[0] = (float)Obj_ExpectNumber(&data); + ptr[1] = (float)Obj_ExpectNumber(&data); + if (result.texture == 0) result.texture = ptr; + Obj_Debug_ExpectRaw(&data, TokenType::whitespace); + } + else if (Obj_Equals(token, "vn")) { + assert((parsing_textures == 1 || parsing_textures == 2) && parsing_vertices == 2); + parsing_textures = 2; + parsing_normals = 1; + + float* ptr = (float*)Obj_Push(&arena, sizeof(float) * 3); + ptr[0] = (float)Obj_ExpectNumber(&data); + ptr[1] = (float)Obj_ExpectNumber(&data); + ptr[2] = (float)Obj_ExpectNumber(&data); + if (result.normals == 0) result.normals = ptr; + Obj_Debug_ExpectRaw(&data, TokenType::whitespace); + } + else if (Obj_Equals(token, "f")) { + assert(parsing_normals == 1 && parsing_textures == 2 && parsing_vertices == 2); + int* ptr = (int*)Obj_Push(&arena, sizeof(int) * 9); + ptr[0] = (int)Obj_ExpectNumber(&data); + Obj_ExpectToken(&data, '/'); + ptr[3] = (int)Obj_ExpectNumber(&data); + Obj_ExpectToken(&data, '/'); + ptr[6] = (int)Obj_ExpectNumber(&data); + + ptr[1] = (int)Obj_ExpectNumber(&data); + Obj_ExpectToken(&data, '/'); + ptr[4] = (int)Obj_ExpectNumber(&data); + Obj_ExpectToken(&data, '/'); + ptr[7] = (int)Obj_ExpectNumber(&data); + + ptr[2] = (int)Obj_ExpectNumber(&data); + Obj_ExpectToken(&data, '/'); + ptr[5] = (int)Obj_ExpectNumber(&data); + Obj_ExpectToken(&data, '/'); + ptr[8] = (int)Obj_ExpectNumber(&data); + if (result.indices == 0) result.indices = ptr; + result.indices_count += 1; + + Obj_Debug_ExpectRaw(&data, TokenType::whitespace); + } + } + } + result.memory_taken = arena.p; + return result; +} + +static +void Obj_TestLex() { + const char* d = "v 0.885739 0.001910 -0.380334"; + char* dd = (char *)d; + assert(Obj_NextToken(&dd).type == TokenType::word); + Token t = Obj_NextToken(&dd); assert(t.type == TokenType::number && t.number > 0.8857); + t = Obj_NextToken(&dd); assert(t.type == TokenType::number && t.number > 0.0019); + t = Obj_NextToken(&dd); assert(t.type == TokenType::number && t.number < -0.38); + d = "# Blender v2.79 (sub 0) OBJ File: 'fighters_0.blend'\n" + "# www.blender.org\n" + "mtllib f-22.mtl\n" + "o F-22\n"; + dd = (char *)d; + t = Obj_NextToken(&dd); assert(t.type == TokenType::word && Obj_Equals(t, (char*)"mtllib")); + t = Obj_NextToken(&dd); assert(t.type == TokenType::word && Obj_Equals(t, (char*)"f-22.mtl")); + t = Obj_NextToken(&dd); assert(t.type == TokenType::word && Obj_Equals(t, (char*)"o")); + t = Obj_NextToken(&dd); assert(t.type == TokenType::word && Obj_Equals(t, (char*)"F-22")); +} + +void Obj_Test() { + Obj_TestLex(); +} \ No newline at end of file diff --git a/objparser.h b/objparser.h new file mode 100644 index 0000000..c2f4315 --- /dev/null +++ b/objparser.h @@ -0,0 +1,14 @@ +#pragma once +struct Obj { + float* vertices; // sets of 3 floats + float* texture; // sets of 2 floats + float* normals; // sets of 3 floats + int vertices_count; // count of sets(vertices, textures, normals) + + int* indices; // layout: vvv/ttt/nnn + int indices_count; // 1 count == 1 full face == 3vertex indices, 3 texture coordinate indices, 3 normal indices + size_t memory_taken; +}; + +Obj Obj_Parse(char* memory, size_t memory_size, char* data); +void Obj_Test(); diff --git a/platform.cpp b/platform.cpp index b0237b2..80c9cdf 100644 --- a/platform.cpp +++ b/platform.cpp @@ -1,7 +1,13 @@ +/* +* The OS layer should expect ABGR writes to the screen, the bitmap is bottom up(origin 0,0 is in left bottom corner) +*/ + +#define _CRT_SECURE_NO_WARNINGS #include "platform.h" #include #include + typedef HRESULT tSetProcessDpiAwareness(PROCESS_DPI_AWARENESS); Image screen; @@ -49,7 +55,7 @@ void Win32_ScreenInit(int window_x, int window_y) { BITMAPINFO bminfo = {}; bminfo.bmiHeader.biSize = sizeof(bminfo.bmiHeader); bminfo.bmiHeader.biWidth = window_x; - bminfo.bmiHeader.biHeight = -window_y; + bminfo.bmiHeader.biHeight = window_y; bminfo.bmiHeader.biPlanes = 1; bminfo.bmiHeader.biBitCount = 32; bminfo.bmiHeader.biCompression = BI_RGB; // AA RR GG BB @@ -134,10 +140,21 @@ bool OS_GameLoop() { Win32_ScreenInit((LONG)screen.x, (LONG)screen.y); } + // @Note: Draw screen to window + U32* p = screen.pixels; + if (p != 0) { + // @Note: Convert 0xABGR to 0xARGB + for (int y = 0; y < screen.y; y++) { + for (int x = 0; x < screen.x; x++) { + *p = ((*p & 0xff000000)) | ((*p & 0x00ff0000) >> 16) | ((*p & 0x0000ff00)) | ((*p & 0x000000ff) << 16); + p += 1; + } + } - // @Note; Draw screen to window - SelectObject(g_screen_dc, g_screen_dib); - BitBlt(g_window_dc, 0, 0, (int)screen.x, (int)screen.y, g_screen_dc, 0, 0, SRCCOPY); + SelectObject(g_screen_dc, g_screen_dib); + BitBlt(g_window_dc, 0, 0, (int)screen.x, (int)screen.y, g_screen_dc, 0, 0, SRCCOPY); + } + Sleep(16); return g_app_is_running; } @@ -147,4 +164,40 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine g_hinstance = hInstance; g_cmdshow = nCmdShow; return main(); +} + +#include +void OS_Message(const char* format, ...) { + char buffer[1024]; + va_list args; + va_start(args, format); + vsnprintf(buffer, 1024, format, args); + va_end(args); + + MessageBoxA(0, buffer, "Error!", 0); +} + +char* OS_ReadFile(const char* path) { + char* result = 0; + FILE* f = fopen(path, "rb"); + if (f) { + fseek(f, 0, SEEK_END); + U64 fsize = ftell(f); + fseek(f, 0, SEEK_SET); + + result = (char*)malloc(fsize + 1ll); + if (result) { + fread(result, fsize, 1, f); + result[fsize] = 0; + } + else { + ASSERT(!"Malloc failed!") + } + fclose(f); + } + else { + ASSERT(!"Failed to read file"); + } + + return result; } \ No newline at end of file diff --git a/platform.h b/platform.h index 6e3bac2..a3b850f 100644 --- a/platform.h +++ b/platform.h @@ -17,4 +17,5 @@ extern bool keydown_a; extern bool keydown_b; bool OS_GameLoop(); -void OS_Init(OSInitArgs); \ No newline at end of file +void OS_Init(OSInitArgs); +char* OS_ReadFile(const char* path); \ No newline at end of file