ADD: Add Submodels
This commit is contained in:
parent
150fbca06c
commit
46110b333d
@ -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
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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() {
|
||||
|
||||
17
src/engine/renderer/model/SubModel.h
Normal file
17
src/engine/renderer/model/SubModel.h
Normal 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
|
||||
@ -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;}
|
||||
};
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user