From e370c1d0c3e97d5231c5953f6c61e46585608b5b Mon Sep 17 00:00:00 2001 From: Amy Retzerau Date: Thu, 13 Nov 2025 13:47:59 +0100 Subject: [PATCH] feat: added the ability to render whole model --- main.cpp | 10 +++++----- model.hpp | 12 ++++++++++++ parseObj.py | 40 ++++++++++++++++++++++++++++++++++++++++ polygon.hpp | 33 ++++++++++++++++++++++++++++----- renderer.hpp | 48 ++++++++++++++++++++++++++++++++++++------------ testModel.hpp | 2 ++ 6 files changed, 123 insertions(+), 22 deletions(-) create mode 100644 model.hpp create mode 100644 parseObj.py create mode 100644 testModel.hpp diff --git a/main.cpp b/main.cpp index 109aa5e..14845c8 100644 --- a/main.cpp +++ b/main.cpp @@ -2,6 +2,7 @@ #include "polygon.hpp" #include "renderer.hpp" #include "rendertarget.hpp" +#include "testModel.hpp" #include #include #include @@ -74,9 +75,9 @@ int main(int argc, char *argv[]) { renderer.target = ⌖ polygon poly = - polygon(vec3(0.9, 0.9, 0.0), vec3(0.5, 0.1, 0.0), vec3(0.1, 0.9, 0.0)); + polygon(vec3(0.9, 0.9, 1.0), vec3(0.5, 0.1, 1.0), vec3(0.1, 0.9, 1.0)); - renderer.render(&poly); + renderer.render(&testModel); QApplication a(argc, argv); uint8_t *pixel = new uint8_t[64 * 64 * 3]; @@ -98,9 +99,8 @@ int main(int argc, char *argv[]) { addTo((target.width * y * 2 + (x * 2 + 1)) * 3, result); addTo((target.width * (y * 2 + 1) + (x * 2 + 1)) * 3, result); for (int c = 0; c < 3; c++) { - pixel[(WIDTH * y + x) * 3 + c] = result[c] >> 2; /* - target.pixels[(target.width * y * 2 + x * 2) * 3 + c].i >> - SHIFT_AMOUNT;*/ + pixel[(WIDTH * (WIDTH - y - 1) + WIDTH - x - 1) * 3 + c] = + result[c] >> 2; } } } diff --git a/model.hpp b/model.hpp new file mode 100644 index 0000000..d1f5d28 --- /dev/null +++ b/model.hpp @@ -0,0 +1,12 @@ + +#ifndef MODEL_H +#define MODEL_H + +#include "fastmath.hpp" +#include +struct model { + std::vector verts; + std::vector faces; +}; + +#endif diff --git a/parseObj.py b/parseObj.py new file mode 100644 index 0000000..dc81cda --- /dev/null +++ b/parseObj.py @@ -0,0 +1,40 @@ +# Open the file in read mode +file = open("test.obj", "r") + +# Read the entire content of the file +content = file.read().split("\n") + +file.close() + +startVerts = 0 +verts = [] +for index,line in enumerate(content): + if line[0] == 'o': + startVerts = index + 1 + content = content[startVerts:] + break + +for index,line in enumerate(content): + if "vn" in line: + endVerts = index + verts = content[:endVerts] + content = content[endVerts:] + break + +startFaces = 0; +faces = [] +for index,line in enumerate(content): + if line[0] == 'f': + startFaces = index + faces = content[startFaces:-1] + break + +verts = ["vec3(" +",".join(vert.split(" ")[1:4]) + ")" for vert in verts] +faces = [ ",".join([str(int((d.split("/")[0])) - 1) for d in face.split(" ")[1:4]]) for face in faces] + +out = "#include \"model.hpp\" \n const model testModel({" + ",".join(verts) +"},{" + ",".join(faces) + "});" + +with open("testModel.hpp", "w") as f: + f.write(out) +print(out) +# Close the file diff --git a/polygon.hpp b/polygon.hpp index 1b4aed1..f30adf1 100644 --- a/polygon.hpp +++ b/polygon.hpp @@ -4,25 +4,48 @@ #include "fastmath.hpp" struct polygon { - const vec3 points[3]; + vec3 points[3]; + vec3 delta[3]; + bool skip = false; polygon(const vec3 &v1, const vec3 &v2, const vec3 &v3) : points{v1, v2, v3} {} + polygon() : points{} {} + + void calcDelta() { - bool contains(const vec3 &p) { for (int i = 0; i < 3; i++) { int n = (i + 1) % 3; vec3 d = points[n] - points[i]; - d = vec3(d.y(), -d.x(), d.z()); + delta[i] = vec3(d.y(), -d.x(), d.z()); + if (delta[i].isSmall()) { + skip = true; + return; + } + } + } + + bool contains(const vec3 &p) { + if (skip) + return false; + for (int i = 0; i < 3; i++) { + int n = (i + 1) % 3; vec3 s = p - points[n]; - - if (s * d < decimal(0.0)) + if (s.isSmall()) + return false; + if (s * delta[i] <= decimal(0.0)) return false; } return true; } + friend std::ostream &operator<<(std::ostream &os, const polygon &p) { + for (int i = 0; i < 3; i++) { + os << p.points[i]; + } + return os; + } }; #endif diff --git a/renderer.hpp b/renderer.hpp index 37cd9c1..71e7605 100644 --- a/renderer.hpp +++ b/renderer.hpp @@ -3,6 +3,7 @@ #define RENDERER_H #include "fastmath.hpp" +#include "model.hpp" #include "polygon.hpp" #include "rendertarget.hpp" #include @@ -15,26 +16,49 @@ class Renderer { bool clearTarget = true; Renderer() : clearTarget(false) {} - void render(polygon *p) { - decimal widthScale = decimal(1.0) / decimal((float)target->width); - decimal heightScale = decimal(1.0) / decimal((float)target->height); + void toScreenSpace(polygon *p) { + for (int i = 0; i < 3; i++) { + p->points[i].x() = + p->points[i].x() / p->points[i].z() * decimal(8.0) + + decimal(8.0); + p->points[i].y() = + p->points[i].y() / p->points[i].z() * decimal(8.0) + + decimal(8.0); + p->points[i].z() = decimal(1.0); + } + } + + void render(const model *model) { + decimal widthScale = decimal(16.0) / decimal((float)target->width); + decimal heightScale = decimal(16.0) / decimal((float)target->height); // std::cout << widthScale << std::endl; - vec3 pos = vec3(); if (clearTarget) { memset((wchar_t *)target->pixels, 0, target->height * target->width * sizeof(target[0])); } - for (int x = 0; x < target->height; x++) { - for (int y = 0; y < target->height; y++) { - if (p->contains(pos)) { - target->set(x, y, vec3(0.0, 255.0, 0.0)); - } - pos.y() += heightScale; + polygon testP; + + for (int f = 0; f < model->faces.size(); f += 3) { + for (int p = 0; p < 3; p++) { + testP.points[p] = model->verts[model->faces[f + p]]; + } + + toScreenSpace(&testP); + + testP.calcDelta(); + vec3 pos = vec3(); + for (int x = 0; x < target->height; x++) { + for (int y = 0; y < target->height; y++) { + if (testP.contains(pos)) { + target->set(x, y, vec3(0.0, 255.0, 0.0)); + } + pos.y() += heightScale; + } + pos.y() = decimal(0); + pos.x() += widthScale; } - pos.y() = decimal(0); - pos.x() += widthScale; } } }; diff --git a/testModel.hpp b/testModel.hpp new file mode 100644 index 0000000..427ce1d --- /dev/null +++ b/testModel.hpp @@ -0,0 +1,2 @@ +#include "model.hpp" + const model testModel({vec3(-0.437500,0.164062,2.234375),vec3(0.437500,0.164062,2.234375),vec3(-0.500000,0.093750,2.312500),vec3(0.500000,0.093750,2.312500),vec3(-0.546875,0.054688,2.421875),vec3(0.546875,0.054688,2.421875),vec3(-0.351562,-0.023438,2.382812),vec3(0.351562,-0.023438,2.382812),vec3(-0.351562,0.031250,2.281250),vec3(0.351562,0.031250,2.281250),vec3(-0.351562,0.132812,2.218750),vec3(0.351562,0.132812,2.218750),vec3(-0.273438,0.164062,2.203125),vec3(0.273438,0.164062,2.203125),vec3(-0.203125,0.093750,2.257812),vec3(0.203125,0.093750,2.257812),vec3(-0.156250,0.054688,2.351562),vec3(0.156250,0.054688,2.351562),vec3(-0.078125,0.242188,2.343750),vec3(0.078125,0.242188,2.343750),vec3(-0.140625,0.242188,2.257812),vec3(0.140625,0.242188,2.257812),vec3(-0.242188,0.242188,2.203125),vec3(0.242188,0.242188,2.203125),vec3(-0.273438,0.328125,2.203125),vec3(0.273438,0.328125,2.203125),vec3(-0.203125,0.390625,2.257812),vec3(0.203125,0.390625,2.257812),vec3(-0.156250,0.437500,2.351562),vec3(0.156250,0.437500,2.351562),vec3(-0.351562,0.515625,2.382812),vec3(0.351562,0.515625,2.382812),vec3(-0.351562,0.453125,2.281250),vec3(0.351562,0.453125,2.281250),vec3(-0.351562,0.359375,2.218750),vec3(0.351562,0.359375,2.218750),vec3(-0.437500,0.328125,2.234375),vec3(0.437500,0.328125,2.234375),vec3(-0.500000,0.390625,2.312500),vec3(0.500000,0.390625,2.312500),vec3(-0.546875,0.437500,2.421875),vec3(0.546875,0.437500,2.421875),vec3(-0.625000,0.242188,2.437500),vec3(0.625000,0.242188,2.437500),vec3(-0.562500,0.242188,2.328125),vec3(0.562500,0.242188,2.328125),vec3(-0.468750,0.242188,2.242188),vec3(0.468750,0.242188,2.242188),vec3(-0.476562,0.242188,2.226562),vec3(0.476562,0.242188,2.226562),vec3(-0.445312,0.335938,2.218750),vec3(0.445312,0.335938,2.218750),vec3(-0.351562,0.375000,2.195312),vec3(0.351562,0.375000,2.195312),vec3(-0.265625,0.335938,2.179688),vec3(0.265625,0.335938,2.179688),vec3(-0.226562,0.242188,2.179688),vec3(0.226562,0.242188,2.179688),vec3(-0.265625,0.156250,2.179688),vec3(0.265625,0.156250,2.179688),vec3(-0.351562,0.242188,2.171875),vec3(0.351562,0.242188,2.171875),vec3(-0.351562,0.117188,2.195312),vec3(0.351562,0.117188,2.195312),vec3(-0.445312,0.156250,2.218750),vec3(0.445312,0.156250,2.218750),vec3(0.000000,0.429688,2.257812),vec3(0.000000,0.351562,2.179688),vec3(0.000000,-0.679688,2.265625),vec3(0.000000,-0.320312,2.218750),vec3(0.000000,-0.187500,2.203125),vec3(0.000000,-0.773438,2.281250),vec3(0.000000,0.406250,2.398438),vec3(0.000000,0.570312,2.429688),vec3(0.000000,0.898438,3.546875),vec3(0.000000,0.562500,3.851562),vec3(0.000000,0.070312,3.828125),vec3(0.000000,-0.382812,3.351562),vec3(-0.203125,-0.187500,2.437500),vec3(0.203125,-0.187500,2.437500),vec3(-0.312500,-0.437500,2.429688),vec3(0.312500,-0.437500,2.429688),vec3(-0.351562,-0.695312,2.429688),vec3(0.351562,-0.695312,2.429688),vec3(-0.367188,-0.890625,2.468750),vec3(0.367188,-0.890625,2.468750),vec3(-0.328125,-0.945312,2.476562),vec3(0.328125,-0.945312,2.476562),vec3(-0.179688,-0.968750,2.445312),vec3(0.179688,-0.968750,2.445312),vec3(0.000000,-0.984375,2.421875),vec3(-0.437500,-0.140625,2.468750),vec3(0.437500,-0.140625,2.468750),vec3(-0.632812,-0.039062,2.460938),vec3(0.632812,-0.039062,2.460938),vec3(-0.828125,0.148438,2.554688),vec3(0.828125,0.148438,2.554688),vec3(-0.859375,0.429688,2.406250),vec3(0.859375,0.429688,2.406250),vec3(-0.710938,0.484375,2.375000),vec3(0.710938,0.484375,2.375000),vec3(-0.492188,0.601562,2.312500),vec3(0.492188,0.601562,2.312500),vec3(-0.320312,0.757812,2.265625),vec3(0.320312,0.757812,2.265625),vec3(-0.156250,0.718750,2.242188),vec3(0.156250,0.718750,2.242188),vec3(-0.062500,0.492188,2.250000),vec3(0.062500,0.492188,2.250000),vec3(-0.164062,0.414062,2.226562),vec3(0.164062,0.414062,2.226562),vec3(-0.125000,0.304688,2.234375),vec3(0.125000,0.304688,2.234375),vec3(-0.203125,0.093750,2.257812),vec3(0.203125,0.093750,2.257812),vec3(-0.375000,0.015625,2.296875),vec3(0.375000,0.015625,2.296875),vec3(-0.492188,0.062500,2.328125),vec3(0.492188,0.062500,2.328125),vec3(-0.625000,0.187500,2.351562),vec3(0.625000,0.187500,2.351562),vec3(-0.640625,0.296875,2.351562),vec3(0.640625,0.296875,2.351562),vec3(-0.601562,0.375000,2.335938),vec3(0.601562,0.375000,2.335938),vec3(-0.429688,0.437500,2.281250),vec3(0.429688,0.437500,2.281250),vec3(-0.250000,0.468750,2.242188),vec3(0.250000,0.468750,2.242188),vec3(0.000000,-0.765625,2.265625),vec3(-0.109375,-0.718750,2.265625),vec3(0.109375,-0.718750,2.265625),vec3(-0.117188,-0.835938,2.289062),vec3(0.117188,-0.835938,2.289062),vec3(-0.062500,-0.882812,2.304688),vec3(0.062500,-0.882812,2.304688),vec3(0.000000,-0.890625,2.312500),vec3(0.000000,-0.195312,2.250000),vec3(0.000000,-0.140625,2.257812),vec3(-0.101562,-0.148438,2.257812),vec3(0.101562,-0.148438,2.257812),vec3(-0.125000,-0.226562,2.250000),vec3(0.125000,-0.226562,2.250000),vec3(-0.085938,-0.289062,2.257812),vec3(0.085938,-0.289062,2.257812),vec3(-0.398438,-0.046875,2.328125),vec3(0.398438,-0.046875,2.328125),vec3(-0.617188,0.054688,2.375000),vec3(0.617188,0.054688,2.375000),vec3(-0.726562,0.203125,2.398438),vec3(0.726562,0.203125,2.398438),vec3(-0.742188,0.375000,2.343750),vec3(0.742188,0.375000,2.343750),vec3(-0.687500,0.414062,2.273438),vec3(0.687500,0.414062,2.273438),vec3(-0.437500,0.546875,2.203125),vec3(0.437500,0.546875,2.203125),vec3(-0.312500,0.640625,2.164062),vec3(0.312500,0.640625,2.164062),vec3(-0.203125,0.617188,2.148438),vec3(0.203125,0.617188,2.148438),vec3(-0.101562,0.429688,2.156250),vec3(0.101562,0.429688,2.156250),vec3(-0.125000,-0.101562,2.187500),vec3(0.125000,-0.101562,2.187500),vec3(-0.210938,-0.445312,2.289062),vec3(0.210938,-0.445312,2.289062),vec3(-0.250000,-0.703125,2.312500),vec3(0.250000,-0.703125,2.312500),vec3(-0.265625,-0.820312,2.335938),vec3(0.265625,-0.820312,2.335938),vec3(-0.234375,-0.914062,2.367188),vec3(0.234375,-0.914062,2.367188),vec3(-0.164062,-0.929688,2.367188),vec3(0.164062,-0.929688,2.367188),vec3(0.000000,-0.945312,2.359375),vec3(0.000000,0.046875,2.273438),vec3(0.000000,0.210938,2.234375),vec3(-0.328125,0.476562,2.257812),vec3(0.328125,0.476562,2.257812),vec3(-0.164062,0.140625,2.250000),vec3(0.164062,0.140625,2.250000),vec3(-0.132812,0.210938,2.242188),vec3(0.132812,0.210938,2.242188),vec3(-0.117188,-0.687500,2.265625),vec3(0.117188,-0.687500,2.265625),vec3(-0.078125,-0.445312,2.250000),vec3(0.078125,-0.445312,2.250000),vec3(0.000000,-0.445312,2.250000),vec3(0.000000,-0.328125,2.257812),vec3(-0.093750,-0.273438,2.218750),vec3(0.093750,-0.273438,2.218750),vec3(-0.132812,-0.226562,2.203125),vec3(0.132812,-0.226562,2.203125),vec3(-0.109375,-0.132812,2.218750),vec3(0.109375,-0.132812,2.218750),vec3(-0.039062,-0.125000,2.218750),vec3(0.039062,-0.125000,2.218750),vec3(0.000000,-0.203125,2.171875),vec3(-0.046875,-0.148438,2.187500),vec3(0.046875,-0.148438,2.187500),vec3(-0.093750,-0.156250,2.187500),vec3(0.093750,-0.156250,2.187500),vec3(-0.109375,-0.226562,2.171875),vec3(0.109375,-0.226562,2.171875),vec3(-0.078125,-0.250000,2.195312),vec3(0.078125,-0.250000,2.195312),vec3(0.000000,-0.289062,2.195312),vec3(-0.257812,-0.312500,2.445312),vec3(0.257812,-0.312500,2.445312),vec3(-0.164062,-0.242188,2.289062),vec3(0.164062,-0.242188,2.289062),vec3(-0.179688,-0.312500,2.289062),vec3(0.179688,-0.312500,2.289062),vec3(-0.234375,-0.250000,2.445312),vec3(0.234375,-0.250000,2.445312),vec3(0.000000,-0.875000,2.312500),vec3(-0.046875,-0.867188,2.312500),vec3(0.046875,-0.867188,2.312500),vec3(-0.093750,-0.820312,2.289062),vec3(0.093750,-0.820312,2.289062),vec3(-0.093750,-0.742188,2.273438),vec3(0.093750,-0.742188,2.273438),vec3(0.000000,-0.781250,2.343750),vec3(-0.093750,-0.750000,2.335938),vec3(0.093750,-0.750000,2.335938),vec3(-0.093750,-0.812500,2.359375),vec3(0.093750,-0.812500,2.359375),vec3(-0.046875,-0.851562,2.367188),vec3(0.046875,-0.851562,2.367188),vec3(0.000000,-0.859375,2.367188),vec3(-0.171875,0.218750,2.218750),vec3(0.171875,0.218750,2.218750),vec3(-0.187500,0.156250,2.226562),vec3(0.187500,0.156250,2.226562),vec3(-0.335938,0.429688,2.242188),vec3(0.335938,0.429688,2.242188),vec3(-0.273438,0.421875,2.226562),vec3(0.273438,0.421875,2.226562),vec3(-0.421875,0.398438,2.226562),vec3(0.421875,0.398438,2.226562),vec3(-0.562500,0.351562,2.304688),vec3(0.562500,0.351562,2.304688),vec3(-0.585938,0.289062,2.312500),vec3(0.585938,0.289062,2.312500),vec3(-0.578125,0.195312,2.320312),vec3(0.578125,0.195312,2.320312),vec3(-0.476562,0.101562,2.281250),vec3(0.476562,0.101562,2.281250),vec3(-0.375000,0.062500,2.257812),vec3(0.375000,0.062500,2.257812),vec3(-0.226562,0.109375,2.218750),vec3(0.226562,0.109375,2.218750),vec3(-0.179688,0.296875,2.218750),vec3(0.179688,0.296875,2.218750),vec3(-0.210938,0.375000,2.218750),vec3(0.210938,0.375000,2.218750),vec3(-0.234375,0.359375,2.242188),vec3(0.234375,0.359375,2.242188),vec3(-0.195312,0.296875,2.242188),vec3(0.195312,0.296875,2.242188),vec3(-0.242188,0.125000,2.242188),vec3(0.242188,0.125000,2.242188),vec3(-0.375000,0.085938,2.273438),vec3(0.375000,0.085938,2.273438),vec3(-0.460938,0.117188,2.296875),vec3(0.460938,0.117188,2.296875),vec3(-0.546875,0.210938,2.328125),vec3(0.546875,0.210938,2.328125),vec3(-0.554688,0.281250,2.328125),vec3(0.554688,0.281250,2.328125),vec3(-0.531250,0.335938,2.320312),vec3(0.531250,0.335938,2.320312),vec3(-0.414062,0.390625,2.250000),vec3(0.414062,0.390625,2.250000),vec3(-0.281250,0.398438,2.234375),vec3(0.281250,0.398438,2.234375),vec3(-0.335938,0.406250,2.250000),vec3(0.335938,0.406250,2.250000),vec3(-0.203125,0.171875,2.250000),vec3(0.203125,0.171875,2.250000),vec3(-0.195312,0.226562,2.250000),vec3(0.195312,0.226562,2.250000),vec3(-0.109375,0.460938,2.390625),vec3(0.109375,0.460938,2.390625),vec3(-0.195312,0.664062,2.382812),vec3(0.195312,0.664062,2.382812),vec3(-0.335938,0.687500,2.406250),vec3(0.335938,0.687500,2.406250),vec3(-0.484375,0.554688,2.445312),vec3(0.484375,0.554688,2.445312),vec3(-0.679688,0.453125,2.507812),vec3(0.679688,0.453125,2.507812),vec3(-0.796875,0.406250,2.539062),vec3(0.796875,0.406250,2.539062),vec3(-0.773438,0.164062,2.625000),vec3(0.773438,0.164062,2.625000),vec3(-0.601562,0.000000,2.585938),vec3(0.601562,0.000000,2.585938),vec3(-0.437500,-0.093750,2.531250),vec3(0.437500,-0.093750,2.531250),vec3(0.000000,0.898438,2.710938),vec3(0.000000,0.984375,3.078125),vec3(0.000000,-0.195312,3.671875),vec3(0.000000,-0.460938,2.812500),vec3(0.000000,-0.976562,2.539062),vec3(0.000000,-0.804688,2.656250),vec3(0.000000,-0.570312,2.679688),vec3(0.000000,-0.484375,2.718750),vec3(-0.851562,0.234375,2.945312),vec3(0.851562,0.234375,2.945312),vec3(-0.859375,0.320312,3.046875),vec3(0.859375,0.320312,3.046875),vec3(-0.773438,0.265625,3.437500),vec3(0.773438,0.265625,3.437500),vec3(-0.460938,0.437500,3.703125),vec3(0.460938,0.437500,3.703125),vec3(-0.734375,-0.046875,2.929688),vec3(0.734375,-0.046875,2.929688),vec3(-0.593750,-0.125000,3.164062),vec3(0.593750,-0.125000,3.164062),vec3(-0.640625,-0.007812,3.429688),vec3(0.640625,-0.007812,3.429688),vec3(-0.335938,0.054688,3.664062),vec3(0.335938,0.054688,3.664062),vec3(-0.234375,-0.351562,2.593750),vec3(0.234375,-0.351562,2.593750),vec3(-0.179688,-0.414062,2.742188),vec3(0.179688,-0.414062,2.742188),vec3(-0.289062,-0.710938,2.617188),vec3(0.289062,-0.710938,2.617188),vec3(-0.250000,-0.500000,2.609375),vec3(0.250000,-0.500000,2.609375),vec3(-0.328125,-0.914062,2.601562),vec3(0.328125,-0.914062,2.601562),vec3(-0.140625,-0.757812,2.632812),vec3(0.140625,-0.757812,2.632812),vec3(-0.125000,-0.539062,2.640625),vec3(0.125000,-0.539062,2.640625),vec3(-0.164062,-0.945312,2.562500),vec3(0.164062,-0.945312,2.562500),vec3(-0.218750,-0.281250,2.570312),vec3(0.218750,-0.281250,2.570312),vec3(-0.210938,-0.226562,2.531250),vec3(0.210938,-0.226562,2.531250),vec3(-0.203125,-0.171875,2.500000),vec3(0.203125,-0.171875,2.500000),vec3(-0.210938,-0.390625,2.835938),vec3(0.210938,-0.390625,2.835938),vec3(-0.296875,-0.312500,3.265625),vec3(0.296875,-0.312500,3.265625),vec3(-0.343750,-0.148438,3.539062),vec3(0.343750,-0.148438,3.539062),vec3(-0.453125,0.867188,3.382812),vec3(0.453125,0.867188,3.382812),vec3(-0.453125,0.929688,3.070312),vec3(0.453125,0.929688,3.070312),vec3(-0.453125,0.851562,2.765625),vec3(0.453125,0.851562,2.765625),vec3(-0.460938,0.523438,2.570312),vec3(0.460938,0.523438,2.570312),vec3(-0.726562,0.406250,2.664062),vec3(0.726562,0.406250,2.664062),vec3(-0.632812,0.453125,2.718750),vec3(0.632812,0.453125,2.718750),vec3(-0.640625,0.703125,2.945312),vec3(0.640625,0.703125,2.945312),vec3(-0.796875,0.562500,2.875000),vec3(0.796875,0.562500,2.875000),vec3(-0.796875,0.617188,3.117188),vec3(0.796875,0.617188,3.117188),vec3(-0.640625,0.750000,3.195312),vec3(0.640625,0.750000,3.195312),vec3(-0.640625,0.679688,3.445312),vec3(0.640625,0.679688,3.445312),vec3(-0.796875,0.539062,3.359375),vec3(0.796875,0.539062,3.359375),vec3(-0.617188,0.328125,3.585938),vec3(0.617188,0.328125,3.585938),vec3(-0.484375,0.023438,3.546875),vec3(0.484375,0.023438,3.546875),vec3(-0.820312,0.328125,3.203125),vec3(0.820312,0.328125,3.203125),vec3(-0.406250,-0.171875,2.851562),vec3(0.406250,-0.171875,2.851562),vec3(-0.429688,-0.195312,3.210938),vec3(0.429688,-0.195312,3.210938),vec3(-0.890625,0.406250,3.234375),vec3(0.890625,0.406250,3.234375),vec3(-0.773438,-0.140625,3.125000),vec3(0.773438,-0.140625,3.125000),vec3(-1.039062,-0.101562,3.328125),vec3(1.039062,-0.101562,3.328125),vec3(-1.281250,0.054688,3.429688),vec3(1.281250,0.054688,3.429688),vec3(-1.351562,0.320312,3.421875),vec3(1.351562,0.320312,3.421875),vec3(-1.234375,0.507812,3.421875),vec3(1.234375,0.507812,3.421875),vec3(-1.023438,0.476562,3.312500),vec3(1.023438,0.476562,3.312500),vec3(-1.015625,0.414062,3.289062),vec3(1.015625,0.414062,3.289062),vec3(-1.187500,0.437500,3.390625),vec3(1.187500,0.437500,3.390625),vec3(-1.265625,0.289062,3.406250),vec3(1.265625,0.289062,3.406250),vec3(-1.210938,0.078125,3.406250),vec3(1.210938,0.078125,3.406250),vec3(-1.031250,-0.039062,3.304688),vec3(1.031250,-0.039062,3.304688),vec3(-0.828125,-0.070312,3.132812),vec3(0.828125,-0.070312,3.132812),vec3(-0.921875,0.359375,3.218750),vec3(0.921875,0.359375,3.218750),vec3(-0.945312,0.304688,3.289062),vec3(0.945312,0.304688,3.289062),vec3(-0.882812,-0.023438,3.210938),vec3(0.882812,-0.023438,3.210938),vec3(-1.039062,0.000000,3.367188),vec3(1.039062,0.000000,3.367188),vec3(-1.187500,0.093750,3.445312),vec3(1.187500,0.093750,3.445312),vec3(-1.234375,0.250000,3.445312),vec3(1.234375,0.250000,3.445312),vec3(-1.171875,0.359375,3.437500),vec3(1.171875,0.359375,3.437500),vec3(-1.023438,0.343750,3.359375),vec3(1.023438,0.343750,3.359375),vec3(-0.843750,0.289062,3.210938),vec3(0.843750,0.289062,3.210938),vec3(-0.835938,0.171875,3.273438),vec3(0.835938,0.171875,3.273438),vec3(-0.757812,0.093750,3.273438),vec3(0.757812,0.093750,3.273438),vec3(-0.820312,0.085938,3.273438),vec3(0.820312,0.085938,3.273438),vec3(-0.843750,0.015625,3.273438),vec3(0.843750,0.015625,3.273438),vec3(-0.812500,-0.015625,3.273438),vec3(0.812500,-0.015625,3.273438),vec3(-0.726562,0.000000,3.070312),vec3(0.726562,0.000000,3.070312),vec3(-0.718750,-0.023438,3.171875),vec3(0.718750,-0.023438,3.171875),vec3(-0.718750,0.039062,3.187500),vec3(0.718750,0.039062,3.187500),vec3(-0.796875,0.203125,3.210938),vec3(0.796875,0.203125,3.210938),vec3(-0.890625,0.242188,3.265625),vec3(0.890625,0.242188,3.265625),vec3(-0.890625,0.234375,3.320312),vec3(0.890625,0.234375,3.320312),vec3(-0.812500,-0.015625,3.320312),vec3(0.812500,-0.015625,3.320312),vec3(-0.851562,0.015625,3.320312),vec3(0.851562,0.015625,3.320312),vec3(-0.828125,0.078125,3.320312),vec3(0.828125,0.078125,3.320312),vec3(-0.765625,0.093750,3.320312),vec3(0.765625,0.093750,3.320312),vec3(-0.843750,0.171875,3.320312),vec3(0.843750,0.171875,3.320312),vec3(-1.039062,0.328125,3.414062),vec3(1.039062,0.328125,3.414062),vec3(-1.187500,0.343750,3.484375),vec3(1.187500,0.343750,3.484375),vec3(-1.257812,0.242188,3.492188),vec3(1.257812,0.242188,3.492188),vec3(-1.210938,0.085938,3.484375),vec3(1.210938,0.085938,3.484375),vec3(-1.046875,0.000000,3.421875),vec3(1.046875,0.000000,3.421875),vec3(-0.882812,-0.015625,3.265625),vec3(0.882812,-0.015625,3.265625),vec3(-0.953125,0.289062,3.343750),vec3(0.953125,0.289062,3.343750),vec3(-0.890625,0.109375,3.328125),vec3(0.890625,0.109375,3.328125),vec3(-0.937500,0.062500,3.335938),vec3(0.937500,0.062500,3.335938),vec3(-1.000000,0.125000,3.367188),vec3(1.000000,0.125000,3.367188),vec3(-0.960938,0.171875,3.351562),vec3(0.960938,0.171875,3.351562),vec3(-1.015625,0.234375,3.375000),vec3(1.015625,0.234375,3.375000),vec3(-1.054688,0.187500,3.382812),vec3(1.054688,0.187500,3.382812),vec3(-1.109375,0.210938,3.390625),vec3(1.109375,0.210938,3.390625),vec3(-1.085938,0.273438,3.390625),vec3(1.085938,0.273438,3.390625),vec3(-1.023438,0.437500,3.484375),vec3(1.023438,0.437500,3.484375),vec3(-1.250000,0.468750,3.546875),vec3(1.250000,0.468750,3.546875),vec3(-1.367188,0.296875,3.500000),vec3(1.367188,0.296875,3.500000),vec3(-1.312500,0.054688,3.531250),vec3(1.312500,0.054688,3.531250),vec3(-1.039062,-0.085938,3.492188),vec3(1.039062,-0.085938,3.492188),vec3(-0.789062,-0.125000,3.328125),vec3(0.789062,-0.125000,3.328125),vec3(-0.859375,0.382812,3.382812),vec3(0.859375,0.382812,3.382812)},{46,2,44,3,47,45,44,4,42,5,45,43,2,6,4,7,3,5,0,8,2,9,1,3,10,14,8,15,11,9,8,16,6,17,9,7,20,16,14,21,17,19,12,20,14,21,13,15,22,26,20,27,23,21,26,18,20,27,19,29,32,28,26,33,29,31,34,26,24,35,27,33,36,32,34,37,33,39,38,30,32,39,31,41,44,40,38,45,41,43,46,38,36,47,39,45,36,48,46,37,49,51,34,50,36,35,51,53,24,52,34,25,53,55,22,54,24,23,55,57,22,58,56,59,23,57,12,62,58,63,13,59,10,64,62,65,11,63,0,48,64,49,1,65,60,64,48,49,65,61,62,64,60,61,65,63,60,58,62,63,59,61,60,56,58,59,57,61,60,54,56,57,55,61,60,52,54,55,53,61,60,50,52,53,51,61,60,48,50,51,49,61,173,90,88,174,90,175,171,88,86,172,89,174,84,171,86,172,85,87,82,169,84,170,83,85,80,167,82,168,81,83,78,145,163,146,79,164,93,145,91,94,146,148,93,149,147,150,94,148,97,149,95,98,150,152,99,151,97,100,152,154,101,153,99,102,154,156,101,157,155,158,102,156,105,157,103,106,158,160,107,159,105,108,160,162,66,161,107,66,162,67,127,161,109,128,162,160,127,157,159,158,128,160,155,178,125,156,179,158,153,125,123,154,126,156,151,123,121,152,124,154,149,121,119,150,122,152,147,119,117,148,120,150,145,117,115,146,118,148,163,115,113,164,116,146,113,176,163,176,114,164,161,111,109,162,112,67,111,177,182,177,112,183,180,177,176,181,177,183,134,175,173,175,135,174,132,173,171,174,133,172,132,169,130,133,170,172,165,184,167,185,166,168,130,167,184,168,131,185,189,186,143,189,187,188,186,68,184,187,68,188,130,68,129,131,68,185,141,190,143,191,142,144,139,192,141,193,140,142,196,139,138,197,140,195,70,138,137,70,138,197,143,69,189,144,69,191,190,207,69,191,207,206,70,199,196,200,70,197,196,201,194,202,197,195,201,192,194,202,193,204,192,205,190,206,193,191,203,199,198,204,200,202,198,205,203,206,198,204,138,163,176,164,138,176,139,210,163,211,140,164,143,210,141,144,211,213,186,212,143,187,213,166,208,165,80,209,166,213,214,212,208,215,213,211,78,210,214,211,79,215,129,221,130,129,222,71,132,221,219,222,133,220,134,219,217,220,135,218,136,217,216,218,136,216,217,230,216,218,230,229,217,226,228,227,218,229,219,224,226,225,220,227,71,224,221,71,225,223,223,228,224,229,223,225,224,228,226,227,229,225,182,233,231,234,183,232,111,231,253,232,112,254,111,255,109,112,256,254,113,233,180,114,234,252,113,249,251,250,114,252,115,247,249,248,116,250,117,245,247,246,118,248,119,243,245,244,120,246,123,243,121,124,244,242,125,241,123,126,242,240,125,235,239,236,126,240,178,237,235,238,179,236,127,255,237,256,128,238,255,275,237,256,276,258,235,275,277,276,236,278,235,273,239,236,274,278,239,271,241,240,272,274,243,271,269,272,244,270,243,267,245,244,268,270,247,267,265,268,248,266,247,263,249,248,264,266,249,261,251,250,262,264,233,261,279,262,234,280,255,259,257,260,256,258,253,281,259,282,254,260,231,279,281,280,232,282,66,283,72,284,66,72,107,285,283,286,108,284,103,285,105,104,286,288,101,287,103,102,288,290,99,289,101,100,290,292,99,293,291,294,100,292,95,293,97,96,294,296,95,297,295,298,96,296,93,299,297,300,94,298,308,337,307,308,338,328,307,335,306,307,336,338,306,339,305,306,340,336,88,305,339,305,89,340,86,339,333,340,87,334,84,333,329,334,85,330,82,329,331,330,83,332,329,337,331,338,330,332,333,335,329,334,336,340,331,327,325,332,328,338,80,331,325,332,81,326,341,214,208,342,215,344,325,208,80,326,209,342,214,345,78,215,346,344,345,91,78,346,92,300,323,303,76,324,303,352,351,77,303,352,77,350,77,347,304,348,77,304,304,327,308,328,304,308,327,341,325,328,342,348,295,317,309,318,296,310,315,76,75,316,76,324,357,302,301,358,302,356,302,353,74,354,302,74,74,315,75,316,74,75,291,361,363,362,292,364,363,367,365,368,364,366,365,369,371,370,366,372,371,375,373,376,372,374,377,375,313,378,376,374,315,373,377,374,316,378,353,371,373,372,354,374,355,365,371,366,356,372,357,363,365,364,358,366,291,359,289,292,360,364,359,301,73,360,301,358,283,287,289,288,284,290,283,359,73,360,284,73,72,283,73,73,284,72,295,361,293,296,362,310,309,367,361,368,310,362,311,369,367,370,312,368,375,381,313,376,382,370,349,383,347,350,384,386,383,319,317,384,320,386,297,383,317,384,298,318,299,341,383,342,300,384,341,347,383,384,348,342,299,345,343,344,346,300,321,377,313,322,378,380,377,323,315,378,324,380,385,321,319,386,322,380,351,385,349,352,386,380,323,379,351,352,380,324,387,401,399,388,402,414,399,403,397,404,400,398,403,395,397,404,396,406,405,393,395,406,394,408,407,391,393,408,392,410,391,411,389,412,392,390,409,417,411,418,410,412,407,419,409,420,408,410,423,407,405,424,408,422,425,405,403,426,406,424,427,403,401,428,404,426,401,415,427,416,402,428,319,441,317,320,442,444,389,443,319,390,444,412,309,441,311,442,310,312,381,413,387,414,382,388,411,439,443,440,412,444,445,439,437,446,440,444,433,437,435,438,434,436,447,433,431,448,434,446,447,449,429,448,450,432,429,415,413,430,416,450,311,429,381,430,312,382,441,447,311,442,448,446,441,443,445,446,444,442,415,451,475,452,416,476,431,451,449,432,452,462,431,459,461,460,432,462,435,459,433,436,460,458,437,457,435,438,458,456,437,453,455,454,438,456,439,473,453,474,440,454,427,475,463,476,428,464,425,463,465,464,426,466,423,465,467,466,424,468,423,469,421,424,470,468,421,471,419,422,472,470,419,473,417,420,474,472,455,477,457,456,478,480,479,483,477,480,484,482,483,487,485,488,484,486,487,491,485,488,492,490,463,485,491,486,464,492,483,475,451,484,476,486,461,483,451,462,484,478,457,461,459,462,458,460,473,455,453,474,456,480,471,479,473,480,472,474,487,471,469,488,472,482,489,469,467,490,470,488,465,489,467,490,466,468,463,491,465,466,492,464,391,503,501,504,392,502,393,501,499,502,394,500,393,497,395,394,498,500,395,495,397,396,496,498,397,493,399,398,494,496,399,505,387,400,506,494,501,505,493,502,506,504,493,499,501,500,494,502,495,497,499,500,498,496,381,505,313,382,506,388,313,503,321,504,314,322,319,503,389,504,320,390,46,0,2,3,1,47,44,2,4,5,3,45,2,8,6,7,9,3,0,10,8,9,11,1,10,12,14,15,13,11,8,14,16,17,15,9,20,18,16,21,15,17,12,22,20,21,23,13,22,24,26,27,25,23,26,28,18,27,21,19,32,30,28,33,27,29,34,32,26,35,25,27,36,38,32,37,35,33,38,40,30,39,33,31,44,42,40,45,39,41,46,44,38,47,37,39,36,50,48,37,47,49,34,52,50,35,37,51,24,54,52,25,35,53,22,56,54,23,25,55,22,12,58,59,13,23,12,10,62,63,11,13,10,0,64,65,1,11,0,46,48,49,47,1,173,175,90,174,89,90,171,173,88,172,87,89,84,169,171,172,170,85,82,167,169,170,168,83,80,165,167,168,166,81,78,91,145,146,92,79,93,147,145,94,92,146,93,95,149,150,96,94,97,151,149,98,96,150,99,153,151,100,98,152,101,155,153,102,100,154,101,103,157,158,104,102,105,159,157,106,104,158,107,161,159,108,106,160,66,67,161,66,108,162,127,159,161,128,110,162,127,178,157,158,179,128,155,157,178,156,126,179,153,155,125,154,124,126,151,153,123,152,122,124,149,151,121,150,120,122,147,149,119,148,118,120,145,147,117,146,116,118,163,145,115,164,114,116,113,180,176,176,181,114,161,67,111,162,110,112,111,67,177,177,67,112,180,182,177,181,176,177,134,136,175,175,136,135,132,134,173,174,135,133,132,171,169,133,131,170,165,186,184,185,187,166,130,169,167,168,170,131,189,188,186,189,144,187,186,188,68,187,185,68,130,184,68,131,129,68,141,192,190,191,193,142,139,194,192,193,195,140,196,194,139,197,138,140,70,196,138,143,190,69,144,189,69,190,205,207,191,69,207,70,198,199,200,198,70,196,199,201,202,200,197,201,203,192,202,195,193,192,203,205,206,204,193,203,201,199,204,198,200,198,207,205,206,207,198,138,139,163,164,140,138,139,141,210,211,142,140,143,212,210,144,142,211,186,165,212,187,144,213,208,212,165,209,81,166,214,210,212,215,209,213,78,163,210,211,164,79,129,71,221,129,131,222,132,130,221,222,131,133,134,132,219,220,133,135,136,134,217,218,135,136,217,228,230,218,216,230,217,219,226,227,220,218,219,221,224,225,222,220,71,223,224,71,222,225,223,230,228,229,230,223,182,180,233,234,181,183,111,182,231,232,183,112,111,253,255,112,110,256,113,251,233,114,181,234,113,115,249,250,116,114,115,117,247,248,118,116,117,119,245,246,120,118,119,121,243,244,122,120,123,241,243,124,122,244,125,239,241,126,124,242,125,178,235,236,179,126,178,127,237,238,128,179,127,109,255,256,110,128,255,257,275,256,238,276,235,237,275,276,238,236,235,277,273,236,240,274,239,273,271,240,242,272,243,241,271,272,242,244,243,269,267,244,246,268,247,245,267,268,246,248,247,265,263,248,250,264,249,263,261,250,252,262,233,251,261,262,252,234,255,253,259,260,254,256,253,231,281,282,232,254,231,233,279,280,234,232,66,107,283,284,108,66,107,105,285,286,106,108,103,287,285,104,106,286,101,289,287,102,104,288,99,291,289,100,102,290,99,97,293,294,98,100,95,295,293,96,98,294,95,93,297,298,94,96,93,91,299,300,92,94,308,327,337,308,307,338,307,337,335,307,306,336,306,335,339,306,305,340,88,90,305,305,90,89,86,88,339,340,89,87,84,86,333,334,87,85,82,84,329,330,85,83,329,335,337,338,336,330,333,339,335,334,330,336,331,337,327,332,326,328,80,82,331,332,83,81,341,343,214,342,209,215,325,341,208,326,81,209,214,343,345,215,79,346,345,299,91,346,79,92,323,351,303,324,76,303,351,349,77,352,303,77,77,349,347,348,350,77,304,347,327,328,348,304,327,347,341,328,326,342,295,297,317,318,298,296,315,323,76,316,75,76,357,355,302,358,301,302,302,355,353,354,356,302,74,353,315,316,354,74,291,293,361,362,294,292,363,361,367,368,362,364,365,367,369,370,368,366,371,369,375,376,370,372,377,373,375,378,314,376,315,353,373,374,354,316,353,355,371,372,356,354,355,357,365,366,358,356,357,359,363,364,360,358,291,363,359,292,290,360,359,357,301,360,73,301,283,285,287,288,286,284,283,289,359,360,290,284,295,309,361,296,294,362,309,311,367,368,312,310,311,381,369,370,382,312,375,369,381,376,314,382,349,385,383,350,348,384,383,385,319,384,318,320,297,299,383,384,300,298,299,343,341,342,344,300,321,379,377,322,314,378,377,379,323,378,316,324,385,379,321,386,320,322,351,379,385,352,350,386,387,413,401,388,400,402,399,401,403,404,402,400,403,405,395,404,398,396,405,407,393,406,396,394,407,409,391,408,394,392,391,409,411,412,410,392,409,419,417,418,420,410,407,421,419,420,422,408,423,421,407,424,406,408,425,423,405,426,404,406,427,425,403,428,402,404,401,413,415,416,414,402,319,443,441,320,318,442,389,411,443,390,320,444,309,317,441,442,318,310,381,429,413,414,430,382,411,417,439,440,418,412,445,443,439,446,438,440,433,445,437,438,446,434,447,445,433,448,432,434,447,431,449,448,430,450,429,449,415,430,414,416,311,447,429,430,448,312,441,445,447,442,312,448,415,449,451,452,450,416,431,461,451,432,450,452,431,433,459,460,434,432,435,457,459,436,434,460,437,455,457,438,436,458,437,439,453,454,440,438,439,417,473,474,418,440,427,415,475,476,416,428,425,427,463,464,428,426,423,425,465,466,426,424,423,467,469,424,422,470,421,469,471,422,420,472,419,471,473,420,418,474,455,479,477,456,458,478,479,481,483,480,478,484,483,481,487,488,482,484,487,489,491,488,486,492,463,475,485,486,476,464,483,485,475,484,452,476,461,477,483,462,452,484,457,477,461,462,478,458,473,479,455,474,454,456,471,481,479,480,482,472,487,481,471,488,470,472,489,487,469,490,468,470,465,491,489,490,492,466,391,389,503,504,390,392,393,391,501,502,392,394,393,499,497,394,396,498,395,497,495,396,398,496,397,495,493,398,400,494,399,493,505,400,388,506,501,503,505,502,494,506,493,495,499,500,496,494,381,387,505,382,314,506,313,505,503,504,506,314,319,321,503,504,322,320}); \ No newline at end of file