-
Notifications
You must be signed in to change notification settings - Fork 0
/
Fence.hpp
125 lines (66 loc) · 1.87 KB
/
Fence.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#pragma once
#pragma once
class Fence : public Primitive
{
double height;
public:
/// <summary> 柵を傾けます </summary>
void tilt(const Matrix &mat)
{
auto w2 = Vec3(0, height, 0).transform(mat);
w2.y -= height;
for (const auto i : Rep(5))
{
vertices[i * 2 + 1].pos = VAdd(vertices[i * 2 + 1].pos, (VECTOR)w2);
}
}
/// <summary> 上面の板を生成します </summary>
Plane fillTop()
{
return Plane(vertices[1].pos, vertices[7].pos, vertices[3].pos, vertices[5].pos);
}
/// <summary> 下面の板を生成します </summary>
Plane fillBottom()
{
return Plane(vertices[0].pos, vertices[6].pos, vertices[2].pos, vertices[4].pos);
}
Fence(const Size<double> &size, const double height)
{
*this = Fence(Vec3(0), size, height);
}
Fence(const Vec3 &pos, const Size<double> &size, const double height) : height(height)
{
double w = size.width / 2, h = size.height / 2;
std::vector<Vec3> list = { Vec3(w, 0, -h),Vec3(-w, 0, -h), Vec3(-w, 0, h), Vec3(w, 0, h) };
double c = 0;
for (auto &_pos : list)
{
VERTEX3D vertex;
vertex.pos = pos + _pos;
vertex.dif = Color(1);
vertex.spc = Color(0);
vertex.u = static_cast<double>(c), vertex.v = 1;
vertices.emplace_back(vertex);
vertex.pos += (VECTOR)Vec3(0, height, 0);
vertex.u = static_cast<double>(c), vertex.v = 0;
vertices.emplace_back(vertex);
c += 1.0 / 4.0;
}
auto v1 = *(vertices.begin() + 0);
auto v2 = *(vertices.begin() + 1);
v1.u = v2.u = c;
vertices.emplace_back(v1);
vertices.emplace_back(v2);
/*
for (const auto i : Rep(vertices.size() / 2 - 1))
{
auto vertex = vertices[i * 4 + 2];
vertex.u = 0, vertex.v = 1;
vertices.insert(vertices.begin() + (i * 4 + 2 + 0), vertex);
vertex = vertices[i * 4 + 2 + 1];
vertex.u = 0, vertex.v = 0;
vertices.insert(vertices.begin() + (i * 4 + 2 + 1), vertex);
}
*/
}
};