#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()) { ent->Components.CreateComponent(); } std::shared_ptr drawable; std::string modelType = "servermodel"; auto resman = CEngine::GetInstance()->Components.GetComponentTyped(); if(CEngine::GetInstance()->Components.IsComponentPresent()) { auto resman = CEngine::GetInstance()->Components.GetComponentTyped(); auto _winman = CEngine::GetInstance()->Components.GetComponentTyped(); auto& _renderer = _winman->Renderer; if(_renderer) { drawable = animated ? _renderer->CreateAnimatedDrawable() : _renderer->CreateNonAnimatedDrawable(); modelType = _renderer->GetModelType(); } } if(!drawable) { drawable = std::make_shared(); //TODO animated and non animated variants } if(!ent->Components.IsComponentPresent()) { ent->Components.CreateComponent(false); } auto ent_drawable = ent->Components.GetComponentTyped(); Log::Instance() << "SetEntityDrawable mdl.string is " << mdl.string() << Log::Endl; auto _model = resman->GetOrCreate(modelType, mdl.string()); auto model = std::dynamic_pointer_cast(_model); auto mdl_drawable = std::dynamic_pointer_cast(drawable); mdl_drawable->SetModel(model); ent_drawable->Drawable = drawable; //ent_drawable->Init(); //shouldn't really init right here } void AddDrawableToSpace(std::shared_ptr drawable, int spaceid) { auto scenesMan = CEngine::GetInstance()->Components.GetComponentTyped(); 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 CreateAnimatedDrawable() { std::shared_ptr ret; if(CEngine::GetInstance()->Components.IsComponentPresent()) { auto resman = CEngine::GetInstance()->Components.GetComponentTyped(); auto _winman = CEngine::GetInstance()->Components.GetComponentTyped(); auto& _renderer = _winman->Renderer; if(_renderer) { ret = _renderer->CreateAnimatedDrawable(); } } if(!ret) { ret = std::make_shared(); } return ret; } std::shared_ptr CreateNonAnimatedDrawable() { std::shared_ptr ret; if(CEngine::GetInstance()->Components.IsComponentPresent()) { auto resman = CEngine::GetInstance()->Components.GetComponentTyped(); auto _winman = CEngine::GetInstance()->Components.GetComponentTyped(); auto& _renderer = _winman->Renderer; if(_renderer) { ret = _renderer->CreateNonAnimatedDrawable(); } } if(!ret) { ret = std::make_shared(); //TODO animated and non animated variants } return ret; } //TODO create linking class for space -> drawable or drawable -> space (maybe map?) std::vector GetDrawableSpaces(CDrawable* drawable) //TODO EXTREMELY NON PERFORMANT { std::vector ret; auto scenesMan = CEngine::GetInstance()->Components.GetComponentTyped(); 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("modelname"); auto spaceid_opt = ent->GetInitParam("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(); 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)> _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); } }