ADD: Add Submodels

This commit is contained in:
sebastian 2026-02-13 22:01:42 +01:00
parent 150fbca06c
commit 46110b333d
6 changed files with 41 additions and 18 deletions

View File

@ -175,6 +175,7 @@ add_executable(Dicewars_Siedler src/main.cpp
src/engine/layer/entities/ModelState.h
src/engine/layer/entities/ModelStage.cpp
src/engine/layer/entities/ModelStage.h
src/engine/renderer/model/SubModel.h
)
target_compile_options(Dicewars_Siedler PRIVATE

View File

@ -26,25 +26,27 @@ void Renderer::prepare(const Camera& camera, const Light& light) {
void Renderer::renderEntities(const std::unordered_map<TexturedModel *, std::vector<std::unique_ptr<Entity>>>& entities) {
for (const auto& [texturedModel, batch] : entities) {
prepareTexturedModel(*texturedModel);
for (const auto& entity : batch) {
prepareInstance(*entity);
glDrawElements(GL_TRIANGLES, texturedModel->getRawModel()->vertexCount, GL_UNSIGNED_INT, 0);
}
for (const auto& subModel : texturedModel->getSubModels()) {
prepareTexturedModel(subModel);
for (const auto& entity : batch) {
prepareInstance(*entity);
glDrawElements(GL_TRIANGLES, subModel.rawModel->vertexCount, GL_UNSIGNED_INT, 0);
}
unbindTexturedModel();
unbindTexturedModel();
}
}
}
void Renderer::prepareTexturedModel(const TexturedModel &texturedModel) {
auto rawModel = texturedModel.getRawModel();
void Renderer::prepareTexturedModel(const SubModel &subModel) {
auto rawModel = subModel.rawModel;
glBindVertexArray(rawModel->vaoID);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texturedModel.getTexture()->getTextureID());
glBindTexture(GL_TEXTURE_2D, subModel.texture->getTextureID());
}
void Renderer::unbindTexturedModel() {

View File

@ -28,7 +28,7 @@ public:
private:
StaticShader staticShader;
void prepareTexturedModel(const TexturedModel &texturedModel);
void prepareTexturedModel(const SubModel &texturedModel);
void unbindTexturedModel();
void prepareInstance(const Entity &entity);

View File

@ -18,7 +18,7 @@ void TerrainRenderer::renderTerrainTiles(const std::unordered_map<TexturedModel
prepareTexturedModel(*texturedModel);
for (const auto& hexTile : batch) {
prepareInstance(*hexTile);
glDrawElements(GL_TRIANGLES, texturedModel->getRawModel()->vertexCount, GL_UNSIGNED_INT, 0);
glDrawElements(GL_TRIANGLES, texturedModel->getSubModels().front().rawModel->vertexCount, GL_UNSIGNED_INT, 0);
}
unbindTexturedModel();
}
@ -30,14 +30,14 @@ void TerrainRenderer::finalizeFrame() {
}
void TerrainRenderer::prepareTexturedModel(const TexturedModel &texturedModel) {
auto rawModel = texturedModel.getRawModel();
auto rawModel = texturedModel.getSubModels().front().rawModel;
glBindVertexArray(rawModel->vaoID);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texturedModel.getTexture()->getTextureID());
glBindTexture(GL_TEXTURE_2D, texturedModel.getSubModels().front().texture->getTextureID());
}
void TerrainRenderer::unbindTexturedModel() {

View File

@ -0,0 +1,17 @@
//
// Created by sebastian on 13.02.26.
//
#ifndef DICEWARS_SIEDLER_SUBMODEL_H
#define DICEWARS_SIEDLER_SUBMODEL_H
#include <memory>
#include "RawModel.h"
#include "../textures/ModelTexture.h"
struct SubModel {
std::shared_ptr<RawModel> rawModel;
std::shared_ptr<ModelTexture> texture;
};
#endif //DICEWARS_SIEDLER_SUBMODEL_H

View File

@ -6,21 +6,24 @@
#define TEXTUREDMODEL_H
#include <memory>
#include <utility>
#include <vector>
#include "RawModel.h"
#include "SubModel.h"
#include "../textures/ModelTexture.h"
class TexturedModel {
private:
std::shared_ptr<RawModel> rawModel;
std::shared_ptr<ModelTexture> texture;
std::vector<SubModel> subModels;
public:
TexturedModel(std::shared_ptr<RawModel> rawModel, std::shared_ptr<ModelTexture> texture) : rawModel(std::move(rawModel)), texture(std::move(texture)) {};
TexturedModel(std::shared_ptr<RawModel> rawModel, std::shared_ptr<ModelTexture> texture) {
subModels.emplace_back(rawModel, texture);
};
TexturedModel(std::vector<SubModel> subModels) : subModels(std::move(subModels)) {};
[[nodiscard]] const std::shared_ptr<RawModel> getRawModel() const {return rawModel;}
[[nodiscard]] const std::shared_ptr<ModelTexture> getTexture() const {return texture;}
[[nodiscard]] const std::vector<SubModel> &getSubModels() const {return subModels;}
};