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/ModelState.h
|
||||||
src/engine/layer/entities/ModelStage.cpp
|
src/engine/layer/entities/ModelStage.cpp
|
||||||
src/engine/layer/entities/ModelStage.h
|
src/engine/layer/entities/ModelStage.h
|
||||||
|
src/engine/renderer/model/SubModel.h
|
||||||
)
|
)
|
||||||
|
|
||||||
target_compile_options(Dicewars_Siedler PRIVATE
|
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) {
|
void Renderer::renderEntities(const std::unordered_map<TexturedModel *, std::vector<std::unique_ptr<Entity>>>& entities) {
|
||||||
|
|
||||||
for (const auto& [texturedModel, batch] : entities) {
|
for (const auto& [texturedModel, batch] : entities) {
|
||||||
prepareTexturedModel(*texturedModel);
|
for (const auto& subModel : texturedModel->getSubModels()) {
|
||||||
|
prepareTexturedModel(subModel);
|
||||||
for (const auto& entity : batch) {
|
for (const auto& entity : batch) {
|
||||||
prepareInstance(*entity);
|
prepareInstance(*entity);
|
||||||
glDrawElements(GL_TRIANGLES, texturedModel->getRawModel()->vertexCount, GL_UNSIGNED_INT, 0);
|
glDrawElements(GL_TRIANGLES, subModel.rawModel->vertexCount, GL_UNSIGNED_INT, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
unbindTexturedModel();
|
unbindTexturedModel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Renderer::prepareTexturedModel(const TexturedModel &texturedModel) {
|
void Renderer::prepareTexturedModel(const SubModel &subModel) {
|
||||||
auto rawModel = texturedModel.getRawModel();
|
auto rawModel = subModel.rawModel;
|
||||||
glBindVertexArray(rawModel->vaoID);
|
glBindVertexArray(rawModel->vaoID);
|
||||||
glEnableVertexAttribArray(0);
|
glEnableVertexAttribArray(0);
|
||||||
glEnableVertexAttribArray(1);
|
glEnableVertexAttribArray(1);
|
||||||
glEnableVertexAttribArray(2);
|
glEnableVertexAttribArray(2);
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, texturedModel.getTexture()->getTextureID());
|
glBindTexture(GL_TEXTURE_2D, subModel.texture->getTextureID());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Renderer::unbindTexturedModel() {
|
void Renderer::unbindTexturedModel() {
|
||||||
|
|||||||
@ -28,7 +28,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
StaticShader staticShader;
|
StaticShader staticShader;
|
||||||
|
|
||||||
void prepareTexturedModel(const TexturedModel &texturedModel);
|
void prepareTexturedModel(const SubModel &texturedModel);
|
||||||
void unbindTexturedModel();
|
void unbindTexturedModel();
|
||||||
void prepareInstance(const Entity &entity);
|
void prepareInstance(const Entity &entity);
|
||||||
|
|
||||||
|
|||||||
@ -18,7 +18,7 @@ void TerrainRenderer::renderTerrainTiles(const std::unordered_map<TexturedModel
|
|||||||
prepareTexturedModel(*texturedModel);
|
prepareTexturedModel(*texturedModel);
|
||||||
for (const auto& hexTile : batch) {
|
for (const auto& hexTile : batch) {
|
||||||
prepareInstance(*hexTile);
|
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();
|
unbindTexturedModel();
|
||||||
}
|
}
|
||||||
@ -30,14 +30,14 @@ void TerrainRenderer::finalizeFrame() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TerrainRenderer::prepareTexturedModel(const TexturedModel &texturedModel) {
|
void TerrainRenderer::prepareTexturedModel(const TexturedModel &texturedModel) {
|
||||||
auto rawModel = texturedModel.getRawModel();
|
auto rawModel = texturedModel.getSubModels().front().rawModel;
|
||||||
glBindVertexArray(rawModel->vaoID);
|
glBindVertexArray(rawModel->vaoID);
|
||||||
glEnableVertexAttribArray(0);
|
glEnableVertexAttribArray(0);
|
||||||
glEnableVertexAttribArray(1);
|
glEnableVertexAttribArray(1);
|
||||||
glEnableVertexAttribArray(2);
|
glEnableVertexAttribArray(2);
|
||||||
|
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
glBindTexture(GL_TEXTURE_2D, texturedModel.getTexture()->getTextureID());
|
glBindTexture(GL_TEXTURE_2D, texturedModel.getSubModels().front().texture->getTextureID());
|
||||||
}
|
}
|
||||||
|
|
||||||
void TerrainRenderer::unbindTexturedModel() {
|
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
|
#define TEXTUREDMODEL_H
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "RawModel.h"
|
#include "RawModel.h"
|
||||||
|
#include "SubModel.h"
|
||||||
#include "../textures/ModelTexture.h"
|
#include "../textures/ModelTexture.h"
|
||||||
|
|
||||||
|
|
||||||
class TexturedModel {
|
class TexturedModel {
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<RawModel> rawModel;
|
std::vector<SubModel> subModels;
|
||||||
std::shared_ptr<ModelTexture> texture;
|
|
||||||
|
|
||||||
public:
|
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::vector<SubModel> &getSubModels() const {return subModels;}
|
||||||
[[nodiscard]] const std::shared_ptr<ModelTexture> getTexture() const {return texture;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user