Добавлен пункт 11 лабы 2
This commit is contained in:
parent
e539edc655
commit
44c864c4b3
@ -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})
|
||||
|
152
lab2/src/render/render-11.cpp
Normal file
152
lab2/src/render/render-11.cpp
Normal file
@ -0,0 +1,152 @@
|
||||
//
|
||||
// Created by vlad on 23.03.23.
|
||||
//
|
||||
|
||||
#include "render.h"
|
||||
#include "../graphics/MeshLoader.h"
|
||||
#include "../graphics/Shader.h"
|
||||
|
||||
#include <glm/ext/matrix_transform.hpp>
|
||||
|
||||
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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user