14 glGenBuffers(ATTRIB_COUNT, handle);
18 glDeleteBuffers(ATTRIB_COUNT, handle);
21 Model::Model(Model &&other)
22 : vertices(std::move(other.vertices))
23 , colors(std::move(other.colors))
24 , normals(std::move(other.normals))
25 , dirty(other.dirty) {
26 for (int i = 0; i < ATTRIB_COUNT; ++i) {
27 handle[i] = other.handle[i];
32 Model &Model::operator =(Model &&other) {
33 vertices = std::move(other.vertices);
34 colors = std::move(other.colors);
35 normals = std::move(other.normals);
36 for (int i = 0; i < ATTRIB_COUNT; ++i) {
37 std::swap(handle[i], other.handle[i]);
51 void Model::Reserve(int s) {
58 void Model::Update() {
59 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_VERTEX]);
60 glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), vertices.data(), GL_STATIC_DRAW);
63 if (colors.size() < vertices.size()) {
64 std::cerr << "Model: not enough colors!" << std::endl;
65 colors.resize(vertices.size(), { 1, 0, 1 });
68 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_COLOR]);
69 glBufferData(GL_ARRAY_BUFFER, colors.size() * sizeof(glm::vec3), colors.data(), GL_STATIC_DRAW);
72 if (normals.size() < vertices.size()) {
73 std::cerr << "Model: not enough normals!" << std::endl;
74 normals.resize(vertices.size(), { 0, 1, 0 });
77 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_NORMAL]);
78 glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(glm::vec3), normals.data(), GL_STATIC_DRAW);
89 glEnableVertexAttribArray(ATTRIB_VERTEX);
90 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_VERTEX]);
91 glVertexAttribPointer(
92 ATTRIB_VERTEX, // location (for shader)
95 GL_FALSE, // normalized
100 glEnableVertexAttribArray(ATTRIB_COLOR);
101 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_COLOR]);
102 glVertexAttribPointer(
103 ATTRIB_COLOR, // location (for shader)
106 GL_FALSE, // normalized
111 glEnableVertexAttribArray(ATTRIB_NORMAL);
112 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_NORMAL]);
113 glVertexAttribPointer(
114 ATTRIB_NORMAL, // location (for shader)
117 GL_FALSE, // normalized
125 vertices.size() // len
128 glDisableVertexAttribArray(ATTRIB_NORMAL);
129 glDisableVertexAttribArray(ATTRIB_COLOR);
130 glDisableVertexAttribArray(ATTRIB_VERTEX);
134 OutlineModel::OutlineModel()
139 glGenBuffers(ATTRIB_COUNT, handle);
142 OutlineModel::~OutlineModel() {
143 glDeleteBuffers(ATTRIB_COUNT, handle);
147 void OutlineModel::Clear() {
153 void OutlineModel::Reserve(int s) {
159 void OutlineModel::Update() {
160 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_VERTEX]);
161 glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), vertices.data(), GL_STATIC_DRAW);
164 if (colors.size() < vertices.size()) {
165 std::cerr << "OutlineModel: not enough colors!" << std::endl;
166 colors.resize(vertices.size(), { 1, 0, 1 });
169 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_COLOR]);
170 glBufferData(GL_ARRAY_BUFFER, colors.size() * sizeof(glm::vec3), colors.data(), GL_STATIC_DRAW);
176 void OutlineModel::Draw() {
181 glEnableVertexAttribArray(ATTRIB_VERTEX);
182 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_VERTEX]);
183 glVertexAttribPointer(
184 ATTRIB_VERTEX, // location (for shader)
187 GL_FALSE, // normalized
192 glEnableVertexAttribArray(ATTRIB_COLOR);
193 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_COLOR]);
194 glVertexAttribPointer(
195 ATTRIB_COLOR, // location (for shader)
198 GL_FALSE, // normalized
208 vertices.size() // len
211 glDisableVertexAttribArray(ATTRIB_COLOR);
212 glDisableVertexAttribArray(ATTRIB_VERTEX);