From 426504c748372729ae37d22d3f6dd17dfc000432 Mon Sep 17 00:00:00 2001 From: Riyyi Date: Mon, 26 Oct 2026 15:14:04 +0100 Subject: [PATCH] Add obj model loading and suzanne test model --- assets/suzanne.obj | 2027 ++++++++++++++++++++++++++++++++++++++++ src/core/obj.odin | 148 +++ src/main.odin | 12 + src/platform/wgpu.odin | 67 +- 4 files changed, 2205 insertions(+), 49 deletions(-) create mode 100644 assets/suzanne.obj create mode 100644 src/core/obj.odin diff --git a/assets/suzanne.obj b/assets/suzanne.obj new file mode 100644 index 0000000..2709117 --- /dev/null +++ b/assets/suzanne.obj @@ -0,0 +1,2027 @@ +# Low-poly Suzanne with spherical UVs projected from normals +# Original: https://github.com/alecjacobson/common-3d-test-models/blob/master/data/suzanne.obj + +v -2.056562 1.415748 4.869517 +v -2.931562 1.415748 4.869517 +v -1.994062 1.345436 4.791392 +v -2.994062 1.345436 4.791392 +v -1.947187 1.306373 4.682017 +v -3.040937 1.306373 4.682017 +v -2.142500 1.228248 4.721080 +v -2.845625 1.228248 4.721080 +v -2.142500 1.282936 4.822642 +v -2.845625 1.282936 4.822642 +v -2.142500 1.384498 4.885142 +v -2.845625 1.384498 4.885142 +v -2.220625 1.415748 4.900767 +v -2.767500 1.415748 4.900767 +v -2.290937 1.345436 4.846080 +v -2.697187 1.345436 4.846080 +v -2.337812 1.306373 4.752330 +v -2.650312 1.306373 4.752330 +v -2.415937 1.493873 4.760142 +v -2.572187 1.493873 4.760142 +v -2.353437 1.493873 4.846080 +v -2.634687 1.493873 4.846080 +v -2.251875 1.493873 4.900767 +v -2.736250 1.493873 4.900767 +v -2.220625 1.579811 4.900767 +v -2.767500 1.579811 4.900767 +v -2.290937 1.642311 4.846080 +v -2.697187 1.642311 4.846080 +v -2.337812 1.689186 4.752330 +v -2.650312 1.689186 4.752330 +v -2.142500 1.767311 4.721080 +v -2.845625 1.767311 4.721080 +v -2.142500 1.704811 4.822642 +v -2.845625 1.704811 4.822642 +v -2.142500 1.611061 4.885142 +v -2.845625 1.611061 4.885142 +v -2.056562 1.579811 4.869517 +v -2.931562 1.579811 4.869517 +v -1.994062 1.642311 4.791392 +v -2.994062 1.642311 4.791392 +v -1.947187 1.689186 4.682017 +v -3.040937 1.689186 4.682017 +v -1.869062 1.493873 4.666392 +v -3.119062 1.493873 4.666392 +v -1.931562 1.493873 4.775767 +v -3.056562 1.493873 4.775767 +v -2.025312 1.493873 4.861705 +v -2.962812 1.493873 4.861705 +v -2.017500 1.493873 4.877330 +v -2.970625 1.493873 4.877330 +v -2.048750 1.587623 4.885142 +v -2.939375 1.587623 4.885142 +v -2.142500 1.626686 4.908580 +v -2.845625 1.626686 4.908580 +v -2.228437 1.587623 4.924205 +v -2.759687 1.587623 4.924205 +v -2.267500 1.493873 4.924205 +v -2.720625 1.493873 4.924205 +v -2.228437 1.407936 4.924205 +v -2.759687 1.407936 4.924205 +v -2.142500 1.493873 4.932017 +v -2.845625 1.493873 4.932017 +v -2.142500 1.368873 4.908580 +v -2.845625 1.368873 4.908580 +v -2.048750 1.407936 4.885142 +v -2.939375 1.407936 4.885142 +v -2.494062 1.681373 4.846080 +v -2.494062 1.603248 4.924205 +v -2.494062 0.571998 4.838267 +v -2.494062 0.931373 4.885142 +v -2.494062 1.064186 4.900767 +v -2.494062 0.478248 4.822642 +v -2.494062 1.657936 4.705455 +v -2.494062 1.821998 4.674205 +v -2.494062 2.150123 3.557017 +v -2.494062 1.814186 3.252330 +v -2.494062 1.321998 3.275767 +v -2.494062 0.868873 3.752330 +v -2.290937 1.064186 4.666392 +v -2.697187 1.064186 4.666392 +v -2.181562 0.814186 4.674205 +v -2.806562 0.814186 4.674205 +v -2.142500 0.556373 4.674205 +v -2.845625 0.556373 4.674205 +v -2.126875 0.361061 4.635142 +v -2.861250 0.361061 4.635142 +v -2.165937 0.306373 4.627330 +v -2.822187 0.306373 4.627330 +v -2.314375 0.282936 4.658580 +v -2.673750 0.282936 4.658580 +v -2.494062 0.267311 4.682017 +v -2.056562 1.111061 4.635142 +v -2.931562 1.111061 4.635142 +v -1.861250 1.212623 4.642955 +v -3.126875 1.212623 4.642955 +v -1.665937 1.400123 4.549205 +v -3.322187 1.400123 4.549205 +v -1.634687 1.681373 4.697642 +v -3.353437 1.681373 4.697642 +v -1.783125 1.736061 4.728892 +v -3.205000 1.736061 4.728892 +v -2.001875 1.853248 4.791392 +v -2.986250 1.853248 4.791392 +v -2.173750 2.009498 4.838267 +v -2.814375 2.009498 4.838267 +v -2.337812 1.970436 4.861705 +v -2.650312 1.970436 4.861705 +v -2.431562 1.743873 4.853892 +v -2.556562 1.743873 4.853892 +v -2.330000 1.665748 4.877330 +v -2.658125 1.665748 4.877330 +v -2.369062 1.556373 4.869517 +v -2.619062 1.556373 4.869517 +v -2.290937 1.345436 4.846080 +v -2.697187 1.345436 4.846080 +v -2.119062 1.267311 4.807017 +v -2.869062 1.267311 4.807017 +v -2.001875 1.314186 4.775767 +v -2.986250 1.314186 4.775767 +v -1.869062 1.439186 4.752330 +v -3.119062 1.439186 4.752330 +v -1.853437 1.548561 4.752330 +v -3.134687 1.548561 4.752330 +v -1.892500 1.626686 4.767955 +v -3.095625 1.626686 4.767955 +v -2.064375 1.689186 4.822642 +v -2.923750 1.689186 4.822642 +v -2.244062 1.720436 4.861705 +v -2.744062 1.720436 4.861705 +v -2.494062 0.486061 4.838267 +v -2.384687 0.532936 4.838267 +v -2.603437 0.532936 4.838267 +v -2.376875 0.415748 4.814830 +v -2.611250 0.415748 4.814830 +v -2.431562 0.368873 4.799205 +v -2.556562 0.368873 4.799205 +v -2.494062 0.361061 4.791392 +v -2.494062 1.056373 4.853892 +v -2.494062 1.111061 4.846080 +v -2.392500 1.103248 4.846080 +v -2.595625 1.103248 4.846080 +v -2.369062 1.025123 4.853892 +v -2.619062 1.025123 4.853892 +v -2.408125 0.962623 4.846080 +v -2.580000 0.962623 4.846080 +v -2.095625 1.204811 4.775767 +v -2.892500 1.204811 4.775767 +v -1.876875 1.306373 4.728892 +v -3.111250 1.306373 4.728892 +v -1.767500 1.454811 4.705455 +v -3.220625 1.454811 4.705455 +v -1.751875 1.626686 4.760142 +v -3.236250 1.626686 4.760142 +v -1.806562 1.665748 4.830455 +v -3.181562 1.665748 4.830455 +v -2.056562 1.798561 4.900767 +v -2.931562 1.798561 4.900767 +v -2.181562 1.892311 4.939830 +v -2.806562 1.892311 4.939830 +v -2.290937 1.868873 4.955455 +v -2.697187 1.868873 4.955455 +v -2.392500 1.681373 4.947642 +v -2.595625 1.681373 4.947642 +v -2.369062 1.150123 4.916392 +v -2.619062 1.150123 4.916392 +v -2.283125 0.806373 4.814830 +v -2.705000 0.806373 4.814830 +v -2.244062 0.548561 4.791392 +v -2.744062 0.548561 4.791392 +v -2.228437 0.431373 4.767955 +v -2.759687 0.431373 4.767955 +v -2.259687 0.337623 4.736705 +v -2.728437 0.337623 4.736705 +v -2.330000 0.321998 4.736705 +v -2.658125 0.321998 4.736705 +v -2.494062 0.306373 4.744517 +v -2.494062 1.298561 4.830455 +v -2.494062 1.462623 4.869517 +v -2.165937 1.728248 4.846080 +v -2.822187 1.728248 4.846080 +v -2.330000 1.392311 4.853892 +v -2.658125 1.392311 4.853892 +v -2.361250 1.462623 4.861705 +v -2.626875 1.462623 4.861705 +v -2.376875 0.564186 4.838267 +v -2.611250 0.564186 4.838267 +v -2.415937 0.806373 4.853892 +v -2.572187 0.806373 4.853892 +v -2.494062 0.806373 4.853892 +v -2.494062 0.923561 4.846080 +v -2.400312 0.978248 4.885142 +v -2.587812 0.978248 4.885142 +v -2.361250 1.025123 4.900767 +v -2.626875 1.025123 4.900767 +v -2.384687 1.118873 4.885142 +v -2.603437 1.118873 4.885142 +v -2.455000 1.126686 4.885142 +v -2.533125 1.126686 4.885142 +v -2.494062 1.048561 4.932017 +v -2.447187 1.103248 4.916392 +v -2.540937 1.103248 4.916392 +v -2.400312 1.095436 4.916392 +v -2.587812 1.095436 4.916392 +v -2.384687 1.025123 4.932017 +v -2.603437 1.025123 4.932017 +v -2.415937 1.001686 4.908580 +v -2.572187 1.001686 4.908580 +v -2.494062 0.962623 4.908580 +v -2.236250 0.939186 4.658580 +v -2.751875 0.939186 4.658580 +v -2.330000 1.009498 4.814830 +v -2.658125 1.009498 4.814830 +v -2.314375 0.939186 4.814830 +v -2.673750 0.939186 4.814830 +v -2.259687 1.001686 4.658580 +v -2.728437 1.001686 4.658580 +v -2.494062 0.376686 4.791392 +v -2.447187 0.384498 4.791392 +v -2.540937 0.384498 4.791392 +v -2.400312 0.431373 4.814830 +v -2.587812 0.431373 4.814830 +v -2.400312 0.509498 4.830455 +v -2.587812 0.509498 4.830455 +v -2.494062 0.470436 4.760142 +v -2.400312 0.501686 4.767955 +v -2.587812 0.501686 4.767955 +v -2.400312 0.439186 4.744517 +v -2.587812 0.439186 4.744517 +v -2.447187 0.400123 4.736705 +v -2.540937 0.400123 4.736705 +v -2.494062 0.392311 4.736705 +v -2.322187 1.470436 4.885142 +v -2.665937 1.470436 4.885142 +v -2.306562 1.407936 4.877330 +v -2.681562 1.407936 4.877330 +v -2.158125 1.681373 4.861705 +v -2.830000 1.681373 4.861705 +v -2.220625 1.673561 4.877330 +v -2.767500 1.673561 4.877330 +v -2.072187 1.650123 4.877330 +v -2.915937 1.650123 4.877330 +v -1.931562 1.603248 4.799205 +v -3.056562 1.603248 4.799205 +v -1.908125 1.540748 4.791392 +v -3.080000 1.540748 4.791392 +v -1.915937 1.446998 4.783580 +v -3.072187 1.446998 4.783580 +v -2.017500 1.353248 4.822642 +v -2.970625 1.353248 4.822642 +v -2.119062 1.314186 4.846080 +v -2.869062 1.314186 4.846080 +v -2.267500 1.361061 4.885142 +v -2.720625 1.361061 4.885142 +v -2.314375 1.548561 4.885142 +v -2.673750 1.548561 4.885142 +v -2.283125 1.626686 4.885142 +v -2.705000 1.626686 4.885142 +v -2.259687 1.611061 4.861705 +v -2.728437 1.611061 4.861705 +v -2.298750 1.548561 4.861705 +v -2.689375 1.548561 4.861705 +v -2.251875 1.376686 4.861705 +v -2.736250 1.376686 4.861705 +v -2.119062 1.337623 4.830455 +v -2.869062 1.337623 4.830455 +v -2.033125 1.368873 4.807017 +v -2.955000 1.368873 4.807017 +v -1.947187 1.462623 4.775767 +v -3.040937 1.462623 4.775767 +v -1.939375 1.532936 4.775767 +v -3.048750 1.532936 4.775767 +v -1.962812 1.587623 4.783580 +v -3.025312 1.587623 4.783580 +v -2.080000 1.642311 4.853892 +v -2.908125 1.642311 4.853892 +v -2.212812 1.650123 4.869517 +v -2.775312 1.650123 4.869517 +v -2.158125 1.657936 4.853892 +v -2.830000 1.657936 4.853892 +v -2.290937 1.423561 4.853892 +v -2.697187 1.423561 4.853892 +v -2.298750 1.478248 4.853892 +v -2.689375 1.478248 4.853892 +v -2.384687 1.712623 4.713267 +v -2.603437 1.712623 4.713267 +v -2.298750 1.915748 4.721080 +v -2.689375 1.915748 4.721080 +v -2.158125 1.939186 4.697642 +v -2.830000 1.939186 4.697642 +v -2.009687 1.806373 4.658580 +v -2.978437 1.806373 4.658580 +v -1.814375 1.704811 4.596080 +v -3.173750 1.704811 4.596080 +v -1.697187 1.657936 4.564830 +v -3.290937 1.657936 4.564830 +v -1.720625 1.415748 4.478892 +v -3.267500 1.415748 4.478892 +v -1.892500 1.251686 4.517955 +v -3.095625 1.251686 4.517955 +v -2.056562 1.157936 4.572642 +v -2.931562 1.157936 4.572642 +v -2.494062 2.150123 4.392955 +v -2.494062 2.236061 4.025767 +v -2.494062 1.056373 3.432017 +v -2.494062 0.790748 4.291392 +v -2.494062 0.275123 4.564830 +v -2.494062 0.446998 4.447642 +v -2.494062 0.681373 4.424205 +v -2.494062 0.767311 4.385142 +v -1.642500 1.486061 4.158580 +v -3.345625 1.486061 4.158580 +v -1.634687 1.571998 4.057017 +v -3.353437 1.571998 4.057017 +v -1.720625 1.517311 3.666392 +v -3.267500 1.517311 3.666392 +v -2.033125 1.689186 3.400767 +v -2.955000 1.689186 3.400767 +v -1.759687 1.204811 4.174205 +v -3.228437 1.204811 4.174205 +v -1.900312 1.126686 3.939830 +v -3.087812 1.126686 3.939830 +v -1.853437 1.243873 3.674205 +v -3.134687 1.243873 3.674205 +v -2.158125 1.306373 3.439830 +v -2.830000 1.306373 3.439830 +v -2.259687 0.900123 4.510142 +v -2.728437 0.900123 4.510142 +v -2.314375 0.837623 4.361705 +v -2.673750 0.837623 4.361705 +v -2.205000 0.540748 4.486705 +v -2.783125 0.540748 4.486705 +v -2.244062 0.751686 4.494517 +v -2.744062 0.751686 4.494517 +v -2.165937 0.337623 4.502330 +v -2.822187 0.337623 4.502330 +v -2.353437 0.493873 4.471080 +v -2.634687 0.493873 4.471080 +v -2.369062 0.712623 4.463267 +v -2.619062 0.712623 4.463267 +v -2.330000 0.306373 4.541392 +v -2.658125 0.306373 4.541392 +v -2.275312 0.970436 4.533580 +v -2.712812 0.970436 4.533580 +v -2.283125 1.025123 4.572642 +v -2.705000 1.025123 4.572642 +v -2.290937 1.079811 4.603892 +v -2.697187 1.079811 4.603892 +v -2.283125 0.861061 4.267955 +v -2.705000 0.861061 4.267955 +v -2.197187 0.939186 3.838267 +v -2.790937 0.939186 3.838267 +v -2.150312 1.103248 3.564830 +v -2.837812 1.103248 3.564830 +v -2.040937 2.118873 3.721080 +v -2.947187 2.118873 3.721080 +v -2.040937 2.181373 4.033580 +v -2.947187 2.181373 4.033580 +v -2.040937 2.103248 4.338267 +v -2.947187 2.103248 4.338267 +v -2.033125 1.775123 4.533580 +v -2.955000 1.775123 4.533580 +v -1.767500 1.657936 4.439830 +v -3.220625 1.657936 4.439830 +v -1.861250 1.704811 4.385142 +v -3.126875 1.704811 4.385142 +v -1.853437 1.954811 4.158580 +v -3.134687 1.954811 4.158580 +v -1.697187 1.814186 4.228892 +v -3.290937 1.814186 4.228892 +v -1.697187 1.868873 3.986705 +v -3.290937 1.868873 3.986705 +v -1.853437 2.001686 3.908580 +v -3.134687 2.001686 3.908580 +v -1.853437 1.931373 3.658580 +v -3.134687 1.931373 3.658580 +v -1.697187 1.790748 3.744517 +v -3.290937 1.790748 3.744517 +v -1.876875 1.579811 3.517955 +v -3.111250 1.579811 3.517955 +v -2.009687 1.275123 3.557017 +v -2.978437 1.275123 3.557017 +v -1.673750 1.579811 3.900767 +v -3.314375 1.579811 3.900767 +v -2.087812 1.079811 4.252330 +v -2.900312 1.079811 4.252330 +v -2.064375 1.056373 3.892955 +v -2.923750 1.056373 3.892955 +v -1.603437 1.657936 3.869517 +v -3.384687 1.657936 3.869517 +v -1.720625 1.111061 3.978892 +v -3.267500 1.111061 3.978892 +v -1.455000 1.150123 3.775767 +v -3.533125 1.150123 3.775767 +v -1.212812 1.306373 3.674205 +v -3.775312 1.306373 3.674205 +v -1.142500 1.571998 3.682017 +v -3.845625 1.571998 3.682017 +v -1.259687 1.759498 3.682017 +v -3.728437 1.759498 3.682017 +v -1.470625 1.728248 3.791392 +v -3.517500 1.728248 3.791392 +v -1.478437 1.665748 3.814830 +v -3.509687 1.665748 3.814830 +v -1.306562 1.689186 3.713267 +v -3.681562 1.689186 3.713267 +v -1.228437 1.540748 3.697642 +v -3.759687 1.540748 3.697642 +v -1.283125 1.329811 3.697642 +v -3.705000 1.329811 3.697642 +v -1.462812 1.212623 3.799205 +v -3.525312 1.212623 3.799205 +v -1.665937 1.181373 3.971080 +v -3.322187 1.181373 3.971080 +v -1.572187 1.611061 3.885142 +v -3.415937 1.611061 3.885142 +v -1.548750 1.556373 3.814830 +v -3.439375 1.556373 3.814830 +v -1.611250 1.228248 3.892955 +v -3.376875 1.228248 3.892955 +v -1.455000 1.251686 3.736705 +v -3.533125 1.251686 3.736705 +v -1.306562 1.345436 3.658580 +v -3.681562 1.345436 3.658580 +v -1.259687 1.501686 3.658580 +v -3.728437 1.501686 3.658580 +v -1.322187 1.611061 3.666392 +v -3.665937 1.611061 3.666392 +v -1.470625 1.595436 3.744517 +v -3.517500 1.595436 3.744517 +v -1.650312 1.540748 3.892955 +v -3.337812 1.540748 3.892955 +v -1.658125 1.423561 3.830455 +v -3.330000 1.423561 3.830455 +v -1.736250 1.345436 3.830455 +v -3.251875 1.345436 3.830455 +v -1.673750 1.337623 3.830455 +v -3.314375 1.337623 3.830455 +v -1.650312 1.267311 3.830455 +v -3.337812 1.267311 3.830455 +v -1.681562 1.236061 3.830455 +v -3.306562 1.236061 3.830455 +v -1.767500 1.251686 4.033580 +v -3.220625 1.251686 4.033580 +v -1.775312 1.228248 3.932017 +v -3.212812 1.228248 3.932017 +v -1.775312 1.290748 3.916392 +v -3.212812 1.290748 3.916392 +v -1.697187 1.454811 3.892955 +v -3.290937 1.454811 3.892955 +v -1.603437 1.493873 3.838267 +v -3.384687 1.493873 3.838267 +v -1.603437 1.486061 3.783580 +v -3.384687 1.486061 3.783580 +v -1.681562 1.236061 3.783580 +v -3.306562 1.236061 3.783580 +v -1.642500 1.267311 3.783580 +v -3.345625 1.267311 3.783580 +v -1.665937 1.329811 3.783580 +v -3.322187 1.329811 3.783580 +v -1.728437 1.345436 3.783580 +v -3.259687 1.345436 3.783580 +v -1.650312 1.423561 3.783580 +v -3.337812 1.423561 3.783580 +v -1.455000 1.579811 3.689830 +v -3.533125 1.579811 3.689830 +v -1.306562 1.595436 3.619517 +v -3.681562 1.595436 3.619517 +v -1.236250 1.493873 3.611705 +v -3.751875 1.493873 3.611705 +v -1.283125 1.337623 3.619517 +v -3.705000 1.337623 3.619517 +v -1.447187 1.251686 3.682017 +v -3.540937 1.251686 3.682017 +v -1.611250 1.236061 3.838267 +v -3.376875 1.236061 3.838267 +v -1.540937 1.540748 3.760142 +v -3.447187 1.540748 3.760142 +v -1.603437 1.361061 3.775767 +v -3.384687 1.361061 3.775767 +v -1.556562 1.314186 3.767955 +v -3.431562 1.314186 3.767955 +v -1.494062 1.376686 3.736705 +v -3.494062 1.376686 3.736705 +v -1.533125 1.423561 3.752330 +v -3.455000 1.423561 3.752330 +v -1.478437 1.486061 3.728892 +v -3.509687 1.486061 3.728892 +v -1.439375 1.439186 3.721080 +v -3.548750 1.439186 3.721080 +v -1.384687 1.462623 3.713267 +v -3.603437 1.462623 3.713267 +v -1.408125 1.525123 3.713267 +v -3.580000 1.525123 3.713267 +v -1.470625 1.689186 3.619517 +v -3.517500 1.689186 3.619517 +v -1.244062 1.720436 3.557017 +v -3.744062 1.720436 3.557017 +v -1.126875 1.548561 3.603892 +v -3.861250 1.548561 3.603892 +v -1.181562 1.306373 3.572642 +v -3.806562 1.306373 3.572642 +v -1.455000 1.165748 3.611705 +v -3.533125 1.165748 3.611705 +v -1.705000 1.126686 3.775767 +v -3.283125 1.126686 3.775767 +v -1.634687 1.634498 3.721080 +v -3.353437 1.634498 3.721080 + +vn 0.744549 -0.641131 0.186007 +vn -0.744549 -0.641135 0.185990 +vn 0.593552 -0.495629 0.634073 +vn -0.593552 -0.495628 0.634073 +vn 0.726064 -0.489782 0.482643 +vn -0.726065 -0.489782 0.482643 +vn 0.198563 -0.855598 0.478042 +vn -0.198565 -0.855598 0.478042 +vn 0.091223 -0.725621 0.682021 +vn -0.091225 -0.725621 0.682021 +vn 0.046116 -0.973171 0.225414 +vn -0.046117 -0.973172 0.225411 +vn -0.656055 -0.697111 0.289186 +vn 0.656055 -0.697112 0.289182 +vn -0.440476 -0.506551 0.741207 +vn 0.440475 -0.506551 0.741207 +vn -0.463936 -0.713118 0.525573 +vn 0.463935 -0.713118 0.525573 +vn -0.809357 -0.119573 0.575016 +vn 0.809357 -0.119573 0.575016 +vn -0.660726 0.021820 0.750310 +vn 0.660725 0.021820 0.750311 +vn -0.955303 -0.046529 0.291944 +vn 0.955305 -0.046528 0.291938 +vn -0.676272 0.683287 0.275273 +vn 0.676273 0.683288 0.275267 +vn -0.418820 0.523547 0.741949 +vn 0.418818 0.523547 0.741950 +vn -0.632962 0.520278 0.573297 +vn 0.632962 0.520279 0.573297 +vn -0.032385 0.843750 0.535759 +vn 0.032383 0.843750 0.535759 +vn 0.135725 0.712196 0.688735 +vn -0.135726 0.712195 0.688736 +vn 0.000631 0.976783 0.214230 +vn -0.000633 0.976784 0.214226 +vn 0.701855 0.695741 0.152787 +vn -0.701855 0.695744 0.152777 +vn 0.608004 0.463823 0.644360 +vn -0.608005 0.463822 0.644359 +vn 0.578414 0.637318 0.509179 +vn -0.578415 0.637317 0.509179 +vn 0.863645 0.100108 0.494060 +vn -0.863645 0.100108 0.494060 +vn 0.783218 -0.021833 0.621364 +vn -0.783218 -0.021833 0.621364 +vn 0.987715 0.020040 0.154978 +vn -0.987718 0.020040 0.154956 +vn 0.986294 -0.118289 0.115033 +vn -0.986297 -0.118290 0.115001 +vn 0.825852 0.552509 0.112707 +vn -0.825851 0.552515 0.112682 +vn 0.139749 0.980044 0.141363 +vn -0.139749 0.980045 0.141357 +vn -0.599263 0.769389 0.221189 +vn 0.599265 0.769390 0.221181 +vn -0.968075 0.109759 0.225353 +vn 0.968078 0.109758 0.225340 +vn -0.748936 -0.624746 0.220879 +vn 0.748939 -0.624746 0.220868 +vn 0.189796 -0.003576 0.981817 +vn -0.189796 -0.003576 0.981817 +vn -0.085221 -0.982491 0.165674 +vn 0.085221 -0.982493 0.165668 +vn 0.648157 -0.754514 0.102961 +vn -0.648155 -0.754518 0.102946 +vn -0.000000 0.999601 0.028245 +vn -0.000000 -0.018779 0.999824 +vn -0.000000 -0.032743 0.999464 +vn 0.000000 -0.756086 0.654472 +vn -0.000001 0.782774 0.622306 +vn 0.000000 -0.811665 0.584123 +vn 0.000000 0.810772 0.585362 +vn 0.000000 0.614191 0.789158 +vn 0.000000 0.799040 -0.601277 +vn 0.000000 0.142262 -0.989829 +vn 0.000000 -0.386661 -0.922222 +vn 0.000000 -0.966535 -0.256536 +vn 0.887333 -0.441670 0.132545 +vn -0.887334 -0.441667 0.132546 +vn 0.959259 0.242257 0.145376 +vn -0.959259 0.242256 0.145374 +vn 0.981339 0.088384 0.170768 +vn -0.981339 0.088385 0.170770 +vn 0.941440 -0.247448 0.229044 +vn -0.941438 -0.247453 0.229043 +vn 0.443961 -0.878842 0.174746 +vn -0.443960 -0.878843 0.174745 +vn 0.143554 -0.975951 0.164049 +vn -0.143554 -0.975951 0.164049 +vn 0.000000 -0.982151 0.188096 +vn 0.381482 -0.898015 0.219182 +vn -0.381481 -0.898016 0.219181 +vn 0.623678 -0.776036 0.093775 +vn -0.623678 -0.776036 0.093775 +vn 0.850917 -0.515866 0.099115 +vn -0.850918 -0.515864 0.099115 +vn 0.931249 0.287483 0.223893 +vn -0.931249 0.287485 0.223893 +vn 0.508880 0.835177 0.208616 +vn -0.508880 0.835177 0.208616 +vn 0.580300 0.798739 0.158960 +vn -0.580300 0.798738 0.158961 +vn 0.319891 0.918776 0.231344 +vn -0.319891 0.918776 0.231344 +vn -0.629913 0.759084 0.164320 +vn 0.629912 0.759085 0.164321 +vn -0.805357 0.573938 0.148310 +vn 0.805356 0.573939 0.148311 +vn 0.229229 -0.223676 0.947324 +vn -0.229230 -0.223676 0.947324 +vn -0.042742 -0.171659 0.984229 +vn 0.042743 -0.171659 0.984229 +vn -0.095146 -0.340371 0.935465 +vn 0.095146 -0.340371 0.935465 +vn 0.277124 -0.471622 0.837123 +vn -0.277122 -0.471622 0.837124 +vn 0.454068 -0.358653 0.815592 +vn -0.454068 -0.358651 0.815593 +vn 0.420506 -0.193062 0.886511 +vn -0.420507 -0.193062 0.886511 +vn 0.339980 -0.203723 0.918102 +vn -0.339978 -0.203723 0.918102 +vn 0.293708 -0.159744 0.942453 +vn -0.293706 -0.159747 0.942453 +vn 0.169830 -0.011826 0.985403 +vn -0.169829 -0.011827 0.985403 +vn 0.198639 -0.085172 0.976365 +vn -0.198639 -0.085171 0.976365 +vn 0.000000 -0.226739 0.973956 +vn 0.208739 -0.289570 0.934118 +vn -0.208741 -0.289571 0.934118 +vn 0.019890 -0.331221 0.943344 +vn -0.019892 -0.331221 0.943344 +vn -0.069727 -0.355688 0.932000 +vn 0.069726 -0.355688 0.932000 +vn 0.000000 -0.134023 0.990978 +vn -0.000005 0.713994 0.700152 +vn -0.000002 0.736985 0.675910 +vn 0.694082 0.165340 0.700652 +vn -0.694079 0.165336 0.700656 +vn 0.812713 -0.275017 0.513676 +vn -0.812710 -0.275019 0.513679 +vn 0.417795 -0.228653 0.879298 +vn -0.417793 -0.228653 0.879299 +vn 0.317106 -0.511441 0.798669 +vn -0.317105 -0.511441 0.798669 +vn 0.430282 -0.426643 0.795509 +vn -0.430281 -0.426643 0.795509 +vn 0.524900 -0.304432 0.794859 +vn -0.524900 -0.304431 0.794860 +vn 0.416202 -0.250431 0.874106 +vn -0.416202 -0.250430 0.874106 +vn 0.329807 -0.157403 0.930834 +vn -0.329805 -0.157402 0.930835 +vn 0.324233 -0.003486 0.945971 +vn -0.324232 -0.003488 0.945971 +vn 0.261828 -0.052976 0.963660 +vn -0.261827 -0.052977 0.963660 +vn 0.104751 0.085932 0.990779 +vn -0.104752 0.085933 0.990779 +vn -0.314788 0.090835 0.944806 +vn 0.314786 0.090834 0.944806 +vn 0.141702 -0.305627 0.941548 +vn -0.141701 -0.305628 0.941548 +vn 0.494873 0.079293 0.865340 +vn -0.494873 0.079293 0.865340 +vn 0.570964 -0.019941 0.820733 +vn -0.570963 -0.019943 0.820734 +vn 0.580696 -0.193698 0.790742 +vn -0.580694 -0.193699 0.790743 +vn 0.393891 -0.505580 0.767619 +vn -0.393891 -0.505580 0.767619 +vn 0.165815 -0.755257 0.634108 +vn -0.165815 -0.755256 0.634108 +vn 0.000000 -0.783642 0.621213 +vn 0.000000 -0.124146 0.992264 +vn 0.000000 -0.208426 0.978038 +vn 0.169503 0.069874 0.983050 +vn -0.169503 0.069875 0.983050 +vn -0.374568 -0.272458 0.886265 +vn 0.374570 -0.272460 0.886264 +vn -0.217567 -0.206485 0.953954 +vn 0.217571 -0.206487 0.953953 +vn 0.134944 -0.042751 0.989931 +vn -0.134944 -0.042752 0.989931 +vn 0.151117 0.005755 0.988499 +vn -0.151117 0.005755 0.988499 +vn -0.000000 -0.003623 0.999993 +vn 0.000001 -0.761950 0.647635 +vn 0.570966 -0.761970 0.305613 +vn -0.570964 -0.761970 0.305616 +vn 0.922647 -0.276599 0.268729 +vn -0.922646 -0.276600 0.268733 +vn 0.617310 0.769752 0.162514 +vn -0.617308 0.769753 0.162517 +vn -0.446278 0.799589 0.401862 +vn 0.446275 0.799591 0.401863 +vn 0.000000 0.043292 0.999062 +vn -0.327391 0.634587 0.700082 +vn 0.327392 0.634589 0.700079 +vn 0.235261 0.518102 0.822328 +vn -0.235259 0.518101 0.822329 +vn 0.474477 -0.086582 0.875999 +vn -0.474472 -0.086580 0.876002 +vn 0.233670 -0.601708 0.763771 +vn -0.233668 -0.601708 0.763772 +vn 0.000000 -0.524078 0.851670 +vn 0.940470 0.316447 0.124008 +vn -0.940469 0.316448 0.124007 +vn 0.714310 0.072516 0.696062 +vn -0.714309 0.072518 0.696063 +vn 0.680480 0.142211 0.718834 +vn -0.680479 0.142211 0.718835 +vn 0.949918 0.284455 0.129386 +vn -0.949917 0.284460 0.129387 +vn 0.000000 0.803078 0.595874 +vn -0.415198 0.544313 0.728926 +vn 0.415197 0.544313 0.728927 +vn -0.748024 0.071372 0.659822 +vn 0.748024 0.071371 0.659823 +vn -0.115791 -0.704084 0.700612 +vn 0.115790 -0.704085 0.700612 +vn 0.000000 -0.756225 0.654312 +vn -0.512578 -0.533809 0.672541 +vn 0.512578 -0.533809 0.672541 +vn -0.809757 0.389148 0.439155 +vn 0.809757 0.389148 0.439155 +vn -0.200691 0.420161 0.884979 +vn 0.200691 0.420161 0.884979 +vn 0.000000 0.470805 0.882237 +vn 0.240765 -0.044205 0.969576 +vn -0.240758 -0.044211 0.969578 +vn 0.044527 0.037762 0.998294 +vn -0.044519 0.037761 0.998295 +vn 0.199136 0.067539 0.977642 +vn -0.199135 0.067538 0.977642 +vn 0.202031 -0.013155 0.979291 +vn -0.202032 -0.013157 0.979290 +vn 0.172704 -0.152636 0.973075 +vn -0.172702 -0.152641 0.973075 +vn 0.263283 -0.273505 0.925136 +vn -0.263283 -0.273508 0.925135 +vn 0.123750 -0.116216 0.985485 +vn -0.123752 -0.116218 0.985484 +vn 0.172509 -0.091171 0.980780 +vn -0.172511 -0.091169 0.980779 +vn 0.222169 -0.014805 0.974896 +vn -0.222168 -0.014805 0.974896 +vn 0.100423 -0.080636 0.991672 +vn -0.100423 -0.080636 0.991672 +vn -0.015210 0.003306 0.999879 +vn 0.015210 0.003306 0.999879 +vn 0.309990 -0.089122 0.946553 +vn -0.309989 -0.089123 0.946554 +vn 0.257810 -0.095783 0.961436 +vn -0.257814 -0.095785 0.961435 +vn 0.417005 -0.380076 0.825620 +vn -0.417010 -0.380080 0.825616 +vn 0.731669 -0.248021 0.634937 +vn -0.731671 -0.248022 0.634936 +vn 0.453675 0.550651 0.700687 +vn -0.453672 0.550654 0.700687 +vn 0.234332 0.605888 0.760256 +vn -0.234334 0.605887 0.760256 +vn -0.070900 0.566761 0.820826 +vn 0.070900 0.566761 0.820826 +vn -0.221668 0.321694 0.920530 +vn 0.221668 0.321695 0.920530 +vn -0.345101 -0.092448 0.934001 +vn 0.345101 -0.092448 0.934002 +vn -0.265988 -0.494942 0.827214 +vn 0.265987 -0.494946 0.827212 +vn -0.109424 -0.804387 0.583942 +vn 0.109426 -0.804388 0.583940 +vn 0.279564 -0.306381 0.909931 +vn -0.279564 -0.306386 0.909930 +vn -0.078164 -0.565154 0.821275 +vn 0.078166 -0.565157 0.821272 +vn 0.709680 0.261843 0.654059 +vn -0.709676 0.261840 0.654065 +vn 0.810746 -0.008670 0.585334 +vn -0.810741 -0.008675 0.585340 +vn -0.482085 0.844842 -0.232027 +vn 0.482085 0.844842 -0.232028 +vn -0.609699 0.493969 -0.619888 +vn 0.609698 0.493970 -0.619889 +vn -0.058329 0.653253 -0.754889 +vn 0.058329 0.653253 -0.754890 +vn 0.334772 0.886218 -0.320227 +vn -0.334772 0.886218 -0.320227 +vn 0.358195 0.904137 -0.232878 +vn -0.358196 0.904137 -0.232878 +vn 0.681637 0.688456 -0.247789 +vn -0.681638 0.688455 -0.247788 +vn 0.956167 -0.210612 -0.203440 +vn -0.956167 -0.210612 -0.203438 +vn 0.578278 -0.805993 -0.126371 +vn -0.578278 -0.805994 -0.126371 +vn 0.429587 -0.901935 0.044373 +vn -0.429586 -0.901935 0.044373 +vn 0.000000 0.892861 0.450333 +vn 0.000000 0.998895 -0.047007 +vn 0.000000 -0.776068 -0.630649 +vn 0.000001 -0.984877 -0.173255 +vn 0.000000 -0.816082 -0.577937 +vn -0.000000 -0.200262 -0.979742 +vn 0.000000 -0.419857 -0.907590 +vn 0.000000 -0.836066 -0.548629 +vn 0.998259 -0.038013 0.045091 +vn -0.998259 -0.038011 0.045090 +vn 0.994030 -0.083803 -0.069866 +vn -0.994030 -0.083804 -0.069866 +vn 0.636186 0.103506 -0.764561 +vn -0.636186 0.103506 -0.764561 +vn 0.477294 0.208444 -0.853664 +vn -0.477294 0.208444 -0.853664 +vn 0.740004 -0.669530 0.064215 +vn -0.740001 -0.669533 0.064214 +vn 0.221852 -0.968740 0.111012 +vn -0.221851 -0.968741 0.111012 +vn 0.342729 -0.673725 -0.654700 +vn -0.342729 -0.673725 -0.654699 +vn 0.420089 -0.289134 -0.860190 +vn -0.420090 -0.289135 -0.860189 +vn 0.921833 -0.093595 -0.376118 +vn -0.921833 -0.093595 -0.376117 +vn 0.521752 -0.673983 -0.522993 +vn -0.521752 -0.673984 -0.522992 +vn 0.545206 -0.051256 -0.836734 +vn -0.545204 -0.051256 -0.836735 +vn 0.796508 0.051873 -0.602398 +vn -0.796509 0.051874 -0.602398 +vn 0.650781 -0.528647 -0.544993 +vn -0.650777 -0.528650 -0.544994 +vn 0.134914 -0.240760 -0.961162 +vn -0.134914 -0.240760 -0.961162 +vn 0.362281 -0.163067 -0.917694 +vn -0.362282 -0.163067 -0.917693 +vn 0.090537 -0.742480 -0.663721 +vn -0.090537 -0.742480 -0.663721 +vn 0.967844 -0.233331 0.093988 +vn -0.967844 -0.233331 0.093987 +vn 0.981236 0.016739 0.192084 +vn -0.981235 0.016744 0.192088 +vn 0.784297 -0.582022 0.214775 +vn -0.784298 -0.582019 0.214780 +vn 0.673283 -0.738826 -0.028755 +vn -0.673283 -0.738826 -0.028754 +vn 0.533136 -0.800351 -0.274235 +vn -0.533135 -0.800351 -0.274236 +vn 0.475358 -0.596819 -0.646407 +vn -0.475358 -0.596819 -0.646407 +vn 0.436555 0.806326 -0.399072 +vn -0.436555 0.806326 -0.399072 +vn 0.438624 0.895681 0.073246 +vn -0.438624 0.895681 0.073246 +vn 0.507394 0.654986 0.559951 +vn -0.507394 0.654986 0.559950 +vn 0.295527 0.855845 0.424492 +vn -0.295527 0.855845 0.424492 +vn 0.676401 0.722564 0.142769 +vn -0.676401 0.722564 0.142769 +vn 0.460709 0.829043 0.316915 +vn -0.460709 0.829043 0.316914 +vn 0.623302 0.711607 0.324208 +vn -0.623302 0.711607 0.324207 +vn 0.758273 0.522530 0.389852 +vn -0.758273 0.522532 0.389850 +vn 0.909693 0.413092 -0.042585 +vn -0.909692 0.413093 -0.042584 +vn 0.680046 0.729090 -0.077239 +vn -0.680046 0.729090 -0.077239 +vn 0.654844 0.469492 -0.592247 +vn -0.654844 0.469493 -0.592246 +vn 0.835092 0.433025 -0.339279 +vn -0.835092 0.433026 -0.339279 +vn 0.587294 0.004057 -0.809363 +vn -0.587295 0.004057 -0.809363 +vn 0.548417 -0.549112 -0.630646 +vn -0.548417 -0.549113 -0.630645 +vn 0.763071 0.353906 0.540807 +vn -0.763072 0.353902 0.540810 +vn 0.556024 -0.801065 0.221657 +vn -0.556024 -0.801065 0.221657 +vn 0.552236 -0.830225 -0.075907 +vn -0.552236 -0.830225 -0.075908 +vn -0.460194 0.803504 0.377628 +vn 0.460195 0.803503 0.377630 +vn 0.129877 -0.820144 0.557221 +vn -0.129879 -0.820143 0.557223 +vn 0.503473 -0.728045 0.465259 +vn -0.503475 -0.728042 0.465261 +vn 0.634847 -0.434173 0.639111 +vn -0.634848 -0.434174 0.639110 +vn 0.713246 -0.000662 0.700914 +vn -0.713245 -0.000663 0.700914 +vn 0.582267 0.569749 0.579958 +vn -0.582266 0.569750 0.579958 +vn 0.150244 0.799125 0.582087 +vn -0.150246 0.799124 0.582089 +vn 0.574395 -0.275233 0.770920 +vn -0.574395 -0.275231 0.770920 +vn 0.119230 -0.162489 0.979480 +vn -0.119231 -0.162490 0.979480 +vn -0.285778 0.051786 0.956896 +vn 0.285776 0.051785 0.956896 +vn -0.093292 0.370177 0.924265 +vn 0.093291 0.370176 0.924266 +vn 0.427351 0.360245 0.829214 +vn -0.427352 0.360242 0.829214 +vn 0.249603 0.459587 0.852337 +vn -0.249605 0.459587 0.852336 +vn 0.456392 -0.052966 0.888201 +vn -0.456391 -0.052967 0.888202 +vn 0.699370 -0.572308 0.428189 +vn -0.699368 -0.572310 0.428189 +vn 0.139544 0.939092 0.314061 +vn -0.139547 0.939090 0.314064 +vn -0.256122 0.944677 0.204907 +vn 0.256122 0.944677 0.204907 +vn -0.854875 0.517361 0.039073 +vn 0.854875 0.517361 0.039069 +vn -0.934120 -0.268117 0.235653 +vn 0.934120 -0.268120 0.235649 +vn 0.019926 -0.819685 0.572468 +vn -0.019929 -0.819685 0.572468 +vn 0.553012 -0.687920 0.470047 +vn -0.553011 -0.687921 0.470046 +vn 0.783996 -0.216400 0.581826 +vn -0.783994 -0.216403 0.581828 +vn 0.738335 -0.583214 0.338709 +vn -0.738336 -0.583213 0.338707 +vn 0.703545 0.392748 0.592262 +vn -0.703547 0.392747 0.592260 +vn 0.721390 0.604614 0.337696 +vn -0.721390 0.604614 0.337695 +vn 0.757221 -0.174031 0.629546 +vn -0.757219 -0.174034 0.629548 +vn 0.376053 0.806512 0.456205 +vn -0.376053 0.806511 0.456206 +vn 0.934580 -0.326692 -0.140825 +vn -0.934579 -0.326695 -0.140828 +vn 0.845685 -0.031983 0.532724 +vn -0.845685 -0.031990 0.532723 +vn 0.901335 -0.301082 0.311359 +vn -0.901335 -0.301082 0.311359 +vn 0.907453 -0.364513 0.208948 +vn -0.907452 -0.364513 0.208951 +vn 0.715184 -0.550517 0.430630 +vn -0.715185 -0.550518 0.430629 +vn 0.592637 -0.357194 0.721937 +vn -0.592638 -0.357196 0.721936 +vn 0.532336 -0.054753 0.844761 +vn -0.532338 -0.054776 0.844758 +vn 0.762926 0.030666 0.645759 +vn -0.762926 0.030658 0.645758 +vn 0.350231 0.467136 0.811864 +vn -0.350231 0.467137 0.811863 +vn 0.796416 -0.208812 0.567556 +vn -0.796424 -0.208815 0.567543 +vn 0.563973 -0.428285 0.706050 +vn -0.563977 -0.428286 0.706046 +vn 0.470725 -0.297931 0.830455 +vn -0.470724 -0.297934 0.830454 +vn -0.006657 -0.339708 0.940507 +vn 0.006651 -0.339712 0.940506 +vn -0.597653 -0.539425 0.593154 +vn 0.597651 -0.539432 0.593149 +vn -0.352039 0.494906 0.794441 +vn 0.352042 0.494907 0.794439 +vn 0.274753 0.724349 0.632321 +vn -0.274753 0.724349 0.632321 +vn 0.146530 0.841516 0.519981 +vn -0.146536 0.841513 0.519984 +vn 0.637644 -0.428925 0.639870 +vn -0.637642 -0.428931 0.639868 +vn 0.220583 0.001357 0.975367 +vn -0.220582 0.001356 0.975368 +vn 0.280002 0.070554 0.957403 +vn -0.280007 0.070547 0.957402 +vn 0.420629 -0.038177 0.906429 +vn -0.420629 -0.038178 0.906429 +vn 0.316495 0.002597 0.948591 +vn -0.316495 0.002597 0.948591 +vn 0.295360 0.085862 0.951520 +vn -0.295359 0.085863 0.951520 +vn 0.395136 -0.210076 0.894279 +vn -0.395135 -0.210073 0.894280 +vn 0.411877 -0.000033 0.911239 +vn -0.411878 -0.000032 0.911239 +vn 0.336126 0.297821 0.893489 +vn -0.336127 0.297820 0.893489 +vn -0.470371 0.467296 -0.748589 +vn 0.470370 0.467296 -0.748589 +vn 0.158755 0.689125 -0.707039 +vn -0.158752 0.689125 -0.707039 +vn 0.938817 0.267060 -0.217489 +vn -0.938816 0.267061 -0.217491 +vn 0.658782 -0.392485 -0.641843 +vn -0.658781 -0.392487 -0.641843 +vn 0.103976 -0.828371 -0.550445 +vn -0.103977 -0.828371 -0.550445 +vn -0.035369 -0.732159 -0.680214 +vn 0.035367 -0.732160 -0.680214 +vn -0.488877 0.515727 -0.703580 +vn 0.488878 0.515726 -0.703580 + +vt 0.538963 0.721534 +vt 0.961040 0.721536 +vt 0.630251 0.665062 +vt 0.869749 0.665062 +vt 0.593371 0.662924 +vt 0.906629 0.662924 +vt 0.687343 0.826810 +vt 0.812657 0.826810 +vt 0.728838 0.758447 +vt 0.771162 0.758447 +vt 0.717883 0.926100 +vt 0.782118 0.926102 +vt 0.933923 0.745532 +vt 0.566076 0.745532 +vt 0.835338 0.669080 +vt 0.664662 0.669080 +vt 0.865099 0.752718 +vt 0.634901 0.752718 +vt 0.901688 0.538153 +vt 0.598312 0.538153 +vt 0.864909 0.493054 +vt 0.635091 0.493054 +vt 0.952796 0.514816 +vt 0.547203 0.514816 +vt 0.938476 0.260550 +vt 0.561522 0.260549 +vt 0.831789 0.324608 +vt 0.668211 0.324608 +vt 0.882866 0.325828 +vt 0.617134 0.325828 +vt 0.759609 0.180343 +vt 0.740392 0.180343 +vt 0.719033 0.247701 +vt 0.780967 0.247701 +vt 0.749531 0.068725 +vt 0.750470 0.068723 +vt 0.534114 0.255076 +vt 0.965888 0.255075 +vt 0.629619 0.346477 +vt 0.870381 0.346478 +vt 0.614882 0.280044 +vt 0.885118 0.280044 +vt 0.582701 0.468081 +vt 0.917299 0.468081 +vt 0.606741 0.506950 +vt 0.893259 0.506950 +vt 0.524770 0.493621 +vt 0.975233 0.493621 +vt 0.518479 0.537741 +vt 0.981526 0.537741 +vt 0.521587 0.313670 +vt 0.978418 0.313668 +vt 0.625914 0.063698 +vt 0.874090 0.063697 +vt 0.943724 0.220561 +vt 0.556273 0.220560 +vt 0.963599 0.464992 +vt 0.536398 0.464992 +vt 0.954355 0.714797 +vt 0.545642 0.714797 +vt 0.719608 0.501138 +vt 0.780392 0.501138 +vt 0.825613 0.940347 +vt 0.674384 0.940351 +vt 0.525073 0.772127 +vt 0.974931 0.772129 +vt 0.750000 0.008992 +vt 0.750000 0.505978 +vt 0.750000 0.510424 +vt 0.750000 0.772891 +vt 0.750000 0.213804 +vt 0.750000 0.801438 +vt 0.750000 0.199048 +vt 0.750000 0.289482 +vt 0.250000 0.205342 +vt 0.250000 0.454562 +vt 0.250000 0.626372 +vt 0.250000 0.917419 +vt 0.523599 0.645614 +vt 0.976401 0.645613 +vt 0.523938 0.422112 +vt 0.976062 0.422113 +vt 0.527421 0.471830 +vt 0.972579 0.471829 +vt 0.537983 0.579592 +vt 0.962017 0.579594 +vt 0.559680 0.841683 +vt 0.940320 0.841684 +vt 0.635589 0.930050 +vt 0.864411 0.930050 +vt 0.750000 0.939769 +vt 0.582999 0.854991 +vt 0.917001 0.854992 +vt 0.523752 0.782773 +vt 0.976248 0.782773 +vt 0.518455 0.672530 +vt 0.981545 0.672529 +vt 0.537552 0.407182 +vt 0.962448 0.407181 +vt 0.561920 0.185365 +vt 0.938080 0.185365 +vt 0.542553 0.205501 +vt 0.957447 0.205501 +vt 0.599651 0.129179 +vt 0.900349 0.129179 +vt 0.959388 0.225647 +vt 0.540613 0.225647 +vt 0.971016 0.305415 +vt 0.528985 0.305415 +vt 0.712215 0.571806 +vt 0.787785 0.571806 +vt 0.756907 0.554913 +vt 0.743093 0.554913 +vt 0.766132 0.610553 +vt 0.733868 0.610553 +vt 0.699120 0.656331 +vt 0.800880 0.656331 +vt 0.669149 0.616764 +vt 0.830850 0.616763 +vt 0.679509 0.561842 +vt 0.820491 0.561842 +vt 0.693556 0.565304 +vt 0.806444 0.565304 +vt 0.701919 0.551067 +vt 0.798081 0.551068 +vt 0.722837 0.503764 +vt 0.777163 0.503765 +vt 0.718056 0.527144 +vt 0.781944 0.527144 +vt 0.750000 0.572806 +vt 0.715010 0.593512 +vt 0.784990 0.593513 +vt 0.746645 0.607461 +vt 0.753356 0.607461 +vt 0.761885 0.615753 +vt 0.738115 0.615753 +vt 0.750000 0.542790 +vt 0.750001 0.246884 +vt 0.750000 0.236249 +vt 0.625750 0.447128 +vt 0.874249 0.447129 +vt 0.589708 0.588683 +vt 0.910291 0.588684 +vt 0.679404 0.573432 +vt 0.820596 0.573432 +vt 0.689847 0.670888 +vt 0.810153 0.670888 +vt 0.671088 0.640304 +vt 0.828912 0.640304 +vt 0.657112 0.598467 +vt 0.842887 0.598466 +vt 0.679274 0.580572 +vt 0.820726 0.580572 +vt 0.695806 0.550312 +vt 0.804194 0.550312 +vt 0.697447 0.501110 +vt 0.802553 0.501110 +vt 0.707777 0.516871 +vt 0.792223 0.516871 +vt 0.733235 0.472613 +vt 0.766765 0.472613 +vt 0.801186 0.471046 +vt 0.698814 0.471047 +vt 0.726226 0.598866 +vt 0.773774 0.598866 +vt 0.667321 0.474734 +vt 0.832679 0.474734 +vt 0.653263 0.506348 +vt 0.846737 0.506348 +vt 0.649188 0.562048 +vt 0.850812 0.562049 +vt 0.674545 0.668721 +vt 0.825455 0.668721 +vt 0.709294 0.772488 +vt 0.790706 0.772487 +vt 0.750000 0.786640 +vt 0.750000 0.539619 +vt 0.750000 0.566834 +vt 0.722825 0.477740 +vt 0.777175 0.477740 +vt 0.813641 0.587837 +vt 0.686359 0.587837 +vt 0.785688 0.566202 +vt 0.714311 0.566203 +vt 0.728437 0.513612 +vt 0.771563 0.513613 +vt 0.725856 0.498168 +vt 0.774144 0.498168 +vt 0.750000 0.501153 +vt 0.750000 0.775758 +vt 0.578217 0.775768 +vt 0.921782 0.775768 +vt 0.545107 0.589207 +vt 0.954892 0.589208 +vt 0.540970 0.220380 +vt 0.959029 0.220379 +vt 0.883327 0.205051 +vt 0.616674 0.205050 +vt 0.750000 0.486215 +vt 0.819619 0.281170 +vt 0.680380 0.281169 +vt 0.705652 0.326639 +vt 0.794348 0.326639 +vt 0.670995 0.527594 +vt 0.829004 0.527594 +vt 0.702747 0.705513 +vt 0.797253 0.705513 +vt 0.750000 0.675590 +vt 0.520865 0.397510 +vt 0.979135 0.397510 +vt 0.622941 0.476897 +vt 0.877059 0.476897 +vt 0.629361 0.454579 +vt 0.870639 0.454579 +vt 0.521546 0.408187 +vt 0.978454 0.408186 +vt 0.750000 0.203194 +vt 0.832405 0.316790 +vt 0.667595 0.316790 +vt 0.884958 0.477262 +vt 0.615042 0.477263 +vt 0.776068 0.748642 +vt 0.723932 0.748643 +vt 0.750000 0.772958 +vt 0.853647 0.679240 +vt 0.646353 0.679240 +vt 0.920910 0.372769 +vt 0.579090 0.372769 +vt 0.785492 0.361974 +vt 0.714508 0.361974 +vt 0.750000 0.343964 +vt 0.711262 0.514075 +vt 0.788737 0.514077 +vt 0.742906 0.487977 +vt 0.757093 0.487977 +vt 0.718019 0.478485 +vt 0.781981 0.478486 +vt 0.717620 0.504187 +vt 0.782380 0.504188 +vt 0.722044 0.548776 +vt 0.777956 0.548778 +vt 0.705873 0.588183 +vt 0.794127 0.588184 +vt 0.730119 0.537076 +vt 0.769882 0.537077 +vt 0.722290 0.529061 +vt 0.777711 0.529060 +vt 0.714339 0.504713 +vt 0.785661 0.504713 +vt 0.733938 0.525695 +vt 0.766062 0.525695 +vt 0.752421 0.498948 +vt 0.747579 0.498948 +vt 0.699630 0.528406 +vt 0.800370 0.528406 +vt 0.708303 0.530535 +vt 0.791697 0.530536 +vt 0.675563 0.624102 +vt 0.824439 0.624104 +vt 0.613753 0.579780 +vt 0.886247 0.579781 +vt 0.658550 0.314380 +vt 0.841449 0.314378 +vt 0.702415 0.292818 +vt 0.797586 0.292818 +vt 0.763713 0.308196 +vt 0.736287 0.308196 +vt 0.787609 0.395748 +vt 0.712391 0.395747 +vt 0.806329 0.529469 +vt 0.693671 0.529469 +vt 0.799514 0.664811 +vt 0.700486 0.664812 +vt 0.779482 0.797506 +vt 0.720517 0.797507 +vt 0.702559 0.599118 +vt 0.797441 0.599120 +vt 0.765102 0.691183 +vt 0.734898 0.691184 +vt 0.618512 0.415670 +vt 0.881486 0.415671 +vt 0.599523 0.502760 +vt 0.900476 0.502761 +vt 0.071393 0.179694 +vt 0.428607 0.179694 +vt 0.126319 0.335546 +vt 0.373681 0.335545 +vt 0.237727 0.273404 +vt 0.262273 0.273404 +vt 0.378534 0.153323 +vt 0.121466 0.153323 +vt 0.408251 0.140515 +vt 0.091749 0.140515 +vt 0.444508 0.258289 +vt 0.055492 0.258289 +vt 0.466635 0.567546 +vt 0.033365 0.567546 +vt 0.465758 0.798368 +vt 0.034242 0.798369 +vt 0.516381 0.857853 +vt 0.983619 0.857853 +vt 0.750000 0.148694 +vt 0.250000 0.014965 +vt 0.250000 0.782789 +vt 0.250001 0.944572 +vt 0.250000 0.803858 +vt 0.250000 0.564179 +vt 0.250000 0.637920 +vt 0.250000 0.815150 +vt 0.507184 0.512103 +vt 0.992816 0.512102 +vt 0.488832 0.526707 +vt 0.011168 0.526707 +vt 0.360454 0.466994 +vt 0.139546 0.466994 +vt 0.331139 0.433160 +vt 0.168861 0.433160 +vt 0.513776 0.733504 +vt 0.986224 0.733506 +vt 0.573841 0.920201 +vt 0.926159 0.920202 +vt 0.326754 0.735307 +vt 0.173245 0.735307 +vt 0.322304 0.593367 +vt 0.177696 0.593368 +vt 0.438344 0.529836 +vt 0.061655 0.529836 +vt 0.374811 0.735418 +vt 0.125189 0.735418 +vt 0.341911 0.516322 +vt 0.158090 0.516322 +vt 0.396944 0.483481 +vt 0.103056 0.483481 +vt 0.389044 0.677300 +vt 0.110957 0.677302 +vt 0.272195 0.577397 +vt 0.227805 0.577397 +vt 0.309841 0.552139 +vt 0.190159 0.552139 +vt 0.271577 0.766351 +vt 0.228423 0.766351 +vt 0.515407 0.574963 +vt 0.984593 0.574963 +vt 0.530767 0.494672 +vt 0.969233 0.494670 +vt 0.542541 0.697738 +vt 0.957458 0.697737 +vt 0.493207 0.764619 +vt 0.006793 0.764619 +vt 0.424388 0.795354 +vt 0.075613 0.795354 +vt 0.350917 0.703569 +vt 0.149083 0.703569 +vt 0.382134 0.201453 +vt 0.117866 0.201453 +vt 0.526334 0.146689 +vt 0.973666 0.146689 +vt 0.632831 0.272675 +vt 0.867170 0.272675 +vt 0.653208 0.173038 +vt 0.846792 0.173038 +vt 0.533107 0.242963 +vt 0.966893 0.242963 +vt 0.595899 0.188886 +vt 0.904102 0.188886 +vt 0.576336 0.247968 +vt 0.923664 0.247968 +vt 0.575581 0.324988 +vt 0.924419 0.324988 +vt 0.492555 0.364449 +vt 0.007445 0.364448 +vt 0.482000 0.239944 +vt 0.018000 0.239944 +vt 0.382982 0.344437 +vt 0.117018 0.344437 +vt 0.438581 0.357446 +vt 0.061419 0.357446 +vt 0.349904 0.498709 +vt 0.150095 0.498709 +vt 0.363918 0.685034 +vt 0.136082 0.685034 +vt 0.598128 0.384853 +vt 0.901872 0.384855 +vt 0.560374 0.795733 +vt 0.939626 0.795733 +vt 0.478260 0.811788 +vt 0.021741 0.811788 +vt 0.890634 0.202967 +vt 0.609366 0.202967 +vt 0.713555 0.806107 +vt 0.786446 0.806106 +vt 0.618725 0.759571 +vt 0.881275 0.759569 +vt 0.625533 0.642959 +vt 0.874468 0.642960 +vt 0.623612 0.500211 +vt 0.876388 0.500211 +vt 0.624684 0.307040 +vt 0.875316 0.307040 +vt 0.709798 0.205297 +vt 0.790203 0.205297 +vt 0.648086 0.588755 +vt 0.851914 0.588754 +vt 0.730721 0.551952 +vt 0.769279 0.551953 +vt 0.796190 0.483509 +vt 0.703811 0.483509 +vt 0.766010 0.379297 +vt 0.733990 0.379297 +vt 0.674263 0.382693 +vt 0.825737 0.382694 +vt 0.704660 0.347997 +vt 0.795340 0.347997 +vt 0.674456 0.516867 +vt 0.825544 0.516868 +vt 0.587436 0.693952 +vt 0.912564 0.693953 +vt 0.683454 0.111669 +vt 0.816547 0.111671 +vt 0.892608 0.106375 +vt 0.607392 0.106375 +vt 0.992731 0.326914 +vt 0.507269 0.326914 +vt 0.960670 0.586401 +vt 0.539329 0.586402 +vt 0.744462 0.805852 +vt 0.755538 0.805852 +vt 0.612122 0.741476 +vt 0.887879 0.741476 +vt 0.601612 0.569432 +vt 0.898388 0.569433 +vt 0.568453 0.698205 +vt 0.931547 0.698205 +vt 0.611365 0.371524 +vt 0.888635 0.371525 +vt 0.569681 0.293327 +vt 0.930319 0.293327 +vt 0.610388 0.555679 +vt 0.889611 0.555680 +vt 0.640281 0.201353 +vt 0.859719 0.201353 +vt 0.476197 0.605934 +vt 0.023803 0.605935 +vt 0.589467 0.510182 +vt 0.910533 0.510184 +vt 0.552936 0.597348 +vt 0.947064 0.597348 +vt 0.536019 0.618765 +vt 0.963981 0.618765 +vt 0.586259 0.685569 +vt 0.913741 0.685570 +vt 0.640604 0.616266 +vt 0.859396 0.616267 +vt 0.660507 0.517437 +vt 0.839494 0.517444 +vt 0.611793 0.490237 +vt 0.888207 0.490240 +vt 0.685181 0.345286 +vt 0.814819 0.345285 +vt 0.598542 0.566960 +vt 0.901461 0.566961 +vt 0.642731 0.640882 +vt 0.857270 0.640882 +vt 0.667928 0.596297 +vt 0.832072 0.596298 +vt 0.751126 0.610328 +vt 0.748875 0.610330 +vt 0.875601 0.681358 +vt 0.624398 0.681361 +vt 0.816387 0.335202 +vt 0.683612 0.335202 +vt 0.684762 0.242140 +vt 0.815238 0.242140 +vt 0.706284 0.181664 +vt 0.793717 0.181665 +vt 0.625277 0.641108 +vt 0.874723 0.641110 +vt 0.714602 0.499568 +vt 0.785398 0.499568 +vt 0.704716 0.477523 +vt 0.795284 0.477526 +vt 0.680851 0.512155 +vt 0.819149 0.512155 +vt 0.698747 0.499173 +vt 0.801253 0.499173 +vt 0.702098 0.472636 +vt 0.797902 0.472635 +vt 0.683783 0.567371 +vt 0.816217 0.567370 +vt 0.682437 0.500011 +vt 0.817564 0.500010 +vt 0.692733 0.403740 +vt 0.807267 0.403740 +vt 0.160714 0.345228 +vt 0.339286 0.345228 +vt 0.285153 0.257995 +vt 0.214848 0.257995 +vt 0.463769 0.413948 +vt 0.036232 0.413947 +vt 0.377073 0.628385 +vt 0.122927 0.628385 +vt 0.279713 0.810732 +vt 0.220286 0.810732 +vt 0.241732 0.761487 +vt 0.258268 0.761488 +vt 0.153352 0.327522 +vt 0.346648 0.327522 + +f 1/1/1 3/3/3 45/45/45 47/47/47 +f 2/2/2 48/48/48 46/46/46 4/4/4 +f 3/3/3 5/5/5 43/43/43 45/45/45 +f 4/4/4 46/46/46 44/44/44 6/6/6 +f 9/9/9 7/7/7 5/5/5 3/3/3 +f 10/10/10 4/4/4 6/6/6 8/8/8 +f 11/11/11 9/9/9 3/3/3 1/1/1 +f 12/12/12 2/2/2 4/4/4 10/10/10 +f 13/13/13 15/15/15 9/9/9 11/11/11 +f 14/14/14 12/12/12 10/10/10 16/16/16 +f 15/15/15 17/17/17 7/7/7 9/9/9 +f 16/16/16 10/10/10 8/8/8 18/18/18 +f 21/21/21 19/19/19 17/17/17 15/15/15 +f 22/22/22 16/16/16 18/18/18 20/20/20 +f 23/23/23 21/21/21 15/15/15 13/13/13 +f 24/24/24 14/14/14 16/16/16 22/22/22 +f 25/25/25 27/27/27 21/21/21 23/23/23 +f 26/26/26 24/24/24 22/22/22 28/28/28 +f 27/27/27 29/29/29 19/19/19 21/21/21 +f 28/28/28 22/22/22 20/20/20 30/30/30 +f 33/33/33 31/31/31 29/29/29 27/27/27 +f 34/34/34 28/28/28 30/30/30 32/32/32 +f 35/35/35 33/33/33 27/27/27 25/25/25 +f 36/36/36 26/26/26 28/28/28 34/34/34 +f 37/37/37 39/39/39 33/33/33 35/35/35 +f 38/38/38 36/36/36 34/34/34 40/40/40 +f 39/39/39 41/41/41 31/31/31 33/33/33 +f 40/40/40 34/34/34 32/32/32 42/42/42 +f 45/45/45 43/43/43 41/41/41 39/39/39 +f 46/46/46 40/40/40 42/42/42 44/44/44 +f 47/47/47 45/45/45 39/39/39 37/37/37 +f 48/48/48 38/38/38 40/40/40 46/46/46 +f 37/37/37 51/51/51 49/49/49 47/47/47 +f 38/38/38 48/48/48 50/50/50 52/52/52 +f 35/35/35 53/53/53 51/51/51 37/37/37 +f 36/36/36 38/38/38 52/52/52 54/54/54 +f 25/25/25 55/55/55 53/53/53 35/35/35 +f 26/26/26 36/36/36 54/54/54 56/56/56 +f 23/23/23 57/57/57 55/55/55 25/25/25 +f 24/24/24 26/26/26 56/56/56 58/58/58 +f 13/13/13 59/59/59 57/57/57 23/23/23 +f 14/14/14 24/24/24 58/58/58 60/60/60 +f 11/11/11 63/63/63 59/59/59 13/13/13 +f 12/12/12 14/14/14 60/60/60 64/64/64 +f 1/1/1 65/65/65 63/63/63 11/11/11 +f 2/2/2 12/12/12 64/64/64 66/66/66 +f 47/47/47 49/49/49 65/65/65 1/1/1 +f 48/48/48 2/2/2 66/66/66 50/50/50 +f 65/65/65 49/49/49 61/61/61 +f 66/66/66 62/62/62 50/50/50 +f 65/65/65 61/61/61 63/63/63 +f 66/66/66 64/64/64 62/62/62 +f 59/59/59 63/63/63 61/61/61 +f 60/60/60 62/62/62 64/64/64 +f 57/57/57 59/59/59 61/61/61 +f 58/58/58 62/62/62 60/60/60 +f 55/55/55 57/57/57 61/61/61 +f 56/56/56 62/62/62 58/58/58 +f 53/53/53 55/55/55 61/61/61 +f 54/54/54 62/62/62 56/56/56 +f 51/51/51 53/53/53 61/61/61 +f 52/52/52 62/62/62 54/54/54 +f 49/49/49 51/51/51 61/61/61 +f 50/50/50 62/62/62 52/52/52 +f 174/174/174 176/176/176 91/91/91 89/89/89 +f 175/175/175 90/90/90 91/91/91 176/176/176 +f 172/172/172 174/174/174 89/89/89 87/87/87 +f 173/173/173 88/88/88 90/90/90 175/175/175 +f 170/170/170 172/172/172 87/87/87 85/85/85 +f 171/171/171 86/86/86 88/88/88 173/173/173 +f 168/168/168 170/170/170 85/85/85 83/83/83 +f 169/169/169 84/84/84 86/86/86 171/171/171 +f 166/166/166 168/168/168 83/83/83 81/81/81 +f 167/167/167 82/82/82 84/84/84 169/169/169 +f 92/92/92 146/146/146 164/164/164 79/79/79 +f 93/93/93 80/80/80 165/165/165 147/147/147 +f 94/94/94 148/148/148 146/146/146 92/92/92 +f 95/95/95 93/93/93 147/147/147 149/149/149 +f 96/96/96 150/150/150 148/148/148 94/94/94 +f 97/97/97 95/95/95 149/149/149 151/151/151 +f 98/98/98 152/152/152 150/150/150 96/96/96 +f 99/99/99 97/97/97 151/151/151 153/153/153 +f 100/100/100 154/154/154 152/152/152 98/98/98 +f 101/101/101 99/99/99 153/153/153 155/155/155 +f 102/102/102 156/156/156 154/154/154 100/100/100 +f 103/103/103 101/101/101 155/155/155 157/157/157 +f 104/104/104 158/158/158 156/156/156 102/102/102 +f 105/105/105 103/103/103 157/157/157 159/159/159 +f 106/106/106 160/160/160 158/158/158 104/104/104 +f 107/107/107 105/105/105 159/159/159 161/161/161 +f 108/108/108 162/162/162 160/160/160 106/106/106 +f 109/109/109 107/107/107 161/161/161 163/163/163 +f 67/67/67 68/68/68 162/162/162 108/108/108 +f 67/67/67 109/109/109 163/163/163 68/68/68 +f 128/128/128 160/160/160 162/162/162 110/110/110 +f 129/129/129 111/111/111 163/163/163 161/161/161 +f 179/179/179 158/158/158 160/160/160 128/128/128 +f 180/180/180 129/129/129 161/161/161 159/159/159 +f 156/156/156 158/158/158 179/179/179 126/126/126 +f 157/157/157 127/127/127 180/180/180 159/159/159 +f 154/154/154 156/156/156 126/126/126 124/124/124 +f 155/155/155 125/125/125 127/127/127 157/157/157 +f 152/152/152 154/154/154 124/124/124 122/122/122 +f 153/153/153 123/123/123 125/125/125 155/155/155 +f 150/150/150 152/152/152 122/122/122 120/120/120 +f 151/151/151 121/121/121 123/123/123 153/153/153 +f 148/148/148 150/150/150 120/120/120 118/118/118 +f 149/149/149 119/119/119 121/121/121 151/151/151 +f 146/146/146 148/148/148 118/118/118 116/116/116 +f 147/147/147 117/117/117 119/119/119 149/149/149 +f 164/164/164 146/146/146 116/116/116 114/114/114 +f 165/165/165 115/115/115 117/117/117 147/147/147 +f 181/181/181 177/177/177 164/164/164 114/114/114 +f 182/182/182 115/115/115 165/165/165 177/177/177 +f 162/162/162 68/68/68 112/112/112 110/110/110 +f 163/163/163 111/111/111 113/113/113 68/68/68 +f 68/68/68 178/178/178 183/183/183 112/112/112 +f 68/68/68 113/113/113 184/184/184 178/178/178 +f 181/181/181 183/183/183 178/178/178 177/177/177 +f 182/182/182 177/177/177 178/178/178 184/184/184 +f 137/137/137 176/176/176 174/174/174 135/135/135 +f 137/137/137 136/136/136 175/175/175 176/176/176 +f 135/135/135 174/174/174 172/172/172 133/133/133 +f 136/136/136 134/134/134 173/173/173 175/175/175 +f 133/133/133 172/172/172 170/170/170 131/131/131 +f 134/134/134 132/132/132 171/171/171 173/173/173 +f 187/187/187 185/185/185 168/168/168 166/166/166 +f 188/188/188 167/167/167 169/169/169 186/186/186 +f 170/170/170 168/168/168 185/185/185 131/131/131 +f 171/171/171 132/132/132 186/186/186 169/169/169 +f 190/190/190 189/189/189 187/187/187 144/144/144 +f 190/190/190 145/145/145 188/188/188 189/189/189 +f 187/187/187 189/189/189 69/69/69 185/185/185 +f 188/188/188 186/186/186 69/69/69 189/189/189 +f 131/131/131 185/185/185 69/69/69 130/130/130 +f 132/132/132 130/130/130 69/69/69 186/186/186 +f 193/193/193 191/191/191 144/144/144 142/142/142 +f 194/194/194 143/143/143 145/145/145 192/192/192 +f 195/195/195 193/193/193 142/142/142 140/140/140 +f 196/196/196 141/141/141 143/143/143 194/194/194 +f 197/197/197 195/195/195 140/140/140 139/139/139 +f 198/198/198 139/139/139 141/141/141 196/196/196 +f 71/71/71 197/197/197 139/139/139 138/138/138 +f 71/71/71 138/138/138 139/139/139 198/198/198 +f 144/144/144 191/191/191 70/70/70 190/190/190 +f 145/145/145 190/190/190 70/70/70 192/192/192 +f 191/191/191 206/206/206 208/208/208 70/70/70 +f 192/192/192 70/70/70 208/208/208 207/207/207 +f 199/199/199 200/200/200 197/197/197 71/71/71 +f 199/199/199 71/71/71 198/198/198 201/201/201 +f 200/200/200 202/202/202 195/195/195 197/197/197 +f 201/201/201 198/198/198 196/196/196 203/203/203 +f 202/202/202 204/204/204 193/193/193 195/195/195 +f 203/203/203 196/196/196 194/194/194 205/205/205 +f 204/204/204 206/206/206 191/191/191 193/193/193 +f 205/205/205 194/194/194 192/192/192 207/207/207 +f 204/204/204 202/202/202 200/200/200 199/199/199 +f 205/205/205 199/199/199 201/201/201 203/203/203 +f 208/208/208 206/206/206 204/204/204 199/199/199 +f 208/208/208 199/199/199 205/205/205 207/207/207 +f 140/140/140 164/164/164 177/177/177 139/139/139 +f 141/141/141 139/139/139 177/177/177 165/165/165 +f 142/142/142 211/211/211 164/164/164 140/140/140 +f 143/143/143 141/141/141 165/165/165 212/212/212 +f 144/144/144 213/213/213 211/211/211 142/142/142 +f 145/145/145 143/143/143 212/212/212 214/214/214 +f 187/187/187 166/166/166 213/213/213 144/144/144 +f 188/188/188 145/145/145 214/214/214 167/167/167 +f 209/209/209 213/213/213 166/166/166 81/81/81 +f 210/210/210 82/82/82 167/167/167 214/214/214 +f 215/215/215 211/211/211 213/213/213 209/209/209 +f 216/216/216 210/210/210 214/214/214 212/212/212 +f 164/164/164 211/211/211 215/215/215 79/79/79 +f 165/165/165 80/80/80 216/216/216 212/212/212 +f 130/130/130 72/72/72 222/222/222 131/131/131 +f 130/130/130 132/132/132 223/223/223 72/72/72 +f 131/131/131 222/222/222 220/220/220 133/133/133 +f 132/132/132 134/134/134 221/221/221 223/223/223 +f 133/133/133 220/220/220 218/218/218 135/135/135 +f 134/134/134 136/136/136 219/219/219 221/221/221 +f 135/135/135 218/218/218 217/217/217 137/137/137 +f 136/136/136 137/137/137 217/217/217 219/219/219 +f 218/218/218 229/229/229 231/231/231 217/217/217 +f 219/219/219 217/217/217 231/231/231 230/230/230 +f 220/220/220 227/227/227 229/229/229 218/218/218 +f 221/221/221 219/219/219 230/230/230 228/228/228 +f 222/222/222 225/225/225 227/227/227 220/220/220 +f 223/223/223 221/221/221 228/228/228 226/226/226 +f 72/72/72 224/224/224 225/225/225 222/222/222 +f 72/72/72 223/223/223 226/226/226 224/224/224 +f 231/231/231 229/229/229 225/225/225 224/224/224 +f 231/231/231 224/224/224 226/226/226 230/230/230 +f 229/229/229 227/227/227 225/225/225 +f 230/230/230 226/226/226 228/228/228 +f 181/181/181 234/234/234 232/232/232 183/183/183 +f 182/182/182 184/184/184 233/233/233 235/235/235 +f 183/183/183 232/232/232 254/254/254 112/112/112 +f 184/184/184 113/113/113 255/255/255 233/233/233 +f 112/112/112 254/254/254 256/256/256 110/110/110 +f 113/113/113 111/111/111 257/257/257 255/255/255 +f 114/114/114 252/252/252 234/234/234 181/181/181 +f 115/115/115 182/182/182 235/235/235 253/253/253 +f 116/116/116 250/250/250 252/252/252 114/114/114 +f 117/117/117 115/115/115 253/253/253 251/251/251 +f 118/118/118 248/248/248 250/250/250 116/116/116 +f 119/119/119 117/117/117 251/251/251 249/249/249 +f 120/120/120 246/246/246 248/248/248 118/118/118 +f 121/121/121 119/119/119 249/249/249 247/247/247 +f 122/122/122 244/244/244 246/246/246 120/120/120 +f 123/123/123 121/121/121 247/247/247 245/245/245 +f 124/124/124 242/242/242 244/244/244 122/122/122 +f 125/125/125 123/123/123 245/245/245 243/243/243 +f 126/126/126 240/240/240 242/242/242 124/124/124 +f 127/127/127 125/125/125 243/243/243 241/241/241 +f 179/179/179 236/236/236 240/240/240 126/126/126 +f 180/180/180 127/127/127 241/241/241 237/237/237 +f 128/128/128 238/238/238 236/236/236 179/179/179 +f 129/129/129 180/180/180 237/237/237 239/239/239 +f 110/110/110 256/256/256 238/238/238 128/128/128 +f 111/111/111 129/129/129 239/239/239 257/257/257 +f 256/256/256 258/258/258 276/276/276 238/238/238 +f 257/257/257 239/239/239 277/277/277 259/259/259 +f 238/238/238 276/276/276 278/278/278 236/236/236 +f 239/239/239 237/237/237 279/279/279 277/277/277 +f 236/236/236 278/278/278 274/274/274 240/240/240 +f 237/237/237 241/241/241 275/275/275 279/279/279 +f 240/240/240 274/274/274 272/272/272 242/242/242 +f 241/241/241 243/243/243 273/273/273 275/275/275 +f 242/242/242 272/272/272 270/270/270 244/244/244 +f 243/243/243 245/245/245 271/271/271 273/273/273 +f 244/244/244 270/270/270 268/268/268 246/246/246 +f 245/245/245 247/247/247 269/269/269 271/271/271 +f 246/246/246 268/268/268 266/266/266 248/248/248 +f 247/247/247 249/249/249 267/267/267 269/269/269 +f 248/248/248 266/266/266 264/264/264 250/250/250 +f 249/249/249 251/251/251 265/265/265 267/267/267 +f 250/250/250 264/264/264 262/262/262 252/252/252 +f 251/251/251 253/253/253 263/263/263 265/265/265 +f 252/252/252 262/262/262 280/280/280 234/234/234 +f 253/253/253 235/235/235 281/281/281 263/263/263 +f 254/254/254 260/260/260 258/258/258 256/256/256 +f 255/255/255 257/257/257 259/259/259 261/261/261 +f 232/232/232 282/282/282 260/260/260 254/254/254 +f 233/233/233 255/255/255 261/261/261 283/283/283 +f 234/234/234 280/280/280 282/282/282 232/232/232 +f 235/235/235 233/233/233 283/283/283 281/281/281 +f 108/108/108 284/284/284 73/73/73 67/67/67 +f 109/109/109 67/67/67 73/73/73 285/285/285 +f 106/106/106 286/286/286 284/284/284 108/108/108 +f 107/107/107 109/109/109 285/285/285 287/287/287 +f 104/104/104 288/288/288 286/286/286 106/106/106 +f 105/105/105 107/107/107 287/287/287 289/289/289 +f 102/102/102 290/290/290 288/288/288 104/104/104 +f 103/103/103 105/105/105 289/289/289 291/291/291 +f 100/100/100 292/292/292 290/290/290 102/102/102 +f 101/101/101 103/103/103 291/291/291 293/293/293 +f 98/98/98 294/294/294 292/292/292 100/100/100 +f 99/99/99 101/101/101 293/293/293 295/295/295 +f 96/96/96 296/296/296 294/294/294 98/98/98 +f 97/97/97 99/99/99 295/295/295 297/297/297 +f 94/94/94 298/298/298 296/296/296 96/96/96 +f 95/95/95 97/97/97 297/297/297 299/299/299 +f 92/92/92 300/300/300 298/298/298 94/94/94 +f 93/93/93 95/95/95 299/299/299 301/301/301 +f 309/309/309 328/328/328 338/338/338 308/308/308 +f 309/309/309 308/308/308 339/339/339 329/329/329 +f 308/308/308 338/338/338 336/336/336 307/307/307 +f 308/308/308 307/307/307 337/337/337 339/339/339 +f 307/307/307 336/336/336 340/340/340 306/306/306 +f 307/307/307 306/306/306 341/341/341 337/337/337 +f 91/91/91 306/306/306 340/340/340 89/89/89 +f 91/91/91 90/90/90 341/341/341 306/306/306 +f 89/89/89 340/340/340 334/334/334 87/87/87 +f 90/90/90 88/88/88 335/335/335 341/341/341 +f 87/87/87 334/334/334 330/330/330 85/85/85 +f 88/88/88 86/86/86 331/331/331 335/335/335 +f 85/85/85 330/330/330 332/332/332 83/83/83 +f 86/86/86 84/84/84 333/333/333 331/331/331 +f 336/336/336 338/338/338 332/332/332 330/330/330 +f 337/337/337 331/331/331 333/333/333 339/339/339 +f 334/334/334 340/340/340 336/336/336 330/330/330 +f 335/335/335 331/331/331 337/337/337 341/341/341 +f 332/332/332 338/338/338 328/328/328 326/326/326 +f 333/333/333 327/327/327 329/329/329 339/339/339 +f 83/83/83 332/332/332 326/326/326 81/81/81 +f 84/84/84 82/82/82 327/327/327 333/333/333 +f 342/342/342 344/344/344 215/215/215 209/209/209 +f 343/343/343 210/210/210 216/216/216 345/345/345 +f 326/326/326 342/342/342 209/209/209 81/81/81 +f 327/327/327 82/82/82 210/210/210 343/343/343 +f 215/215/215 344/344/344 346/346/346 79/79/79 +f 216/216/216 80/80/80 347/347/347 345/345/345 +f 346/346/346 300/300/300 92/92/92 79/79/79 +f 347/347/347 80/80/80 93/93/93 301/301/301 +f 324/324/324 352/352/352 304/304/304 77/77/77 +f 325/325/325 77/77/77 304/304/304 353/353/353 +f 352/352/352 350/350/350 78/78/78 304/304/304 +f 353/353/353 304/304/304 78/78/78 351/351/351 +f 350/350/350 348/348/348 305/305/305 78/78/78 +f 351/351/351 78/78/78 305/305/305 349/349/349 +f 348/348/348 328/328/328 309/309/309 305/305/305 +f 349/349/349 305/305/305 309/309/309 329/329/329 +f 328/328/328 348/348/348 342/342/342 326/326/326 +f 329/329/329 327/327/327 343/343/343 349/349/349 +f 298/298/298 318/318/318 310/310/310 296/296/296 +f 299/299/299 297/297/297 311/311/311 319/319/319 +f 316/316/316 324/324/324 77/77/77 76/76/76 +f 317/317/317 76/76/76 77/77/77 325/325/325 +f 358/358/358 356/356/356 303/303/303 302/302/302 +f 359/359/359 302/302/302 303/303/303 357/357/357 +f 356/356/356 354/354/354 75/75/75 303/303/303 +f 357/357/357 303/303/303 75/75/75 355/355/355 +f 354/354/354 316/316/316 76/76/76 75/75/75 +f 355/355/355 75/75/75 76/76/76 317/317/317 +f 294/294/294 362/362/362 364/364/364 292/292/292 +f 295/295/295 293/293/293 365/365/365 363/363/363 +f 362/362/362 368/368/368 366/366/366 364/364/364 +f 363/363/363 365/365/365 367/367/367 369/369/369 +f 368/368/368 370/370/370 372/372/372 366/366/366 +f 369/369/369 367/367/367 373/373/373 371/371/371 +f 370/370/370 376/376/376 374/374/374 372/372/372 +f 371/371/371 373/373/373 375/375/375 377/377/377 +f 378/378/378 374/374/374 376/376/376 314/314/314 +f 379/379/379 315/315/315 377/377/377 375/375/375 +f 354/354/354 374/374/374 378/378/378 316/316/316 +f 355/355/355 317/317/317 379/379/379 375/375/375 +f 356/356/356 372/372/372 374/374/374 354/354/354 +f 357/357/357 355/355/355 375/375/375 373/373/373 +f 358/358/358 366/366/366 372/372/372 356/356/356 +f 359/359/359 357/357/357 373/373/373 367/367/367 +f 360/360/360 364/364/364 366/366/366 358/358/358 +f 361/361/361 359/359/359 367/367/367 365/365/365 +f 292/292/292 364/364/364 360/360/360 290/290/290 +f 293/293/293 291/291/291 361/361/361 365/365/365 +f 360/360/360 358/358/358 302/302/302 74/74/74 +f 361/361/361 74/74/74 302/302/302 359/359/359 +f 286/286/286 288/288/288 290/290/290 284/284/284 +f 287/287/287 285/285/285 291/291/291 289/289/289 +f 290/290/290 360/360/360 74/74/74 284/284/284 +f 291/291/291 285/285/285 74/74/74 361/361/361 +f 284/284/284 74/74/74 73/73/73 +f 285/285/285 73/73/73 74/74/74 +f 296/296/296 310/310/310 362/362/362 294/294/294 +f 297/297/297 295/295/295 363/363/363 311/311/311 +f 312/312/312 368/368/368 362/362/362 310/310/310 +f 313/313/313 311/311/311 363/363/363 369/369/369 +f 382/382/382 370/370/370 368/368/368 312/312/312 +f 383/383/383 313/313/313 369/369/369 371/371/371 +f 376/376/376 370/370/370 382/382/382 314/314/314 +f 377/377/377 315/315/315 383/383/383 371/371/371 +f 350/350/350 386/386/386 384/384/384 348/348/348 +f 351/351/351 349/349/349 385/385/385 387/387/387 +f 384/384/384 386/386/386 320/320/320 318/318/318 +f 385/385/385 319/319/319 321/321/321 387/387/387 +f 300/300/300 384/384/384 318/318/318 298/298/298 +f 301/301/301 299/299/299 319/319/319 385/385/385 +f 344/344/344 342/342/342 384/384/384 300/300/300 +f 345/345/345 301/301/301 385/385/385 343/343/343 +f 348/348/348 384/384/384 342/342/342 +f 349/349/349 343/343/343 385/385/385 +f 346/346/346 344/344/344 300/300/300 +f 347/347/347 301/301/301 345/345/345 +f 322/322/322 380/380/380 378/378/378 314/314/314 +f 323/323/323 315/315/315 379/379/379 381/381/381 +f 378/378/378 380/380/380 324/324/324 316/316/316 +f 379/379/379 317/317/317 325/325/325 381/381/381 +f 386/386/386 380/380/380 322/322/322 320/320/320 +f 387/387/387 321/321/321 323/323/323 381/381/381 +f 352/352/352 380/380/380 386/386/386 350/350/350 +f 353/353/353 351/351/351 387/387/387 381/381/381 +f 380/380/380 352/352/352 324/324/324 +f 381/381/381 325/325/325 353/353/353 +f 388/388/388 414/414/414 402/402/402 400/400/400 +f 389/389/389 401/401/401 403/403/403 415/415/415 +f 402/402/402 404/404/404 398/398/398 400/400/400 +f 403/403/403 401/401/401 399/399/399 405/405/405 +f 404/404/404 406/406/406 396/396/396 398/398/398 +f 405/405/405 399/399/399 397/397/397 407/407/407 +f 406/406/406 408/408/408 394/394/394 396/396/396 +f 407/407/407 397/397/397 395/395/395 409/409/409 +f 408/408/408 410/410/410 392/392/392 394/394/394 +f 409/409/409 395/395/395 393/393/393 411/411/411 +f 410/410/410 412/412/412 390/390/390 392/392/392 +f 411/411/411 393/393/393 391/391/391 413/413/413 +f 420/420/420 418/418/418 412/412/412 410/410/410 +f 421/421/421 411/411/411 413/413/413 419/419/419 +f 422/422/422 420/420/420 410/410/410 408/408/408 +f 423/423/423 409/409/409 411/411/411 421/421/421 +f 424/424/424 422/422/422 408/408/408 406/406/406 +f 425/425/425 407/407/407 409/409/409 423/423/423 +f 426/426/426 424/424/424 406/406/406 404/404/404 +f 427/427/427 405/405/405 407/407/407 425/425/425 +f 428/428/428 426/426/426 404/404/404 402/402/402 +f 429/429/429 403/403/403 405/405/405 427/427/427 +f 414/414/414 416/416/416 428/428/428 402/402/402 +f 415/415/415 403/403/403 429/429/429 417/417/417 +f 320/320/320 444/444/444 442/442/442 318/318/318 +f 321/321/321 319/319/319 443/443/443 445/445/445 +f 390/390/390 412/412/412 444/444/444 320/320/320 +f 391/391/391 321/321/321 445/445/445 413/413/413 +f 318/318/318 442/442/442 312/312/312 310/310/310 +f 319/319/319 311/311/311 313/313/313 443/443/443 +f 430/430/430 414/414/414 388/388/388 382/382/382 +f 431/431/431 383/383/383 389/389/389 415/415/415 +f 418/418/418 440/440/440 444/444/444 412/412/412 +f 419/419/419 413/413/413 445/445/445 441/441/441 +f 446/446/446 444/444/444 440/440/440 438/438/438 +f 447/447/447 439/439/439 441/441/441 445/445/445 +f 446/446/446 438/438/438 436/436/436 434/434/434 +f 447/447/447 435/435/435 437/437/437 439/439/439 +f 448/448/448 446/446/446 434/434/434 432/432/432 +f 449/449/449 433/433/433 435/435/435 447/447/447 +f 448/448/448 432/432/432 450/450/450 430/430/430 +f 449/449/449 431/431/431 451/451/451 433/433/433 +f 430/430/430 450/450/450 416/416/416 414/414/414 +f 431/431/431 415/415/415 417/417/417 451/451/451 +f 448/448/448 430/430/430 382/382/382 312/312/312 +f 449/449/449 313/313/313 383/383/383 431/431/431 +f 442/442/442 446/446/446 448/448/448 312/312/312 +f 443/443/443 313/313/313 449/449/449 447/447/447 +f 444/444/444 446/446/446 442/442/442 +f 445/445/445 443/443/443 447/447/447 +f 450/450/450 452/452/452 476/476/476 416/416/416 +f 451/451/451 417/417/417 477/477/477 453/453/453 +f 432/432/432 462/462/462 452/452/452 450/450/450 +f 433/433/433 451/451/451 453/453/453 463/463/463 +f 434/434/434 460/460/460 462/462/462 432/432/432 +f 435/435/435 433/433/433 463/463/463 461/461/461 +f 436/436/436 458/458/458 460/460/460 434/434/434 +f 437/437/437 435/435/435 461/461/461 459/459/459 +f 438/438/438 456/456/456 458/458/458 436/436/436 +f 439/439/439 437/437/437 459/459/459 457/457/457 +f 440/440/440 454/454/454 456/456/456 438/438/438 +f 441/441/441 439/439/439 457/457/457 455/455/455 +f 418/418/418 474/474/474 454/454/454 440/440/440 +f 419/419/419 441/441/441 455/455/455 475/475/475 +f 416/416/416 476/476/476 464/464/464 428/428/428 +f 417/417/417 429/429/429 465/465/465 477/477/477 +f 428/428/428 464/464/464 466/466/466 426/426/426 +f 429/429/429 427/427/427 467/467/467 465/465/465 +f 426/426/426 466/466/466 468/468/468 424/424/424 +f 427/427/427 425/425/425 469/469/469 467/467/467 +f 424/424/424 468/468/468 470/470/470 422/422/422 +f 425/425/425 423/423/423 471/471/471 469/469/469 +f 422/422/422 470/470/470 472/472/472 420/420/420 +f 423/423/423 421/421/421 473/473/473 471/471/471 +f 420/420/420 472/472/472 474/474/474 418/418/418 +f 421/421/421 419/419/419 475/475/475 473/473/473 +f 456/456/456 480/480/480 478/478/478 458/458/458 +f 457/457/457 459/459/459 479/479/479 481/481/481 +f 480/480/480 482/482/482 484/484/484 478/478/478 +f 481/481/481 479/479/479 485/485/485 483/483/483 +f 482/482/482 488/488/488 486/486/486 484/484/484 +f 483/483/483 485/485/485 487/487/487 489/489/489 +f 488/488/488 490/490/490 492/492/492 486/486/486 +f 489/489/489 487/487/487 493/493/493 491/491/491 +f 476/476/476 486/486/486 492/492/492 464/464/464 +f 477/477/477 465/465/465 493/493/493 487/487/487 +f 484/484/484 486/486/486 476/476/476 452/452/452 +f 485/485/485 453/453/453 477/477/477 487/487/487 +f 462/462/462 478/478/478 484/484/484 452/452/452 +f 463/463/463 453/453/453 485/485/485 479/479/479 +f 478/478/478 462/462/462 460/460/460 458/458/458 +f 479/479/479 459/459/459 461/461/461 463/463/463 +f 474/474/474 480/480/480 456/456/456 454/454/454 +f 475/475/475 455/455/455 457/457/457 481/481/481 +f 482/482/482 480/480/480 474/474/474 472/472/472 +f 483/483/483 473/473/473 475/475/475 481/481/481 +f 488/488/488 482/482/482 472/472/472 470/470/470 +f 489/489/489 471/471/471 473/473/473 483/483/483 +f 490/490/490 488/488/488 470/470/470 468/468/468 +f 491/491/491 469/469/469 471/471/471 489/489/489 +f 492/492/492 490/490/490 468/468/468 466/466/466 +f 493/493/493 467/467/467 469/469/469 491/491/491 +f 492/492/492 466/466/466 464/464/464 +f 493/493/493 465/465/465 467/467/467 +f 390/390/390 504/504/504 502/502/502 392/392/392 +f 391/391/391 393/393/393 503/503/503 505/505/505 +f 392/392/392 502/502/502 500/500/500 394/394/394 +f 393/393/393 395/395/395 501/501/501 503/503/503 +f 394/394/394 500/500/500 498/498/498 396/396/396 +f 395/395/395 397/397/397 499/499/499 501/501/501 +f 396/396/396 498/498/498 496/496/496 398/398/398 +f 397/397/397 399/399/399 497/497/497 499/499/499 +f 398/398/398 496/496/496 494/494/494 400/400/400 +f 399/399/399 401/401/401 495/495/495 497/497/497 +f 400/400/400 494/494/494 506/506/506 388/388/388 +f 401/401/401 389/389/389 507/507/507 495/495/495 +f 502/502/502 504/504/504 506/506/506 494/494/494 +f 503/503/503 495/495/495 507/507/507 505/505/505 +f 496/496/496 500/500/500 502/502/502 494/494/494 +f 497/497/497 495/495/495 503/503/503 501/501/501 +f 498/498/498 500/500/500 496/496/496 +f 499/499/499 497/497/497 501/501/501 +f 382/382/382 388/388/388 506/506/506 314/314/314 +f 383/383/383 315/315/315 507/507/507 389/389/389 +f 506/506/506 504/504/504 322/322/322 314/314/314 +f 507/507/507 315/315/315 323/323/323 505/505/505 +f 322/322/322 504/504/504 390/390/390 320/320/320 +f 323/323/323 321/321/321 391/391/391 505/505/505 diff --git a/src/core/obj.odin b/src/core/obj.odin new file mode 100644 index 0000000..41fa720 --- /dev/null +++ b/src/core/obj.odin @@ -0,0 +1,148 @@ +package core + +import "core:fmt" +import "core:math/linalg" +import "core:os" +import "core:strconv" +import "core:strings" + +import "sindri:platform" + +// Minimal OBJ loader: reads v, vt, vn and triangulates convex polygon faces. +// Produces one GPU vertex per face corner, then centers and normalizes the +// model so it fits roughly inside a [-1, 1] cube at the origin +load_obj_model :: proc( + path: string, +) -> ( + vertices: []platform.Vertex, + indices: []u16, + ok: bool, +) { + data, err := os.read_entire_file_from_path(path, context.allocator) + if err != os.ERROR_NONE { + fmt.eprintfln("[core] failed to read model: %s", path) + return nil, nil, false + } + defer delete(data) + + positions: [dynamic]platform.Vec3 + uvs: [dynamic]platform.Vec2 + normals: [dynamic]platform.Vec3 + temp_vertices: [dynamic]platform.Vertex + temp_indices: [dynamic]u16 + defer { + delete(positions) + delete(uvs) + delete(normals) + delete(temp_vertices) + delete(temp_indices) + } + + text := string(data) + for line in strings.split_lines_iterator(&text) { + trimmed := strings.trim_space(line) + if len(trimmed) == 0 || trimmed[0] == '#' do continue + + fields := strings.fields(trimmed) + defer delete(fields) + if len(fields) == 0 do continue + + switch fields[0] { + case "v": + if len(fields) < 4 do continue + x, _ := strconv.parse_f32(fields[1]) + y, _ := strconv.parse_f32(fields[2]) + z, _ := strconv.parse_f32(fields[3]) + append(&positions, platform.Vec3{x, y, z}) + case "vt": + if len(fields) < 3 do continue + u, _ := strconv.parse_f32(fields[1]) + v, _ := strconv.parse_f32(fields[2]) + append(&uvs, platform.Vec2{u, v}) + case "vn": + if len(fields) < 4 do continue + x, _ := strconv.parse_f32(fields[1]) + y, _ := strconv.parse_f32(fields[2]) + z, _ := strconv.parse_f32(fields[3]) + append(&normals, platform.Vec3{x, y, z}) + case "f": + face_indices: [dynamic]u16 + defer delete(face_indices) + + for i := 1; i < len(fields); i += 1 { + token := fields[i] + slash := strings.index_byte(token, '/') + + vi_str := token + vti_str := "" + if slash != -1 { + vi_str = token[:slash] + slash2 := strings.index_byte(token[slash + 1:], '/') + if slash2 != -1 { + vti_str = token[slash + 1:slash + 1 + slash2] + } else { + vti_str = token[slash + 1:] + } + } + + vi, _ := strconv.parse_int(vi_str) + vi -= 1 // OBJ indices are 1-based + if vi < 0 || vi >= len(positions) do continue + + uv := platform.Vec2{0, 0} + if len(vti_str) > 0 { + vti, _ := strconv.parse_int(vti_str) + vti -= 1 + if vti >= 0 && vti < len(uvs) { + uv = uvs[vti] + } + } else if vi < len(uvs) { + uv = uvs[vi] + } + + append( + &temp_vertices, + platform.Vertex { + pos = positions[vi], + col = {1, 1, 1}, + uv = uv, + }, + ) + append(&face_indices, cast(u16)(len(temp_vertices) - 1)) + } + + // Triangulate convex polygon by fanning from the first vertex + for i := 2; i < len(face_indices); i += 1 { + append(&temp_indices, face_indices[0]) + append(&temp_indices, face_indices[i - 1]) + append(&temp_indices, face_indices[i]) + } + } + } + + if len(temp_vertices) == 0 { + return nil, nil, false + } + + // Center and normalize: fit the model inside a roughly [-1, 1] cube + min_p := temp_vertices[0].pos + max_p := temp_vertices[0].pos + for v in temp_vertices { + min_p = linalg.min(min_p, v.pos) + max_p = linalg.max(max_p, v.pos) + } + center := (min_p + max_p) * 0.5 + size := max_p - min_p + max_size := max(size.x, size.y, size.z) + scale := 1.8 / max_size + + for &v in temp_vertices { + v.pos = (v.pos - center) * scale + } + + vertices = make([]platform.Vertex, len(temp_vertices)) + indices = make([]u16, len(temp_indices)) + copy(vertices, temp_vertices[:]) + copy(indices, temp_indices[:]) + return vertices, indices, true +} diff --git a/src/main.odin b/src/main.odin index 854a002..661db6b 100644 --- a/src/main.odin +++ b/src/main.odin @@ -5,6 +5,7 @@ import "core:time" import "game:game" import "sindri:base" +import "sindri:core" import "sindri:platform" VERSION :: #config(VERSION, "dev") @@ -41,6 +42,7 @@ main :: proc() { // Initialize GPU resources platform.instance_init(settings) defer platform.instance_destroy() + load_test_model() api.init_once() @@ -84,3 +86,13 @@ test :: proc(e: ^base.Key_Press_Event, _: rawptr) -> bool { fmt.println("main: @@@@@@@@@@@", e) return true } + +// Load model from disk and upload it +load_test_model :: proc() { + vertices, indices, model_ok := core.load_obj_model("assets/suzanne.obj") + if !model_ok do fmt.panicf("[main] could not load model") + defer delete(vertices) + defer delete(indices) + + platform.fill_buffers_with_model(vertices, indices) +} diff --git a/src/platform/wgpu.odin b/src/platform/wgpu.odin index b892ff3..33ab4ce 100644 --- a/src/platform/wgpu.odin +++ b/src/platform/wgpu.odin @@ -4,6 +4,7 @@ import "base:runtime" import "core:fmt" import "core:math" import "core:math/linalg" +import "core:os" import "core:slice" import "wgpu:wgpu" @@ -19,7 +20,7 @@ Vec3 :: [3]f32 Vertex :: struct #align (4) { pos: Vec3, col: Vec3, - uv: Vec2, + uv: Vec2, // texture coordinate } Camera_Uniform :: struct { @@ -245,6 +246,21 @@ frame :: proc "c" () { wgpu.SurfacePresent(state.surface) } +// Upload arbitrary vertex/index data to GPU buffers +fill_buffers_with_model :: proc(vertices: []Vertex, indices: []u16) { + state.vertex_buffer = wgpu.DeviceCreateBufferWithData( + state.device, + &{label = "model vertices", usage = {.Vertex}}, + vertices, + ) + state.index_buffer = wgpu.DeviceCreateBufferWithData( + state.device, + &{label = "model indices", usage = {.Index}}, + indices, + ) + state.index_count = cast(u32)len(indices) +} + // ----------------------------------------- // Private functions @@ -399,9 +415,6 @@ on_device :: proc "c" ( // ---------------------------------------- // Buffer shape - // Fill vertex/index buffers - fill_buffers_with_quad() - vertex_attributes := [?]wgpu.VertexAttribute { { format = .Float32x3, @@ -562,50 +575,6 @@ create_depth_texture :: proc() { state.depth_texture_view = wgpu.TextureCreateView(state.depth_texture, nil) } -@(private = "file") -fill_buffers_with_quad :: proc() { - vertices := [?]Vertex { - // Near quad: z = 0, colourful, drawn first - {pos = {-0.4, -0.4, 0.0}, col = {1, 0, 0}, uv = {0, 1}}, // 0 bottom-left red - {pos = {0.4, -0.4, 0.0}, col = {0, 1, 0}, uv = {1, 1}}, // 1 bottom-right green - {pos = {0.4, 0.4, 0.0}, col = {0, 0, 1}, uv = {1, 0}}, // 2 top-right blue - {pos = {-0.4, 0.4, 0.0}, col = {1, 1, 0}, uv = {0, 0}}, // 3 top-left yellow - - // Far quad: z = -0.5, cyan, drawn second - {pos = {-0.8, -0.8, -0.5}, col = {0, 1, 1}, uv = {0, 1}}, // 4 bottom-left - {pos = {0.8, -0.8, -0.5}, col = {0, 1, 1}, uv = {1, 1}}, // 5 bottom-right - {pos = {0.8, 0.8, -0.5}, col = {0, 1, 1}, uv = {1, 0}}, // 6 top-right - {pos = {-0.8, 0.8, -0.5}, col = {0, 1, 1}, uv = {0, 0}}, // 7 top-left - } - - indices := [?]u16 { - 0, - 1, - 2, - 2, - 3, - 0, // near quad - 4, - 5, - 6, - 6, - 7, - 4, // far quad - } - - state.vertex_buffer = wgpu.DeviceCreateBufferWithData( - state.device, - &{label = "quad vertices", usage = {.Vertex}}, - vertices[:], - ) - state.index_buffer = wgpu.DeviceCreateBufferWithData( - state.device, - &{label = "quad indices", usage = {.Index}}, - indices[:], - ) - state.index_count = cast(u32)len(indices) -} - @(private = "file") framebuffer_aspect :: proc() -> f32 { width, height := os_get_framebuffer_size() @@ -638,7 +607,7 @@ camera_perspective :: proc( camera_mvp :: proc(aspect: f32) -> linalg.Matrix4f32 { projection := camera_perspective(60, aspect, 0.1, 100) view := linalg.matrix4_look_at_f32({0, 0.75, 2}, {0, 0, 0}, {0, 1, 0}) - // model = identity: the quad lives at the origin, no pose of its own yet + // model = identity: the loader already centered the model at the origin return projection * view }