modified scene system
This commit is contained in:
@@ -20,8 +20,10 @@ namespace Components {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct Relationship {
|
struct Relationship {
|
||||||
entt::entity entity;
|
entt::entity parent {entt::null};
|
||||||
std::vector<entt::entity> children;
|
entt::entity first_child {entt::null};
|
||||||
|
entt::entity prev_sibling {entt::null};
|
||||||
|
entt::entity next_sibling {entt::null};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Drawable {
|
struct Drawable {
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ std::shared_ptr<Model> ModelManager::load_from_file(std::string_view _path, bool
|
|||||||
model->materials.push_back(std::make_shared<Material>(mat));
|
model->materials.push_back(std::make_shared<Material>(mat));
|
||||||
}
|
}
|
||||||
|
|
||||||
model->meshes.resize(scene->mNumMeshes);
|
|
||||||
for (unsigned int i = 0; i < scene->mNumMeshes; i++) {
|
for (unsigned int i = 0; i < scene->mNumMeshes; i++) {
|
||||||
aiMesh* aiMesh = scene->mMeshes[i];
|
aiMesh* aiMesh = scene->mMeshes[i];
|
||||||
Mesh mesh{};
|
Mesh mesh{};
|
||||||
@@ -80,22 +79,22 @@ std::shared_ptr<Model> ModelManager::load_from_file(std::string_view _path, bool
|
|||||||
return model;
|
return model;
|
||||||
}
|
}
|
||||||
|
|
||||||
void process_ai_node(aiNode* aiNode, const aiScene* scene, glm::mat4 transform, ModelNode* node)
|
void process_ai_node(aiNode* aiNode, const aiScene* scene, glm::mat4 transform, ModelNode& node)
|
||||||
{
|
{
|
||||||
const auto t = aiNode->mTransformation;
|
const auto t = aiNode->mTransformation;
|
||||||
transform = transform * glm::mat4(t.a1, t.a2, t.a3, t.a4, t.b1, t.b2, t.b3, t.b4, t.c1, t.c2, t.c3, t.c4, t.d1, t.d2, t.d3, t.d4);
|
transform = transform * glm::mat4(t.a1, t.a2, t.a3, t.a4, t.b1, t.b2, t.b3, t.b4, t.c1, t.c2, t.c3, t.c4, t.d1, t.d2, t.d3, t.d4);
|
||||||
|
|
||||||
node->transform = transform;
|
node.transform = transform;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < aiNode->mNumMeshes; i++) {
|
for (unsigned int i = 0; i < aiNode->mNumMeshes; i++) {
|
||||||
node->meshIndices.push_back(aiNode->mMeshes[i]);
|
node.meshIndices.push_back(aiNode->mMeshes[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned int i = 0; i < aiNode->mNumChildren; i++)
|
for (unsigned int i = 0; i < aiNode->mNumChildren; i++)
|
||||||
{
|
{
|
||||||
ModelNode newNode{};
|
ModelNode newNode{};
|
||||||
process_ai_node(aiNode->mChildren[i], scene, transform, newNode);
|
process_ai_node(aiNode->mChildren[i], scene, transform, newNode);
|
||||||
node->children.push_back(newNode);
|
node.children.push_back(newNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,61 @@
|
|||||||
|
|
||||||
#include "Scene.h"
|
#include "Scene.h"
|
||||||
|
|
||||||
entt::entity Scene::create_game_obejct() {
|
#include "Components.h"
|
||||||
|
|
||||||
|
Scene::Scene() {
|
||||||
|
root = _registry.create();
|
||||||
|
attach_component<Components::Transform>(root);
|
||||||
|
attach_component<Components::Relationship>(root);
|
||||||
|
}
|
||||||
|
|
||||||
|
entt::entity Scene::create_game_object() {
|
||||||
|
return create_game_object(root);
|
||||||
|
}
|
||||||
|
|
||||||
|
entt::entity Scene::create_game_object(entt::entity parent) {
|
||||||
const entt::entity entity = _registry.create();
|
const entt::entity entity = _registry.create();
|
||||||
|
attach_component<Components::Transform>(entity);
|
||||||
|
attach_component<Components::Relationship>(entity);
|
||||||
|
|
||||||
|
add_child(parent, entity);
|
||||||
|
|
||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T& Scene::attach_component(entt::entity e) {
|
||||||
|
return _registry.emplace<T>(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T &Scene::attach_component(entt::entity e, T data) {
|
||||||
|
return _registry.emplace<T>(e, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T& Scene::fetch_component(entt::entity e) {
|
||||||
|
return _registry.get<T>(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scene::add_child(entt::entity parent, entt::entity child) {
|
||||||
|
auto& parentRelationship = fetch_component<Components::Relationship>(parent);
|
||||||
|
|
||||||
|
if (parentRelationship.first_child == entt::null) {
|
||||||
|
parentRelationship.first_child = child;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
entt::entity lastSibling = parentRelationship.first_child;
|
||||||
|
auto& lastSiblingRelationship = fetch_component<Components::Relationship>(lastSibling);
|
||||||
|
while (lastSiblingRelationship.next_sibling != entt::null) {
|
||||||
|
lastSibling = lastSiblingRelationship.next_sibling;
|
||||||
|
lastSiblingRelationship = fetch_component<Components::Relationship>(lastSibling);
|
||||||
|
}
|
||||||
|
lastSiblingRelationship.next_sibling = child;
|
||||||
|
|
||||||
|
auto& childRelationship = fetch_component<Components::Relationship>(child);
|
||||||
|
childRelationship.prev_sibling = lastSibling;
|
||||||
|
childRelationship.next_sibling = entt::null;
|
||||||
|
childRelationship.parent = parent;
|
||||||
|
}
|
||||||
|
|||||||
23
src/Scene.h
23
src/Scene.h
@@ -7,14 +7,33 @@
|
|||||||
|
|
||||||
#include "entt/entt.hpp"
|
#include "entt/entt.hpp"
|
||||||
|
|
||||||
|
struct SceneObject {
|
||||||
|
entt::entity e;
|
||||||
|
std::vector<SceneObject*> children;
|
||||||
|
};
|
||||||
|
|
||||||
class Scene {
|
class Scene {
|
||||||
public:
|
public:
|
||||||
Scene() = default;
|
Scene();
|
||||||
~Scene() = default;
|
~Scene() = default;
|
||||||
|
|
||||||
entt::entity create_game_obejct();
|
entt::entity create_game_object();
|
||||||
|
entt::entity create_game_object(entt::entity parent);
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T& attach_component(entt::entity e);
|
||||||
|
template<typename T>
|
||||||
|
T& attach_component(entt::entity e, T data);
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
T& fetch_component(entt::entity e);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
entt::registry _registry{};
|
entt::registry _registry{};
|
||||||
|
entt::entity root;
|
||||||
|
|
||||||
|
void add_child(entt::entity parent, entt::entity child);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //B_ENGINE_SCENE_H
|
#endif //B_ENGINE_SCENE_H
|
||||||
@@ -250,20 +250,17 @@ void loop() {
|
|||||||
// draw the stuff
|
// draw the stuff
|
||||||
if (shader && activeModel) {
|
if (shader && activeModel) {
|
||||||
shader->bind();
|
shader->bind();
|
||||||
|
|
||||||
shader->setMat4("projection", gCamera.projection());
|
shader->setMat4("projection", gCamera.projection());
|
||||||
shader->setMat4("view", gCamera.view());
|
shader->setMat4("view", gCamera.view());
|
||||||
shader->setMat4("model", model);
|
shader->setMat4("model", model);
|
||||||
|
|
||||||
shader->setVec3("viewPosition", gCamera.position());
|
shader->setVec3("viewPosition", gCamera.position());
|
||||||
|
|
||||||
shader->setVec3("lightPosition", glm::vec3{-2.f, 0, 2.0f});
|
shader->setVec3("lightPosition", glm::vec3{-2.f, 0, 2.0f});
|
||||||
shader->setVec3("lightDirection", glm::vec3(1, -1, 1));
|
shader->setVec3("lightDirection", glm::vec3(1, -1, 1));
|
||||||
shader->setVec3("lightAmbient", glm::vec3(0.3f, 0.3f, 0.3f));
|
shader->setVec3("lightAmbient", glm::vec3(0.3f, 0.3f, 0.3f));
|
||||||
shader->setVec3("lightDiffuse", glm::vec3(0.5f, 0.5f, 0.5f));
|
shader->setVec3("lightDiffuse", glm::vec3(0.5f, 0.5f, 0.5f));
|
||||||
shader->setVec3("lightSpecular", glm::vec3(1.0f, 1.0f, 1.0f));
|
shader->setVec3("lightSpecular", glm::vec3(1.0f, 1.0f, 1.0f));
|
||||||
|
|
||||||
for (const auto& mesh: activeModel->meshes) {
|
/*for (const auto& mesh: activeModel->meshes) {
|
||||||
unsigned int materialId = 0;
|
unsigned int materialId = 0;
|
||||||
if (materialId >= activeModel->materials.size()) {
|
if (materialId >= activeModel->materials.size()) {
|
||||||
materialId = 0;
|
materialId = 0;
|
||||||
@@ -294,7 +291,7 @@ void loop() {
|
|||||||
|
|
||||||
glBindVertexArray(mesh.get()->vao);
|
glBindVertexArray(mesh.get()->vao);
|
||||||
glDrawElements(GL_TRIANGLES, mesh->numIndices, GL_UNSIGNED_INT, 0);
|
glDrawElements(GL_TRIANGLES, mesh->numIndices, GL_UNSIGNED_INT, 0);
|
||||||
}
|
}*/
|
||||||
|
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
ShaderProgram::unbind();
|
ShaderProgram::unbind();
|
||||||
|
|||||||
Reference in New Issue
Block a user