diff --git a/lab2/CMakeLists.txt b/lab2/CMakeLists.txt index 443ccee..80970bf 100644 --- a/lab2/CMakeLists.txt +++ b/lab2/CMakeLists.txt @@ -58,3 +58,6 @@ target_link_libraries(${PROJECT_NAME}_09 ${LIBS}) add_executable(${PROJECT_NAME}_10 ${CORE_SOURCES} src/render/render-10.cpp) target_link_libraries(${PROJECT_NAME}_10 ${LIBS}) + +add_executable(${PROJECT_NAME}_11 ${CORE_SOURCES} src/render/render-11.cpp) +target_link_libraries(${PROJECT_NAME}_11 ${LIBS}) diff --git a/lab2/src/render/render-11.cpp b/lab2/src/render/render-11.cpp new file mode 100644 index 0000000..a92e2a7 --- /dev/null +++ b/lab2/src/render/render-11.cpp @@ -0,0 +1,152 @@ +// +// Created by vlad on 23.03.23. +// + +#include "render.h" +#include "../graphics/MeshLoader.h" +#include "../graphics/Shader.h" + +#include + +static Mesh* mesh_xyz; +static Mesh* mesh_sphere; +static Mesh* mesh_cone; + +static Shader* shader; + + +static void drawSnowman(const glm::mat4& model) { + // снеговик, типа собран + + // нижний шар + shader->uniformMatrix("model", model); + mesh_sphere->draw(); + + // шар 2 + auto translate = glm::translate(glm::mat4(1.0f), glm::vec3(0, 1.5,0)); + auto scale = glm::scale(glm::mat4(1.0f), glm::vec3(0.5, 0.5 ,0.5)); + shader->uniformMatrix("model", model * translate * scale); + mesh_sphere->draw(); + + // глаз X- (со смещением по Z) + translate = glm::translate(glm::mat4(1.0f), glm::vec3(-0.25, 1.75, 0.25)); + scale = glm::scale(glm::mat4(1.0f), glm::vec3(0.25, 0.25,0.25)); + shader->uniformMatrix("model", model * translate * scale); + mesh_sphere->draw(); + + // глаз X+ (со смещением по Z) + translate = glm::translate(glm::mat4(1.0f), glm::vec3(0.25, 1.75, 0.25)); + shader->uniformMatrix("model", model * translate * scale); + mesh_sphere->draw(); + + // нос, (со смещением по Z) + translate = glm::translate(glm::mat4(1.0f), glm::vec3(0, 1.5, 0.5)); + auto rotate = glm::rotate(glm::mat4(1.0f), glm::radians(90.0f), glm::vec3(1, 0, 0)); + shader->uniformMatrix("model", model * translate * scale * rotate); + mesh_cone->draw(); +} + + +static void renderSceneStatic() { + // мировой центр, он же база 1 снеговика + auto base_s1 = glm::mat4(1.0f); + + // масштабирование всегда одинаковое + auto scale = glm::scale(glm::mat4(1.0f), glm::vec3(0.7, 0.7,0.7)); + + // база 2 снеговика = сместить в x+3 * масштаб + auto base_s2 = glm::translate(glm::mat4(1.0f), glm::vec3(3.0, 0, 0)) * scale; + + // база 3 снеговика = база 2 * смещение в y+3 * масштаб *0.7 + auto base_s3 = base_s2 * glm::translate(glm::mat4(1.0f), glm::vec3(0, 3.0, 0)) * scale; + + // база 4 снеговика = база 2 * смещение y+1.5 (уровень головы) x+3 * масштаб * масштаб + auto base_s4 = base_s2 * glm::translate(glm::mat4(1.0f), glm::vec3(3, 1.5, 0)) * scale * scale; + + // снеговики без вращений + drawSnowman(base_s1); + drawSnowman(base_s2); + drawSnowman(base_s3); + drawSnowman(base_s4); +} + + +static void renderSceneWithRotations() { + // мировой центр, он же база 1 снеговика + auto base_s1 = glm::mat4(1.0f); + + // масштабирование всегда одинаковое + auto scale = glm::scale(glm::mat4(1.0f), glm::vec3(0.7, 0.7,0.7)); + + // вертеть надо по Y и по Z, добавим эти оси + static float rotation_angle = 0.0f; + auto rotate_y = glm::rotate(glm::mat4(1.0f), rotation_angle, glm::vec3(0, 1, 0)); + auto rotate_z = glm::rotate(glm::mat4(1.0f), rotation_angle, glm::vec3(0, 0, 1)); + rotation_angle += 0.0004f; + + // вращение с2 вокруг оси Y с1 + // база 2 снеговика = база 1 * вращение y * сместить в x+3 * масштаб + auto base_s2 = base_s1 * rotate_y * glm::translate(glm::mat4(1.0f), glm::vec3(3.0, 0, 0)) * scale; + + // вращение с3 вокруг оси Z c2 + // база 3 снеговика = база 2 * вращение z * смещение в y+3 * масштаб *0.7 + auto base_s3 = base_s2 * rotate_z * glm::translate(glm::mat4(1.0f), glm::vec3(0, 3.0, 0)) * scale; + + // вращение С4 вокруг оси Y с2 на уровне головы модели + // база 4 снеговика = база 2 * смещение y+1.5 (уровень головы) * вращение y * смещение x+3 * масштаб * масштаб + auto base_s4 = base_s2 * glm::translate(glm::mat4(1.0f), glm::vec3(0, 1.5, 0)) * rotate_y + * glm::translate(glm::mat4(1.0f), glm::vec3(3, 0, 0)) * scale * scale; + + // снеговики без вращений + drawSnowman(base_s1); + drawSnowman(base_s2); + drawSnowman(base_s3); + drawSnowman(base_s4); +} + + +void renderScene(Camera& cam) { + auto projview = cam.getProjection() * cam.getView(); + shader->use(); + shader->uniformMatrix("projview", projview); + + shader->uniformMatrix("model", glm::mat4(1.0f)); + mesh_xyz->draw(); + +// renderSceneStatic(); + renderSceneWithRotations(); +} + +int loadResources() { + mesh_xyz = MeshLoader::loadMesh("res/xyz"); + if (mesh_xyz == nullptr) { + std::cerr << "Failed to load 'xyz' mesh!" << std::endl; + return -1; + } + + mesh_sphere = MeshLoader::loadMesh("res/sphere"); + if (mesh_sphere == nullptr) { + std::cerr << "Failed to load 'sphere' mesh!" << std::endl; + return -1; + } + + mesh_cone = MeshLoader::loadMesh("res/cone"); + if (mesh_cone == nullptr) { + std::cerr << "Failed to load 'cone' mesh!" << std::endl; + return -1; + } + + shader = Shader::loadShader("res/main-colored.vsh", "res/main-colored.fsh"); + if (shader == nullptr) { + return -1; + } + + return 0; +} + +void unloadResources() { + delete mesh_xyz; + delete mesh_cone; + delete mesh_sphere; + delete shader; +} \ No newline at end of file