← Back to file list Raw

src/U_ShortAPI.cpp

#include "U_ShortAPI.h"
#include "CEntity.h"
#include "CTransformable.h"
#include "CEngine.h"
#include "CWindowManager.h"
#include "CDrawableEntity.h"
#include "CResourcesManager.h"
#include "CDrawableModel.h"
#include "CScenesManager.h"
#include "CServerDrawable.h"
void SetEntityDrawable(CEntity* ent, const std::filesystem::path& mdl, bool animated)
{
if(!ent->Components.IsComponentPresent<CTransformable>())
{
ent->Components.CreateComponent<CTransformable>();
}
std::shared_ptr<CDrawable> drawable;
std::string modelType = "servermodel";
auto resman = CEngine::GetInstance()->Components.GetComponentTyped<CResourcesManager>();
if(CEngine::GetInstance()->Components.IsComponentPresent<CWindowManager>())
{
auto resman = CEngine::GetInstance()->Components.GetComponentTyped<CResourcesManager>();
auto _winman = CEngine::GetInstance()->Components.GetComponentTyped<CWindowManager>();
auto& _renderer = _winman->Renderer;
if(_renderer)
{
drawable = animated ? _renderer->CreateAnimatedDrawable() : _renderer->CreateNonAnimatedDrawable();
modelType = _renderer->GetModelType();
}
}
if(!drawable)
{
drawable = std::make_shared<CServerDrawable>(); //TODO animated and non animated variants
}
if(!ent->Components.IsComponentPresent<CDrawableEntity>())
{
ent->Components.CreateComponent<CDrawableEntity>(false);
}
auto ent_drawable = ent->Components.GetComponentTyped<CDrawableEntity>();
Log::Instance() << "SetEntityDrawable mdl.string is " << mdl.string() << Log::Endl;
auto _model = resman->GetOrCreate(modelType, mdl.string());
auto model = std::dynamic_pointer_cast<CModelBase>(_model);
auto mdl_drawable = std::dynamic_pointer_cast<CDrawableModel>(drawable);
mdl_drawable->SetModel(model);
ent_drawable->Drawable = drawable;
//ent_drawable->Init(); //shouldn't really init right here
}
void AddDrawableToSpace(std::shared_ptr<CDrawable> drawable, int spaceid)
{
auto scenesMan = CEngine::GetInstance()->Components.GetComponentTyped<CScenesManager>();
if(scenesMan)
{
auto _mainScene = scenesMan->ActiveScene;
if(_mainScene.lock())
{
auto mainScene = _mainScene.lock();
if(spaceid >= 0 && spaceid < mainScene->SpacesManager.Spaces.size())
{
auto space = mainScene->SpacesManager.Spaces.at(spaceid).get();
space->AddDrawable(drawable);
}
}
}
}
std::shared_ptr<CDrawable> CreateAnimatedDrawable()
{
std::shared_ptr<CDrawable> ret;
if(CEngine::GetInstance()->Components.IsComponentPresent<CWindowManager>())
{
auto resman = CEngine::GetInstance()->Components.GetComponentTyped<CResourcesManager>();
auto _winman = CEngine::GetInstance()->Components.GetComponentTyped<CWindowManager>();
auto& _renderer = _winman->Renderer;
if(_renderer)
{
ret = _renderer->CreateAnimatedDrawable();
}
}
if(!ret)
{
ret = std::make_shared<CServerDrawable>();
}
return ret;
}
std::shared_ptr<CDrawable> CreateNonAnimatedDrawable()
{
std::shared_ptr<CDrawable> ret;
if(CEngine::GetInstance()->Components.IsComponentPresent<CWindowManager>())
{
auto resman = CEngine::GetInstance()->Components.GetComponentTyped<CResourcesManager>();
auto _winman = CEngine::GetInstance()->Components.GetComponentTyped<CWindowManager>();
auto& _renderer = _winman->Renderer;
if(_renderer)
{
ret = _renderer->CreateNonAnimatedDrawable();
}
}
if(!ret)
{
ret = std::make_shared<CServerDrawable>(); //TODO animated and non animated variants
}
return ret;
}
//TODO create linking class for space -> drawable or drawable -> space (maybe map?)
std::vector<size_t> GetDrawableSpaces(CDrawable* drawable) //TODO EXTREMELY NON PERFORMANT
{
std::vector<size_t> ret;
auto scenesMan = CEngine::GetInstance()->Components.GetComponentTyped<CScenesManager>();
if(scenesMan)
{
for(auto& scene : scenesMan->Scenes)
{
for(size_t i = 0; i < scene->SpacesManager.Spaces.size(); i++)
{
auto& space = scene->SpacesManager.Spaces[i];
for(auto& _dr : space->Drawables)
{
if(_dr.get() == drawable)
{
ret.push_back(i);
break;
}
}
}
}
}
return ret;
}
void SetEntityModel(CEntity* ent, const std::string& modelname, int spaceid) //TODO automatically decide space
{
auto mdlname_opt = ent->GetInitParam<std::string>("modelname");
auto spaceid_opt = ent->GetInitParam<int>("spaceid");
if(!modelname.empty())
{
SetEntityDrawable(ent, modelname);
}
else if(mdlname_opt.has_value())
{
auto val = mdlname_opt.value();
SetEntityDrawable(ent, val);
}
auto drawable = ent->Components.GetComponentTyped<CDrawableEntity>();
if(drawable && drawable->Drawable)
{
if(spaceid > -1)
{
AddDrawableToSpace(drawable->Drawable, spaceid);
}
else if(spaceid_opt.has_value())
{
auto spaceIndex = spaceid_opt.value();
AddDrawableToSpace(drawable->Drawable, spaceIndex);
}
drawable->Init();
}
}
void SetFieldsManager(sol::table _table, std::function<void(std::shared_ptr<CScriptFieldsManager>)> _fields_setter)
{
auto fieldsMan_pair = CScriptFieldsManager::ValidateFieldsManager(_table);
auto fieldsMan = fieldsMan_pair.first;
if(_fields_setter)
{
_fields_setter(fieldsMan);
}
fieldsMan->FieldCreationAbility = true;
if(!fieldsMan_pair.second) { fieldsMan->CreateMetaTable(_table); }
}