From db19d4ec6a0c9c8e825ca22c7a8945b20a6dfd84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikl=C3=B3s=20T=C3=B3th?= <tothmiklostibor@gmail.com> Date: Thu, 15 Apr 2021 23:19:04 +0200 Subject: [PATCH] =?UTF-8?q?polkorrekt=20k=C3=B3d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Skeleton.cpp | 82 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 29 deletions(-) diff --git a/Skeleton.cpp b/Skeleton.cpp index 86e83e0..3cf1328 100644 --- a/Skeleton.cpp +++ b/Skeleton.cpp @@ -1,5 +1,35 @@ //============================================================================================= -// Computer Graphics Sample Program: Ray-tracing-let +// Mintaprogram: Ray-tracing-let +// +// A beadott program csak ebben a fajlban lehet, a fajl 1 byte-os ASCII karaktereket tartalmazhat, BOM kihuzando. +// Tilos: +// - mast "beincludolni", illetve mas konyvtarat hasznalni +// - faljmuveleteket vegezni a printf-et kiveve +// - Mashonnan atvett programresszleteket forrasmegjeloles nelkul felhasznalni es +// - felesleges programsorokat a beadott programban hagyni!!!!!!! +// - felesleges kommenteket a beadott programba irni a forrasmegjelolest kommentjeit kiveve +// --------------------------------------------------------------------------------------------- +// A feladatot ANSI C++ nyelvu forditoprogrammal ellenorizzuk, a Visual Studio-hoz kepesti elteresekrol +// es a leggyakoribb hibakrol (pl. ideiglenes objektumot nem lehet referencia tipusnak ertekul adni) +// a hazibeado portal ad egy osszefoglalot. +// --------------------------------------------------------------------------------------------- +// A feladatmegoldasokban csak olyan OpenGL fuggvenyek hasznalhatok, amelyek az oran a feladatkiadasig elhangzottak +// A keretben nem szereplo GLUT fuggvenyek tiltottak. +// +// NYILATKOZAT +// --------------------------------------------------------------------------------------------- +// Nev : Tóth Miklós +// Neptun : FLGIIG +// --------------------------------------------------------------------------------------------- +// ezennel kijelentem, hogy a feladatot magam keszitettem, es ha barmilyen segitseget igenybe vettem vagy +// mas szellemi termeket felhasznaltam, akkor a forrast es az atvett reszt kommentekben egyertelmuen jeloltem. +// A forrasmegjeloles kotelme vonatkozik az eloadas foliakat es a targy oktatoi, illetve a +// grafhazi doktor tanacsait kiveve barmilyen csatornan (szoban, irasban, Interneten, stb.) erkezo minden egyeb +// informaciora (keplet, program, algoritmus, stb.). Kijelentem, hogy a forrasmegjelolessel atvett reszeket is ertem, +// azok helyessegere matematikai bizonyitast tudok adni. Tisztaban vagyok azzal, hogy az atvett reszek nem szamitanak +// a sajat kontribucioba, igy a feladat elfogadasarol a tobbi resz mennyisege es minosege alapjan szuletik dontes. +// Tudomasul veszem, hogy a forrasmegjeloles kotelmenek megsertese eseten a hazifeladatra adhato pontokat +// negativ elojellel szamoljak el es ezzel parhuzamosan eljaras is indul velem szemben. //============================================================================================= #include "framework.h" @@ -48,8 +78,6 @@ struct Light; class Scene; struct Material { - Material() {} - virtual void trace(const Scene& scene, const Hit& hit, const Ray& ray, const std::vector<Light*>& lights, int depth, vec3& outRadiance) = 0; }; @@ -67,7 +95,7 @@ struct RoughMaterial: Material { }; vec3 operator/(const vec3& num, const vec3& denom) { - return vec3(num.x / denom.x, num.y / denom.y, num.z / denom.z); + return {num.x / denom.x, num.y / denom.y, num.z / denom.z}; } struct ReflectiveMaterial: Material { @@ -81,16 +109,13 @@ struct ReflectiveMaterial: Material { }; struct PortalMaterial: Material { - PortalMaterial() { - } void trace(const Scene& scene, const Hit& hit, const Ray& ray, const std::vector<Light*>& lights, int depth, vec3& outRadiance) override; }; struct Hit { - float t; + float t = -1; vec3 position, normal; - Material * material; - Hit() { t = -1; } + Material* material = nullptr; }; struct Ray { @@ -100,7 +125,7 @@ struct Ray { class Intersectable { protected: - Material * material; + Material * material = nullptr; public: virtual Hit intersect(const Ray& ray) = 0; }; @@ -115,7 +140,7 @@ struct Sphere : public Intersectable { material = _material; } - Hit intersect(const Ray& ray) { + Hit intersect(const Ray& ray) override { Hit hit; vec3 dist = ray.start - center; float a = dot(ray.dir, ray.dir); @@ -157,7 +182,7 @@ struct Pentagon : public Intersectable { material = _material; } - Hit intersect(const Ray& ray) { + Hit intersect(const Ray& ray) override { Hit hit; auto n = cross(r2-r1, r3-r1); n = normalize(n); @@ -196,7 +221,7 @@ struct Pentagon : public Intersectable { class Camera { vec3 eye, lookat, right, up; - float fov; + float fov = 0; public: void set(vec3 _eye, vec3 _lookat, vec3 vup, float _fov) { eye = _eye; @@ -208,8 +233,8 @@ public: up = normalize(cross(w, right)) * focus * tanf(fov / 2); } Ray getRay(int X, int Y) { - vec3 dir = lookat + right * (2.0f * (X + 0.5f) / windowWidth - 1) + up * (2.0f * (Y + 0.5f) / windowHeight - 1) - eye; - return Ray(eye, dir); + vec3 dir = lookat + right * (2.0f * (float(X) + 0.5f) / windowWidth - 1) + up * (2.0f * (float(Y) + 0.5f) / windowHeight - 1) - eye; + return {eye, dir}; } void Animate(float dt){ vec3 d = eye - lookat; @@ -221,9 +246,9 @@ public: struct Light { vec3 position; vec3 Le; - Light(vec3 _position, vec3 _Le) { - position = _position; - Le = _Le; + Light(vec3 position, vec3 Le) { + this->position = position; + this->Le = Le; } vec3 getDirection(const vec3& from) const { @@ -236,7 +261,7 @@ struct Light { } }; -float rnd() { return (float)rand() / RAND_MAX; } +float rnd() { return (float)rand() / float(RAND_MAX); } const float epsilon = 0.0001f; @@ -267,8 +292,7 @@ public: vec3 kd(0.3f, 0.3f, .3f), ks(2, 2, 2); Material* dodekaMat = new RoughMaterial(kd, ks, 50); - for (int i = 0; i < 12; i++) { - auto indexRow = objIndex[i]; + for (auto indexRow : objIndex) { auto p1 = objPoints[indexRow[0]]; auto p2 = objPoints[indexRow[1]]; auto p3 = objPoints[indexRow[2]]; @@ -280,10 +304,10 @@ public: } void render(std::vector<vec4>& image) { -#pragma omp parallel for collapse(2) - for (int Y = 0; Y < windowHeight; Y++) { - for (int X = 0; X < windowWidth; X++) { - vec3 color = trace(camera.getRay(X, Y)); +#pragma omp parallel for collapse(2) default(none) shared(windowHeight, windowWidth, image) + for (unsigned int Y = 0; Y < windowHeight; Y++) { + for (unsigned int X = 0; X < windowWidth; X++) { + vec3 color = trace(camera.getRay(int(X), int(Y))); image[Y * windowWidth + X] = vec4(color.x, color.y, color.z, 1); } } @@ -400,8 +424,8 @@ public: texture.create(wW, wH, image); } - FullScreenTexturedQuad(int windowWidth, int windowHeight, std::vector<vec4>& image) - : wW(windowWidth), wH(windowHeight), texture(windowWidth, windowHeight, image) + FullScreenTexturedQuad(int windowW, int windowH, std::vector<vec4>& image) + : wW(windowW), wH(windowH), texture(windowWidth, windowHeight, image) { glGenVertexArrays(1, &vao); // create 1 vertex array object glBindVertexArray(vao); // make it active @@ -436,7 +460,7 @@ void onInitialization() { long timeStart = glutGet(GLUT_ELAPSED_TIME); scene.render(image); long timeEnd = glutGet(GLUT_ELAPSED_TIME); - printf("Rendering time: %d milliseconds\n", (timeEnd - timeStart)); + printf("Rendering time: %ld milliseconds\n", (timeEnd - timeStart)); // copy image to GPU as a texture fullScreenTexturedQuad = new FullScreenTexturedQuad(windowWidth, windowHeight, image); @@ -452,7 +476,7 @@ void onDisplay() { long timeStart = glutGet(GLUT_ELAPSED_TIME); scene.render(image); long timeEnd = glutGet(GLUT_ELAPSED_TIME); - printf("Rendering time: %d milliseconds\n", (timeEnd - timeStart)); + printf("Rendering time: %ld milliseconds\n", (timeEnd - timeStart)); fullScreenTexturedQuad->loadImage(image); -- GitLab