This commit is contained in:
lennlouisgeek
2026-03-02 22:50:17 +08:00
parent c59c921997
commit 348e4130a3
4 changed files with 144 additions and 5 deletions

View File

@@ -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)};