update
This commit is contained in:
94
main.cpp
94
main.cpp
@@ -58,6 +58,15 @@ public:
|
||||
if (heatmapIbo_) {
|
||||
glDeleteBuffers(1, &heatmapIbo_);
|
||||
}
|
||||
if (skirtVao_) {
|
||||
glDeleteVertexArrays(1, &skirtVao_);
|
||||
}
|
||||
if (skirtVbo_) {
|
||||
glDeleteBuffers(1, &skirtVbo_);
|
||||
}
|
||||
if (skirtIbo_) {
|
||||
glDeleteBuffers(1, &skirtIbo_);
|
||||
}
|
||||
deinit_ = true;
|
||||
}
|
||||
|
||||
@@ -301,6 +310,80 @@ private:
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
|
||||
void initSkirtGeometry_() {
|
||||
if (skirtIbo_) {
|
||||
glDeleteBuffers(1, &skirtIbo_);
|
||||
skirtIbo_ = 0;
|
||||
}
|
||||
if (skirtVao_) {
|
||||
glDeleteVertexArrays(1, &skirtVao_);
|
||||
skirtVao_ = 0;
|
||||
}
|
||||
if (skirtVbo_) {
|
||||
glDeleteBuffers(1, &skirtVbo_);
|
||||
skirtVbo_ = 0;
|
||||
}
|
||||
|
||||
skirtUVs.clear();
|
||||
skirtNormals.clear();
|
||||
const int cols = std::max(2, heatmapcols_);
|
||||
const int rows = std::max(2, heatmaprows_);
|
||||
|
||||
auto push_border = [&](int c, int r, const glm::vec3& n) {
|
||||
const float u = (cols > 1) ? float(c) / float(cols - 1) : 0.0F;
|
||||
const float v = (rows > 1) ? float(r) / float(rows - 1) : 0.0F;
|
||||
skirtUVs.push_back(glm::vec2(u, v));
|
||||
skirtNormals.push_back(n);
|
||||
};
|
||||
|
||||
for (int c = 0; c < cols; ++c) {
|
||||
push_border(c, 0, glm::vec3(0.0F, -1.0F, 0.0F));
|
||||
}
|
||||
for (int r = 1; r < rows; ++r) {
|
||||
push_border(cols - 1, r, glm::vec3(1.0F, 0.0F, 0.0F));
|
||||
}
|
||||
for (int c = cols -1; c >= 0; --c) {
|
||||
push_border(c, rows - 1, glm::vec3(0.0F, 1.0F, 0.0F));
|
||||
}
|
||||
for (int r = rows - 2; r >= 1; --r) {
|
||||
push_border(0, r, glm::vec3(-1.0F, 0.0F, 0.0F));
|
||||
}
|
||||
|
||||
const int border_count = skirtUVs.size();
|
||||
// TODO: fill
|
||||
// std::vector<float> verts;
|
||||
// verts.assign(border_count * 2 * 8, 0.0F);
|
||||
skirtVertices.assign(border_count * 8 * 2, 0.0F);
|
||||
|
||||
std::vector<unsigned int> idx;
|
||||
idx.reserve(border_count * 6);
|
||||
for (int i = 0; i < border_count; ++i) {
|
||||
unsigned int next = (i + 1) % border_count;
|
||||
const unsigned int top0 = unsigned(i * 2);
|
||||
const unsigned int bot0 = unsigned(i * 2 + 1);
|
||||
const unsigned int top1 = unsigned(next * 2);
|
||||
const unsigned int bot1 = unsigned(next * 2 + 1);
|
||||
idx.push_back(top0);
|
||||
idx.push_back(top1);
|
||||
idx.push_back(bot1);
|
||||
|
||||
idx.push_back(top0);
|
||||
idx.push_back(bot0);
|
||||
idx.push_back(bot1);
|
||||
}
|
||||
skirtIndexCount_ = static_cast<int>(idx.size());
|
||||
|
||||
glGenVertexArrays(1, &skirtVao_);
|
||||
glBindVertexArray(skirtVao_);
|
||||
|
||||
glGenBuffers(1, &skirtVbo_);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, skirtVbo_);
|
||||
glBufferData(GL_ARRAY_BUFFER, skirtVertices.size() * sizeof(float), skirtVertices.data(), GL_STATIC_DRAW);
|
||||
|
||||
glGenBuffers(1, &skirtIbo_);
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, skirtIbo_);
|
||||
}
|
||||
|
||||
bool initBgProgram() {
|
||||
auto vshader = std::make_unique<LOpenGLShader>(LOpenGLShader::ShaderType::Vertex);
|
||||
auto fshader = std::make_unique<LOpenGLShader>(LOpenGLShader::ShaderType::Fragment);
|
||||
@@ -560,6 +643,17 @@ private:
|
||||
unsigned int heatmapIbo_ = 0;
|
||||
int heatmapIndexCount = 0;
|
||||
|
||||
std::unique_ptr<LOpenGLProgram> skirtProg_;
|
||||
std::string skirtVertShaderPath_;
|
||||
std::string skirtFragShaderPath_;
|
||||
unsigned int skirtVao_ = 0;
|
||||
unsigned int skirtVbo_ = 0;
|
||||
unsigned int skirtIbo_ = 0;
|
||||
std::vector<glm::vec2> skirtUVs;
|
||||
std::vector<glm::vec3> skirtNormals;
|
||||
int skirtIndexCount_ = 0;
|
||||
std::vector<float> skirtVertices;
|
||||
|
||||
ViewPort viewport_{800, 600};
|
||||
Camera camera_{glm::vec3(0.0F, 0.0F, 2.0F)};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user