Initial Commit
This commit is contained in:
176
src/engine/world.cpp
Normal file
176
src/engine/world.cpp
Normal file
@@ -0,0 +1,176 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "core.h"
|
||||
#include "log.h"
|
||||
#include "ientity.h"
|
||||
#include "entitymanager.h"
|
||||
#include "world.h"
|
||||
#include "camera.h"
|
||||
|
||||
// World
|
||||
|
||||
World::World()
|
||||
{
|
||||
m_isUpdating = false;
|
||||
}
|
||||
|
||||
World::~World()
|
||||
{
|
||||
DestroyWorld();
|
||||
}
|
||||
|
||||
void World::DestroyWorld()
|
||||
{
|
||||
for (int i = 0; i < m_entities.size(); ++i)
|
||||
{
|
||||
delete m_entities[i];
|
||||
m_entities[i] = 0;
|
||||
}
|
||||
|
||||
m_entities.clear();
|
||||
}
|
||||
|
||||
void World::Update(float dt)
|
||||
{
|
||||
// Run destroyer
|
||||
UpdateDestroyList();
|
||||
|
||||
m_isUpdating = true;
|
||||
|
||||
// Update entities
|
||||
for (int i = 0; i < m_entities.size(); i++)
|
||||
{
|
||||
m_entities[i]->Update(dt);
|
||||
}
|
||||
|
||||
for (int i = 0; i < m_entities.size(); i++)
|
||||
{
|
||||
m_entities[i]->UpdateTransform();
|
||||
}
|
||||
|
||||
m_isUpdating = false;
|
||||
}
|
||||
|
||||
void World::Render()
|
||||
{
|
||||
Camera* camera = g_cameraManager.GetActiveCamera();
|
||||
if (!camera)
|
||||
return;
|
||||
|
||||
Frustum& frustum = camera->GetFrustum();
|
||||
|
||||
// Render entities
|
||||
for (int i = 0; i < m_entities.size(); i++)
|
||||
{
|
||||
if (frustum.CullBoundingBox(m_entities[i]->GetBoundingBox()))
|
||||
continue;
|
||||
|
||||
m_entities[i]->Render();
|
||||
}
|
||||
}
|
||||
|
||||
void World::UpdateDestroyList()
|
||||
{
|
||||
// Update deleting list
|
||||
if (!m_entitiesToDelete.empty())
|
||||
{
|
||||
for (int i = 0; i < m_entitiesToDelete.size(); i++)
|
||||
{
|
||||
DeleteEntity(FindEntityId(m_entitiesToDelete[i]));
|
||||
}
|
||||
|
||||
m_entitiesToDelete.clear();
|
||||
}
|
||||
}
|
||||
|
||||
void World::AddEntity(IEntityBase* pEntity)
|
||||
{
|
||||
m_entities.push_back(pEntity);
|
||||
}
|
||||
|
||||
IEntityBase* World::CreateEntity(const char* classname)
|
||||
{
|
||||
IEntityBase* entity = nullptr;
|
||||
|
||||
if (classname != nullptr)
|
||||
{
|
||||
// Get entity factory.
|
||||
entity = g_entityManager->CreateEntity(classname);
|
||||
}
|
||||
|
||||
if (entity == nullptr)
|
||||
{
|
||||
Core::Warning("World::CreateEntity: Can't create entity with unknown %s classname.", classname);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
m_entities.push_back(entity);
|
||||
|
||||
//entity->Spawn();
|
||||
|
||||
return entity;
|
||||
}
|
||||
|
||||
void World::DeleteEntity(int index)
|
||||
{
|
||||
if (m_isUpdating)
|
||||
{
|
||||
Msg("World::DeleteEntity: illegal call in world update!");
|
||||
SDL_assert_always(0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (0 > index || index >= GetNumEntities())
|
||||
{
|
||||
Msg("World::DeleteEntity: invalid entity index %d", index);
|
||||
SDL_assert_always(0);
|
||||
return;
|
||||
}
|
||||
|
||||
delete m_entities[index];
|
||||
m_entities.erase(m_entities.begin() + index);
|
||||
}
|
||||
|
||||
int World::GetNumEntities()
|
||||
{
|
||||
return (int)m_entities.size();
|
||||
}
|
||||
|
||||
IEntityBase* World::GetEntity(int index)
|
||||
{
|
||||
return m_entities[index];
|
||||
}
|
||||
|
||||
int World::FindEntityId(IEntityBase* pEntity)
|
||||
{
|
||||
for (int i = 0; i < GetNumEntities(); i++)
|
||||
{
|
||||
if (m_entities[i] == pEntity)
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
IEntityBase* World::FindEntityByClassName(const char* pClassname)
|
||||
{
|
||||
for (int i = 0; i < GetNumEntities(); i++)
|
||||
{
|
||||
if (strcmp(m_entities[i]->GetClassname(), pClassname) == 0)
|
||||
return m_entities[i];
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void World::MarkEntityToDelete(IEntityBase* pEntity)
|
||||
{
|
||||
m_entitiesToDelete.push_back(pEntity);
|
||||
}
|
||||
|
||||
void World::MarkEntityToDeleteId(int index)
|
||||
{
|
||||
MarkEntityToDelete(GetEntity(index));
|
||||
}
|
||||
|
||||
World* g_world = nullptr;
|
||||
Reference in New Issue
Block a user