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 indices = std::move(other.indices);
37 for (int i = 0; i < ATTRIB_COUNT; ++i) {
38 std::swap(handle[i], other.handle[i]);
53 void Model::Reserve(int v, int i) {
61 void Model::Update() {
62 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_VERTEX]);
63 glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), vertices.data(), GL_STATIC_DRAW);
66 if (colors.size() < vertices.size()) {
67 std::cerr << "Model: not enough colors!" << std::endl;
68 colors.resize(vertices.size(), { 1, 0, 1 });
71 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_COLOR]);
72 glBufferData(GL_ARRAY_BUFFER, colors.size() * sizeof(glm::vec3), colors.data(), GL_STATIC_DRAW);
75 if (normals.size() < vertices.size()) {
76 std::cerr << "Model: not enough normals!" << std::endl;
77 normals.resize(vertices.size(), { 0, 1, 0 });
80 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_NORMAL]);
81 glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(glm::vec3), normals.data(), GL_STATIC_DRAW);
83 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle[ATTRIB_INDEX]);
84 glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(Index), indices.data(), GL_STATIC_DRAW);
95 glEnableVertexAttribArray(ATTRIB_VERTEX);
96 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_VERTEX]);
97 glVertexAttribPointer(
98 ATTRIB_VERTEX, // location (for shader)
101 GL_FALSE, // normalized
106 glEnableVertexAttribArray(ATTRIB_COLOR);
107 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_COLOR]);
108 glVertexAttribPointer(
109 ATTRIB_COLOR, // location (for shader)
112 GL_FALSE, // normalized
117 glEnableVertexAttribArray(ATTRIB_NORMAL);
118 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_NORMAL]);
119 glVertexAttribPointer(
120 ATTRIB_NORMAL, // location (for shader)
123 GL_FALSE, // normalized
128 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle[ATTRIB_INDEX]);
131 indices.size(), // count
132 GL_UNSIGNED_INT, // type
136 glDisableVertexAttribArray(ATTRIB_NORMAL);
137 glDisableVertexAttribArray(ATTRIB_COLOR);
138 glDisableVertexAttribArray(ATTRIB_VERTEX);
142 OutlineModel::OutlineModel()
148 glGenBuffers(ATTRIB_COUNT, handle);
151 OutlineModel::~OutlineModel() {
152 glDeleteBuffers(ATTRIB_COUNT, handle);
156 void OutlineModel::Clear() {
163 void OutlineModel::Reserve(int v, int i) {
170 void OutlineModel::Update() {
171 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_VERTEX]);
172 glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(glm::vec3), vertices.data(), GL_STATIC_DRAW);
175 if (colors.size() < vertices.size()) {
176 std::cerr << "OutlineModel: not enough colors!" << std::endl;
177 colors.resize(vertices.size(), { 1, 0, 1 });
180 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_COLOR]);
181 glBufferData(GL_ARRAY_BUFFER, colors.size() * sizeof(glm::vec3), colors.data(), GL_STATIC_DRAW);
183 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle[ATTRIB_INDEX]);
184 glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(Index), indices.data(), GL_STATIC_DRAW);
190 void OutlineModel::Draw() {
195 glEnableVertexAttribArray(ATTRIB_VERTEX);
196 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_VERTEX]);
197 glVertexAttribPointer(
198 ATTRIB_VERTEX, // location (for shader)
201 GL_FALSE, // normalized
206 glEnableVertexAttribArray(ATTRIB_COLOR);
207 glBindBuffer(GL_ARRAY_BUFFER, handle[ATTRIB_COLOR]);
208 glVertexAttribPointer(
209 ATTRIB_COLOR, // location (for shader)
212 GL_FALSE, // normalized
217 glEnable(GL_LINE_SMOOTH);
220 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle[ATTRIB_INDEX]);
223 indices.size(), // count
224 GL_UNSIGNED_SHORT, // type
228 glDisableVertexAttribArray(ATTRIB_COLOR);
229 glDisableVertexAttribArray(ATTRIB_VERTEX);