Добавлен снеговик, добавлены кординатные оси, рефактор рендеринга
This commit is contained in:
parent
273ae90ea3
commit
e42ce2fc73
@ -22,7 +22,7 @@ add_executable(
|
|||||||
src/graphics/Mesh.cpp
|
src/graphics/Mesh.cpp
|
||||||
src/graphics/Shader.h
|
src/graphics/Shader.h
|
||||||
src/graphics/Shader.cpp
|
src/graphics/Shader.cpp
|
||||||
src/graphics/MeshLoader.cpp src/graphics/MeshLoader.h)
|
src/graphics/MeshLoader.cpp src/graphics/MeshLoader.h src/render.cpp src/render.h)
|
||||||
|
|
||||||
target_link_libraries(${PROJECT_NAME} glfw)
|
target_link_libraries(${PROJECT_NAME} glfw)
|
||||||
target_link_libraries(${PROJECT_NAME} GLEW::GLEW)
|
target_link_libraries(${PROJECT_NAME} GLEW::GLEW)
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
# Blender MTL File: 'cube.blend'
|
|
||||||
# Material Count: 1
|
|
||||||
|
|
||||||
newmtl CubeColor
|
|
||||||
Ns 250.000000
|
|
||||||
Ka 1.000000 1.000000 1.000000
|
|
||||||
Kd 0.800000 0.447721 0.037177
|
|
||||||
Ks 0.500000 0.500000 0.500000
|
|
||||||
Ke 0.000000 0.000000 0.000000
|
|
||||||
Ni 1.450000
|
|
||||||
d 1.000000
|
|
||||||
illum 2
|
|
@ -1,32 +0,0 @@
|
|||||||
# Blender v3.4.1 OBJ File: 'cube.blend'
|
|
||||||
# www.blender.org
|
|
||||||
mtllib cube.mtl
|
|
||||||
o Cube
|
|
||||||
v 1.000000 1.000000 -1.000000
|
|
||||||
v 1.000000 -1.000000 -1.000000
|
|
||||||
v 1.000000 1.000000 1.000000
|
|
||||||
v 1.000000 -1.000000 1.000000
|
|
||||||
v -1.000000 1.000000 -1.000000
|
|
||||||
v -1.000000 -1.000000 -1.000000
|
|
||||||
v -1.000000 1.000000 1.000000
|
|
||||||
v -1.000000 -1.000000 1.000000
|
|
||||||
vn 0.0000 1.0000 0.0000
|
|
||||||
vn 0.0000 0.0000 1.0000
|
|
||||||
vn -1.0000 0.0000 0.0000
|
|
||||||
vn 0.0000 -1.0000 0.0000
|
|
||||||
vn 1.0000 0.0000 0.0000
|
|
||||||
vn 0.0000 0.0000 -1.0000
|
|
||||||
usemtl CubeColor
|
|
||||||
s off
|
|
||||||
f 5//1 3//1 1//1
|
|
||||||
f 3//2 8//2 4//2
|
|
||||||
f 7//3 6//3 8//3
|
|
||||||
f 2//4 8//4 6//4
|
|
||||||
f 1//5 4//5 2//5
|
|
||||||
f 5//6 2//6 6//6
|
|
||||||
f 5//1 7//1 3//1
|
|
||||||
f 3//2 7//2 8//2
|
|
||||||
f 7//3 5//3 6//3
|
|
||||||
f 2//4 4//4 8//4
|
|
||||||
f 1//5 3//5 4//5
|
|
||||||
f 5//6 1//6 2//6
|
|
@ -1,10 +1,24 @@
|
|||||||
#version 330 core
|
#version 330 core
|
||||||
|
|
||||||
in vec4 a_color;
|
in vec4 fragColor;
|
||||||
|
in vec3 fragPos;
|
||||||
|
in vec3 fragNormal;
|
||||||
|
|
||||||
out vec4 f_color;
|
out vec4 f_color;
|
||||||
|
|
||||||
|
float map(float value, float min1, float max1, float min2, float max2) {
|
||||||
|
return min2 + (value - min1) * (max2 - min2) / (max1 - min1);
|
||||||
|
}
|
||||||
|
|
||||||
void main(){
|
void main(){
|
||||||
f_color = a_color;
|
vec3 lightColor = vec3(1, 1, 1);
|
||||||
|
vec3 lightDir = vec3(1, 1, 1);
|
||||||
|
|
||||||
|
// диффузное освещение
|
||||||
|
// dot получается [-1 ... 1]
|
||||||
|
float diff = dot(normalize(fragNormal), normalize(lightDir));
|
||||||
|
// теперь делаем диапазон [0.2 ... 1]
|
||||||
|
diff = map(diff, -1, 1, 0.2, 1);
|
||||||
|
|
||||||
|
f_color = vec4(diff * lightColor * fragColor.rgb, fragColor.a);
|
||||||
}
|
}
|
||||||
|
@ -4,20 +4,18 @@ layout (location = 0) in vec3 v_position;
|
|||||||
layout (location = 1) in vec3 v_normal;
|
layout (location = 1) in vec3 v_normal;
|
||||||
layout (location = 2) in vec3 v_color;
|
layout (location = 2) in vec3 v_color;
|
||||||
|
|
||||||
out vec4 a_color;
|
out vec4 fragColor;
|
||||||
|
out vec3 fragPos;
|
||||||
|
out vec3 fragNormal;
|
||||||
|
|
||||||
uniform mat4 projview;
|
uniform mat4 projview;
|
||||||
uniform mat4 model;
|
uniform mat4 model;
|
||||||
|
|
||||||
void main(){
|
void main(){
|
||||||
// gl_Position = vec4(v_position, 1) * projview;
|
// gl_Position = vec4(v_position, 1) * projview;
|
||||||
gl_Position = projview * model * vec4(v_position, 1);
|
fragPos = vec3(model * vec4(v_position, 1.0));
|
||||||
|
gl_Position = projview * vec4(fragPos, 1.0);
|
||||||
|
|
||||||
// dot получается [-1 ... 1]
|
fragNormal = mat3(transpose(inverse(model))) * v_normal;
|
||||||
float l = dot((model * vec4(v_position, 1)).xyz, normalize(vec3(1, 1, 1)));
|
fragColor = vec4(v_color, 1);
|
||||||
// сначала делаем диапазон [1 ... 3]
|
|
||||||
// потом [0.5 ... 1]
|
|
||||||
l = (l + 2) / 3;
|
|
||||||
|
|
||||||
a_color = vec4(v_color * l, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BIN
lab2/res/snowman.blend
Normal file
BIN
lab2/res/snowman.blend
Normal file
Binary file not shown.
42
lab2/res/snowman.mtl
Normal file
42
lab2/res/snowman.mtl
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# Blender MTL File: 'mesh_snowman.blend'
|
||||||
|
# Material Count: 4
|
||||||
|
|
||||||
|
newmtl Body-0
|
||||||
|
Ns 250.000000
|
||||||
|
Ka 1.000000 1.000000 1.000000
|
||||||
|
Kd 0.310327 0.800000 0.457029
|
||||||
|
Ks 0.500000 0.500000 0.500000
|
||||||
|
Ke 0.000000 0.000000 0.000000
|
||||||
|
Ni 1.450000
|
||||||
|
d 1.000000
|
||||||
|
illum 2
|
||||||
|
|
||||||
|
newmtl Body-1
|
||||||
|
Ns 250.000000
|
||||||
|
Ka 1.000000 1.000000 1.000000
|
||||||
|
Kd 0.569280 0.266345 0.800000
|
||||||
|
Ks 0.500000 0.500000 0.500000
|
||||||
|
Ke 0.000000 0.000000 0.000000
|
||||||
|
Ni 1.450000
|
||||||
|
d 1.000000
|
||||||
|
illum 2
|
||||||
|
|
||||||
|
newmtl Face
|
||||||
|
Ns 250.000000
|
||||||
|
Ka 1.000000 1.000000 1.000000
|
||||||
|
Kd 0.800000 0.116962 0.000000
|
||||||
|
Ks 0.500000 0.500000 0.500000
|
||||||
|
Ke 0.000000 0.000000 0.000000
|
||||||
|
Ni 1.450000
|
||||||
|
d 1.000000
|
||||||
|
illum 2
|
||||||
|
|
||||||
|
newmtl Neck
|
||||||
|
Ns 250.000000
|
||||||
|
Ka 1.000000 1.000000 1.000000
|
||||||
|
Kd 0.800000 0.502547 0.345282
|
||||||
|
Ks 0.500000 0.500000 0.500000
|
||||||
|
Ke 0.000000 0.000000 0.000000
|
||||||
|
Ni 1.450000
|
||||||
|
d 1.000000
|
||||||
|
illum 2
|
4839
lab2/res/snowman.obj
Normal file
4839
lab2/res/snowman.obj
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
42
lab2/res/xyz.mtl
Normal file
42
lab2/res/xyz.mtl
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# Blender MTL File: 'xyz.blend'
|
||||||
|
# Material Count: 4
|
||||||
|
|
||||||
|
newmtl Blue
|
||||||
|
Ns 250.000000
|
||||||
|
Ka 1.000000 1.000000 1.000000
|
||||||
|
Kd 0.000000 0.000000 1.000000
|
||||||
|
Ks 0.500000 0.500000 0.500000
|
||||||
|
Ke 0.000000 0.000000 0.000000
|
||||||
|
Ni 1.450000
|
||||||
|
d 1.000000
|
||||||
|
illum 2
|
||||||
|
|
||||||
|
newmtl Green
|
||||||
|
Ns 250.000000
|
||||||
|
Ka 1.000000 1.000000 1.000000
|
||||||
|
Kd 0.000000 1.000000 0.000000
|
||||||
|
Ks 0.500000 0.500000 0.500000
|
||||||
|
Ke 0.000000 0.000000 0.000000
|
||||||
|
Ni 1.450000
|
||||||
|
d 1.000000
|
||||||
|
illum 2
|
||||||
|
|
||||||
|
newmtl Red
|
||||||
|
Ns 250.000000
|
||||||
|
Ka 1.000000 1.000000 1.000000
|
||||||
|
Kd 1.000000 0.000000 0.000000
|
||||||
|
Ks 0.500000 0.500000 0.500000
|
||||||
|
Ke 0.000000 0.000000 0.000000
|
||||||
|
Ni 1.450000
|
||||||
|
d 1.000000
|
||||||
|
illum 2
|
||||||
|
|
||||||
|
newmtl center_color
|
||||||
|
Ns 250.000000
|
||||||
|
Ka 1.000000 1.000000 1.000000
|
||||||
|
Kd 0.800000 0.043866 0.393530
|
||||||
|
Ks 0.500000 0.500000 0.500000
|
||||||
|
Ke 0.000000 0.000000 0.000000
|
||||||
|
Ni 1.450000
|
||||||
|
d 1.000000
|
||||||
|
illum 2
|
155
lab2/res/xyz.obj
Normal file
155
lab2/res/xyz.obj
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
# Blender v3.4.1 OBJ File: 'xyz.blend'
|
||||||
|
# www.blender.org
|
||||||
|
mtllib xyz.mtl
|
||||||
|
o DirX_Cube.001
|
||||||
|
v 0.000000 -0.039002 0.039002
|
||||||
|
v 0.000000 0.039002 0.039002
|
||||||
|
v 0.000000 -0.039002 -0.039002
|
||||||
|
v 0.000000 0.039002 -0.039002
|
||||||
|
v 0.874245 -0.039002 0.039002
|
||||||
|
v 0.874245 0.039002 0.039002
|
||||||
|
v 0.874245 -0.039002 -0.039002
|
||||||
|
v 0.874245 0.039002 -0.039002
|
||||||
|
v 0.871079 -0.088003 0.087236
|
||||||
|
v 0.871079 0.088003 0.087236
|
||||||
|
v 0.871079 -0.088003 -0.088770
|
||||||
|
v 0.871079 0.088003 -0.088770
|
||||||
|
v 0.999919 0.000000 -0.000767
|
||||||
|
vn -1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 0.0000 -1.0000
|
||||||
|
vn 0.0000 0.0000 1.0000
|
||||||
|
vn 0.0000 -1.0000 0.0000
|
||||||
|
vn 0.0000 1.0000 0.0000
|
||||||
|
vn 0.5640 0.0000 -0.8258
|
||||||
|
vn 0.5640 0.0000 0.8258
|
||||||
|
vn 0.5640 -0.8258 0.0000
|
||||||
|
vn 0.5640 0.8258 0.0000
|
||||||
|
usemtl Red
|
||||||
|
s off
|
||||||
|
f 2//1 3//1 1//1
|
||||||
|
f 4//2 7//2 3//2
|
||||||
|
f 6//3 1//3 5//3
|
||||||
|
f 7//4 1//4 3//4
|
||||||
|
f 4//5 6//5 8//5
|
||||||
|
f 10//1 11//1 9//1
|
||||||
|
f 11//6 12//6 13//6
|
||||||
|
f 13//7 10//7 9//7
|
||||||
|
f 11//8 13//8 9//8
|
||||||
|
f 13//9 12//9 10//9
|
||||||
|
f 2//1 4//1 3//1
|
||||||
|
f 4//2 8//2 7//2
|
||||||
|
f 6//3 2//3 1//3
|
||||||
|
f 7//4 5//4 1//4
|
||||||
|
f 4//5 2//5 6//5
|
||||||
|
f 10//1 12//1 11//1
|
||||||
|
o DirY_Cube.004
|
||||||
|
v 0.039002 0.000000 0.039002
|
||||||
|
v -0.039002 0.000000 0.039002
|
||||||
|
v 0.039002 0.000000 -0.039002
|
||||||
|
v -0.039002 0.000000 -0.039002
|
||||||
|
v 0.039002 0.874245 0.039002
|
||||||
|
v -0.039002 0.874245 0.039002
|
||||||
|
v 0.039002 0.874245 -0.039002
|
||||||
|
v -0.039002 0.874245 -0.039002
|
||||||
|
v 0.088003 0.871079 0.087236
|
||||||
|
v -0.088003 0.871079 0.087236
|
||||||
|
v 0.088003 0.871079 -0.088770
|
||||||
|
v -0.088003 0.871079 -0.088770
|
||||||
|
v -0.000000 0.999919 -0.000767
|
||||||
|
vn 0.0000 -1.0000 0.0000
|
||||||
|
vn 0.0000 0.0000 -1.0000
|
||||||
|
vn 0.0000 0.0000 1.0000
|
||||||
|
vn 1.0000 0.0000 0.0000
|
||||||
|
vn -1.0000 -0.0000 0.0000
|
||||||
|
vn 0.0000 0.5640 -0.8258
|
||||||
|
vn 0.0000 0.5640 0.8258
|
||||||
|
vn 0.8258 0.5640 0.0000
|
||||||
|
vn -0.8258 0.5640 0.0000
|
||||||
|
usemtl Green
|
||||||
|
s off
|
||||||
|
f 15//10 16//10 14//10
|
||||||
|
f 17//11 20//11 16//11
|
||||||
|
f 19//12 14//12 18//12
|
||||||
|
f 20//13 14//13 16//13
|
||||||
|
f 17//14 19//14 21//14
|
||||||
|
f 23//10 24//10 22//10
|
||||||
|
f 24//15 25//15 26//15
|
||||||
|
f 26//16 23//16 22//16
|
||||||
|
f 24//17 26//17 22//17
|
||||||
|
f 26//18 25//18 23//18
|
||||||
|
f 15//10 17//10 16//10
|
||||||
|
f 17//11 21//11 20//11
|
||||||
|
f 19//12 15//12 14//12
|
||||||
|
f 20//13 18//13 14//13
|
||||||
|
f 17//14 15//14 19//14
|
||||||
|
f 23//10 25//10 24//10
|
||||||
|
o DirZ_Cube.005
|
||||||
|
v -0.039002 -0.039002 0.000000
|
||||||
|
v -0.039002 0.039002 0.000000
|
||||||
|
v 0.039002 -0.039002 0.000000
|
||||||
|
v 0.039002 0.039002 0.000000
|
||||||
|
v -0.039002 -0.039002 0.874245
|
||||||
|
v -0.039002 0.039002 0.874245
|
||||||
|
v 0.039002 -0.039002 0.874245
|
||||||
|
v 0.039002 0.039002 0.874245
|
||||||
|
v -0.087236 -0.088003 0.871079
|
||||||
|
v -0.087236 0.088003 0.871079
|
||||||
|
v 0.088770 -0.088003 0.871079
|
||||||
|
v 0.088770 0.088003 0.871079
|
||||||
|
v 0.000767 0.000000 0.999919
|
||||||
|
vn 0.0000 0.0000 -1.0000
|
||||||
|
vn 1.0000 0.0000 0.0000
|
||||||
|
vn -1.0000 0.0000 -0.0000
|
||||||
|
vn 0.0000 -1.0000 0.0000
|
||||||
|
vn 0.0000 1.0000 0.0000
|
||||||
|
vn 0.8258 0.0000 0.5640
|
||||||
|
vn -0.8258 0.0000 0.5640
|
||||||
|
vn 0.0000 -0.8258 0.5640
|
||||||
|
vn 0.0000 0.8258 0.5640
|
||||||
|
usemtl Blue
|
||||||
|
s off
|
||||||
|
f 28//19 29//19 27//19
|
||||||
|
f 30//20 33//20 29//20
|
||||||
|
f 32//21 27//21 31//21
|
||||||
|
f 33//22 27//22 29//22
|
||||||
|
f 30//23 32//23 34//23
|
||||||
|
f 36//19 37//19 35//19
|
||||||
|
f 37//24 38//24 39//24
|
||||||
|
f 39//25 36//25 35//25
|
||||||
|
f 37//26 39//26 35//26
|
||||||
|
f 39//27 38//27 36//27
|
||||||
|
f 28//19 30//19 29//19
|
||||||
|
f 30//20 34//20 33//20
|
||||||
|
f 32//21 28//21 27//21
|
||||||
|
f 33//22 31//22 27//22
|
||||||
|
f 30//23 28//23 32//23
|
||||||
|
f 36//19 38//19 37//19
|
||||||
|
o center_Cube.006
|
||||||
|
v 0.062605 0.062605 -0.062605
|
||||||
|
v 0.062605 -0.062605 -0.062605
|
||||||
|
v 0.062605 0.062605 0.062605
|
||||||
|
v 0.062605 -0.062605 0.062605
|
||||||
|
v -0.062605 0.062605 -0.062605
|
||||||
|
v -0.062605 -0.062605 -0.062605
|
||||||
|
v -0.062605 0.062605 0.062605
|
||||||
|
v -0.062605 -0.062605 0.062605
|
||||||
|
vn 1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 0.0000 1.0000
|
||||||
|
vn -1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 0.0000 -1.0000
|
||||||
|
vn 0.0000 1.0000 0.0000
|
||||||
|
vn 0.0000 -1.0000 0.0000
|
||||||
|
usemtl center_color
|
||||||
|
s off
|
||||||
|
f 41//28 40//28 42//28
|
||||||
|
f 43//29 42//29 46//29
|
||||||
|
f 47//30 46//30 44//30
|
||||||
|
f 45//31 44//31 40//31
|
||||||
|
f 46//32 42//32 40//32
|
||||||
|
f 43//33 47//33 45//33
|
||||||
|
f 41//28 42//28 43//28
|
||||||
|
f 43//29 46//29 47//29
|
||||||
|
f 47//30 44//30 45//30
|
||||||
|
f 45//31 40//31 41//31
|
||||||
|
f 46//32 40//32 44//32
|
||||||
|
f 43//33 45//33 41//33
|
@ -11,12 +11,6 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
|
||||||
enum ParserState {
|
|
||||||
IDLE,
|
|
||||||
COMMENT,
|
|
||||||
READ_STR
|
|
||||||
};
|
|
||||||
|
|
||||||
struct MeshPoint {
|
struct MeshPoint {
|
||||||
glm::vec3 point;
|
glm::vec3 point;
|
||||||
glm::vec3 normal;
|
glm::vec3 normal;
|
||||||
@ -62,66 +56,16 @@ Mesh *MeshLoader::loadMesh(const std::string &filename) {
|
|||||||
|
|
||||||
std::ifstream file(filename + ".obj", std::ios::in);
|
std::ifstream file(filename + ".obj", std::ios::in);
|
||||||
|
|
||||||
ParserState state = IDLE;
|
int line_number = 1;
|
||||||
int line = 1;
|
|
||||||
|
|
||||||
char tmp_buff[128];
|
|
||||||
int tmp_buff_index = 0;
|
|
||||||
glm::vec3 color(0.5f, 0.0f, 1.0f); // дефолтный цвет
|
glm::vec3 color(0.5f, 0.0f, 1.0f); // дефолтный цвет
|
||||||
while (true) {
|
std::string source;
|
||||||
char in;
|
while (std::getline(file, source)) {
|
||||||
|
|
||||||
file.read(&in, 1);
|
|
||||||
|
|
||||||
if (file.eof()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tmp_buff_index >= 128) {
|
|
||||||
std::cerr << "[MeshLoader] Error: tmp buffer overflow"
|
|
||||||
" (line " << line << " file: " << filename << ")" << std::endl;
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in == '\n') {
|
|
||||||
line++;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (state) {
|
|
||||||
case IDLE:
|
|
||||||
tmp_buff[0] = in;
|
|
||||||
tmp_buff_index = 1;
|
|
||||||
|
|
||||||
// нет состояния, возможно после пустой строки
|
|
||||||
if (in == '#' || in == 'o' || in == 's') {
|
|
||||||
// коммент если это информация о имени объекта или о сглаживании
|
|
||||||
state = COMMENT;
|
|
||||||
} else if (in == 'v' || in == 'f' || in == 'u') {
|
|
||||||
state = READ_STR;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case COMMENT:
|
|
||||||
// строка коммента, читаем до конца линии
|
|
||||||
if (in == '\n') {
|
|
||||||
state = IDLE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case READ_STR:
|
|
||||||
if (in == '\n') {
|
|
||||||
state = IDLE;
|
|
||||||
// парсим строку
|
|
||||||
tmp_buff[tmp_buff_index] = 0; // делаем null-terminator
|
|
||||||
tmp_buff_index = 0;
|
|
||||||
std::string source(tmp_buff);
|
|
||||||
|
|
||||||
if (source.find("v ") == 0) {
|
if (source.find("v ") == 0) {
|
||||||
// вершина
|
// вершина
|
||||||
char* end = nullptr;
|
char* end = nullptr;
|
||||||
|
|
||||||
glm::vec3 tmp_point(0, 0, 0);
|
glm::vec3 tmp_point(0, 0, 0);
|
||||||
tmp_point.x = std::strtof(tmp_buff + 2, &end);
|
tmp_point.x = std::strtof(source.c_str() + 2, &end);
|
||||||
tmp_point.y = std::strtof(end, &end);
|
tmp_point.y = std::strtof(end, &end);
|
||||||
tmp_point.z = std::strtof(end, &end);
|
tmp_point.z = std::strtof(end, &end);
|
||||||
points.push_back(tmp_point);
|
points.push_back(tmp_point);
|
||||||
@ -130,13 +74,13 @@ Mesh *MeshLoader::loadMesh(const std::string &filename) {
|
|||||||
char* end = nullptr;
|
char* end = nullptr;
|
||||||
|
|
||||||
glm::vec3 tmp_point(0, 0, 0);
|
glm::vec3 tmp_point(0, 0, 0);
|
||||||
tmp_point.x = std::strtof(tmp_buff + 3, &end);
|
tmp_point.x = std::strtof(source.c_str() + 3, &end);
|
||||||
tmp_point.y = std::strtof(end, &end);
|
tmp_point.y = std::strtof(end, &end);
|
||||||
tmp_point.z = std::strtof(end, &end);
|
tmp_point.z = std::strtof(end, &end);
|
||||||
normals.push_back(tmp_point);
|
normals.push_back(tmp_point);
|
||||||
} else if (source.find("f ") == 0) {
|
} else if (source.find("f ") == 0) {
|
||||||
// фрагмент, он же треугольник
|
// фрагмент, он же треугольник
|
||||||
std::istringstream source_stream(tmp_buff + 2);
|
std::istringstream source_stream(source.c_str() + 2);
|
||||||
std::string point;
|
std::string point;
|
||||||
while (getline(source_stream, point, ' ')) {
|
while (getline(source_stream, point, ' ')) {
|
||||||
std::istringstream point_stream(point);
|
std::istringstream point_stream(point);
|
||||||
@ -174,11 +118,8 @@ Mesh *MeshLoader::loadMesh(const std::string &filename) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
tmp_buff[tmp_buff_index++] = in;
|
line_number++;
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// тут имеем готовый массив вершин
|
// тут имеем готовый массив вершин
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
#include "window/Events.h"
|
#include "window/Events.h"
|
||||||
#include "graphics/Mesh.h"
|
#include "graphics/Mesh.h"
|
||||||
#include "graphics/Shader.h"
|
#include "graphics/Shader.h"
|
||||||
#include "graphics/MeshLoader.h"
|
#include "render.h"
|
||||||
|
|
||||||
|
|
||||||
#define SPEED_FACTOR 2.5f
|
#define SPEED_FACTOR 2.5f
|
||||||
@ -78,32 +78,6 @@ static void updateCameraPosition(Camera& cam, float delta) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static Mesh* world;
|
|
||||||
static Mesh* model_mesh;
|
|
||||||
static Shader* shader;
|
|
||||||
static void drawWorld(Camera& cam) {
|
|
||||||
auto projview = cam.getProjection() * cam.getView();
|
|
||||||
shader->use();
|
|
||||||
|
|
||||||
// shader->uniformMatrix("pr", cam.getProjection() * cam.getView());
|
|
||||||
shader->uniformMatrix("projview", projview);
|
|
||||||
shader->uniformMatrix("model", glm::mat4(1.0f));
|
|
||||||
world->draw();
|
|
||||||
|
|
||||||
auto model_scale = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f, 0.5f, 0.5f));
|
|
||||||
|
|
||||||
static float angle = 0.0f;
|
|
||||||
|
|
||||||
auto model_translate = glm::translate(glm::mat4(1.0f), glm::vec3(0, 0, -3));
|
|
||||||
auto model_rotate = glm::rotate(glm::mat4(1.0f), angle, glm::vec3(0, 1, 0));
|
|
||||||
angle += 0.0002f;
|
|
||||||
|
|
||||||
shader->uniformMatrix("model", model_scale * model_translate * model_rotate);
|
|
||||||
// world->draw();
|
|
||||||
model_mesh->draw();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void mainloop(Camera& camera) {
|
void mainloop(Camera& camera) {
|
||||||
long frame = 0;
|
long frame = 0;
|
||||||
float lastTime = Window::getTime();
|
float lastTime = Window::getTime();
|
||||||
@ -129,51 +103,22 @@ void mainloop(Camera& camera) {
|
|||||||
|
|
||||||
updateCameraPosition(camera, delta);
|
updateCameraPosition(camera, delta);
|
||||||
|
|
||||||
drawWorld(camera);
|
renderScene(camera);
|
||||||
|
|
||||||
// worldRenderer.draw(world, camera, occlusion);
|
|
||||||
// hud.draw(level, assets);
|
|
||||||
// if (devdata) {
|
|
||||||
// hud.drawDebug(level, assets, fps, occlusion);
|
|
||||||
// }
|
|
||||||
|
|
||||||
Window::swapBuffers();
|
Window::swapBuffers();
|
||||||
Events::pullEvents();
|
Events::pullEvents();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadResources() {
|
|
||||||
const float buffer[] = {
|
|
||||||
// треугольник
|
|
||||||
// X Y Z nX nY nZ R G B
|
|
||||||
-1, -1, 0.5, 0, 0, 1, 0, 0, 1,
|
|
||||||
1, -1, 0.5, 0, 0, 1, 0, 0, 1,
|
|
||||||
0, 1, 0.5, 0, 0, 1, 0, 0, 1,
|
|
||||||
|
|
||||||
-1, -1, -0.5, 0, 0, -1, 0, 1, 1,
|
|
||||||
1, -1, -0.5, 0, 0, -1, 0, 1, 1,
|
|
||||||
0, 1, -0.5, 0, 0, -1, 0, 1, 1,
|
|
||||||
};
|
|
||||||
const int mesh_attrs[] {
|
|
||||||
3, 3, 3, 0
|
|
||||||
};
|
|
||||||
world = new Mesh(buffer, 6, mesh_attrs);
|
|
||||||
|
|
||||||
model_mesh = MeshLoader::loadMesh("res/cube");
|
|
||||||
|
|
||||||
shader = Shader::loadShader("res/main.vsh", "res/main.fsh");
|
|
||||||
}
|
|
||||||
|
|
||||||
void unloadResources() {
|
|
||||||
delete world;
|
|
||||||
delete shader;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
Window::initialize(800, 600, "Lab2");
|
Window::initialize(800, 600, "Lab2");
|
||||||
Events::initialize();
|
Events::initialize();
|
||||||
|
|
||||||
loadResources();
|
if (loadResources() != 0) {
|
||||||
|
std::cerr << "Failed to load resources" << std::endl;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
// glDisable(GL_DEPTH_TEST);
|
// glDisable(GL_DEPTH_TEST);
|
||||||
// glDisable(GL_CULL_FACE);
|
// glDisable(GL_CULL_FACE);
|
||||||
|
66
lab2/src/render.cpp
Normal file
66
lab2/src/render.cpp
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
//
|
||||||
|
// 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_snowman;
|
||||||
|
|
||||||
|
static Shader* shader;
|
||||||
|
|
||||||
|
|
||||||
|
static void drawSnowman() {
|
||||||
|
auto model_scale = glm::scale(glm::mat4(1.0f), glm::vec3(0.5f, 0.5f, 0.5f));
|
||||||
|
|
||||||
|
static float angle = 0.0f;
|
||||||
|
|
||||||
|
auto model_translate = glm::translate(glm::mat4(1.0f), glm::vec3(3, 2, 5));
|
||||||
|
auto model_rotate = glm::rotate(glm::mat4(1.0f), angle, glm::vec3(0, 1, 0));
|
||||||
|
angle += 0.0002f;
|
||||||
|
|
||||||
|
shader->uniformMatrix("model", model_scale * model_translate * model_rotate);
|
||||||
|
mesh_snowman->draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void renderScene(Camera& cam) {
|
||||||
|
auto projview = cam.getProjection() * cam.getView();
|
||||||
|
shader->use();
|
||||||
|
|
||||||
|
// shader->uniformMatrix("pr", cam.getProjection() * cam.getView());
|
||||||
|
shader->uniformMatrix("projview", projview);
|
||||||
|
shader->uniformMatrix("model", glm::mat4(1.0f));
|
||||||
|
mesh_xyz->draw();
|
||||||
|
|
||||||
|
drawSnowman();
|
||||||
|
}
|
||||||
|
|
||||||
|
int loadResources() {
|
||||||
|
mesh_xyz = MeshLoader::loadMesh("res/xyz");
|
||||||
|
if (mesh_xyz == nullptr) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
mesh_snowman = MeshLoader::loadMesh("res/snowman");
|
||||||
|
if (mesh_snowman == nullptr) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
shader = Shader::loadShader("res/main.vsh", "res/main.fsh");
|
||||||
|
if (shader == nullptr) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void unloadResources() {
|
||||||
|
delete mesh_xyz;
|
||||||
|
delete mesh_snowman;
|
||||||
|
delete shader;
|
||||||
|
}
|
15
lab2/src/render.h
Normal file
15
lab2/src/render.h
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
//
|
||||||
|
// Created by vlad on 23.03.23.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef GRAPHICS_LABS_RENDER_H
|
||||||
|
#define GRAPHICS_LABS_RENDER_H
|
||||||
|
|
||||||
|
#include "window/Camera.h"
|
||||||
|
|
||||||
|
int loadResources();
|
||||||
|
void unloadResources();
|
||||||
|
|
||||||
|
void renderScene(Camera& cam);
|
||||||
|
|
||||||
|
#endif //GRAPHICS_LABS_RENDER_H
|
Loading…
x
Reference in New Issue
Block a user