#include "CTestRender.h" #include "CEngine.h" #include "CResourcesManager.h" #include "CWindowManager.h" #include "CGL430Model.h" #include "COpenGL430Renderer.h" #include "CCommandProcessor.h" #include "U_Scripting.h" #include "CConVarManager.h" #include "U_Numbers.h" #include "glm/glm.hpp" #include "glm/gtc/quaternion.hpp" bool CTestRender::V_Init() { auto resman = CEngine::GetInstance()->Components.GetComponentTyped(); auto winman = CEngine::GetInstance()->Components.GetComponentTyped(); auto& renderer = winman->Renderer; Model = resman->GetOrCreate(renderer->GetModelType(), "tankroad_terrain.emdl"); return true; } void CTestRender::Draw() { float WindowAspect = 1.0f; COMPONENT_CALL_GET(WindowAspect, CWindowManager, GetWindowAspect()); glm::mat4 view = glm::lookAt(CameraTransform.GetPosition(), CameraTransform.GetPosition() + CameraTransform.GetForwardVector(), CameraTransform.GetUpVector()); glm::mat4 proj = glm::perspective(glm::radians(CameraFOV), WindowAspect, 0.01f, 10000.0f); glm::mat4 modl = ModelTransform.GetModelMatrix(); //glm::mat4 modl = glm::mat4(1.0f); //glm::mat4 view = glm::lookAt(glm::vec3(0, 0, 3), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0)); //glm::mat4 proj = glm::perspective(glm::radians(60.0f), WindowAspect, 0.1f, 100.0f); auto winman = CEngine::GetInstance()->Components.GetComponentTyped(); auto _renderer = winman->Renderer.get(); auto renderer = dynamic_cast(_renderer); //renderer->S_Default.Bind(); renderer->S_Default.setUniform("model", modl); renderer->S_Default.setUniform("view", view); renderer->S_Default.setUniform("proj", proj); auto mdl = std::dynamic_pointer_cast(Model); mdl->V_Draw(); } bool CTestRender::V_ScriptInit(std::shared_ptr state, sol::table table) { auto fieldsMan = CScriptFieldsManager::ValidateFieldsManager(table, true).first; sol::table camera = CameraTransform.GetScriptTable(state); sol::table model = ModelTransform.GetScriptTable(state); table["camera"] = camera; table["model"] = model; auto scFov = std::make_unique>(CameraFOV); fieldsMan->AddField("fov", std::move(scFov)); sol::table keys = table.create_named("key"); { auto keys_man = CScriptFieldsManager::CreateFieldsManager(keys); auto scForward = std::make_unique>(Forward, true); auto scBack = std::make_unique>(Back, true); auto scLeft = std::make_unique>(Left, true); auto scRight = std::make_unique>(Right, true); auto scShift = std::make_unique>(Shift, true); auto scCtrl = std::make_unique>(Ctrl, true); keys_man->AddField("forward", std::move(scForward)); keys_man->AddField("back", std::move(scBack)); keys_man->AddField("left", std::move(scLeft)); keys_man->AddField("right", std::move(scRight)); keys_man->AddField("shift", std::move(scShift)); keys_man->AddField("ctrl", std::move(scCtrl)); keys_man->CreateMetaTable(keys); } auto SetTransformFuncs = [](sol::table tabl, CTransform& trans) -> void { sol::state_view st = tabl.lua_state(); tabl.set_function("setPosition", [&trans](sol::object vec) { trans.SetPosition(ScriptUtils::FromObject(vec)); }); tabl.set_function("setRotation", [&trans](sol::object quat) { trans.SetRotation(ScriptUtils::FromObject(quat)); }); tabl.set_function("setScale", [&trans](sol::object scl) { trans.SetScale(ScriptUtils::FromObject(scl)); }); tabl.set_function("getPosition", [&trans, st]() -> sol::object { return ScriptUtils::ToObject(trans.GetPosition(), st); }); tabl.set_function("getRotation", [&trans, st]() -> sol::object { return ScriptUtils::ToObject(trans.GetRotation(), st); }); tabl.set_function("getRotationEuler", [&trans, st]() -> sol::object { glm::quat rot = trans.GetRotation(); glm::vec3 euler = glm::eulerAngles(rot); return ScriptUtils::ToObject(euler, st); }); tabl.set_function("getRotationEulerDegrees", [&trans, st]() -> sol::object { glm::quat rot = trans.GetRotation(); glm::vec3 eulerDegrees = glm::eulerAngles(rot); eulerDegrees.x = glm::degrees(eulerDegrees.x); eulerDegrees.y = glm::degrees(eulerDegrees.y); eulerDegrees.z = glm::degrees(eulerDegrees.z); return ScriptUtils::ToObject(eulerDegrees, st); }); tabl.set_function("getScale", [&trans, st]() -> sol::object { return ScriptUtils::ToObject(trans.GetScale(), st); }); }; return true; } void CTestRender::V_Update() { auto global_start_point = CEngine::GetInstance()->Time.GetCurrent(); auto resman = CEngine::GetInstance()->Components.GetComponentTyped(); auto winman = CEngine::GetInstance()->Components.GetComponentTyped(); float sensitivity = 0.005f; float speed = 1.0f; auto start_point = std::chrono::high_resolution_clock::now(); COMPONENT_CALL_GET(sensitivity, CConVarManager, GetConVarValue("cam.sensitivity")); auto end_point = std::chrono::high_resolution_clock::now(); if((end_point - start_point) >= std::chrono::duration(0.1f)) { Log::ErrInstance() << "sensitivity cvar took " << std::chrono::duration_cast>(end_point - start_point) << Log::Endl; } start_point = std::chrono::high_resolution_clock::now(); COMPONENT_CALL_GET(speed, CConVarManager, GetConVarValue("cam.speed")); end_point = std::chrono::high_resolution_clock::now(); if((end_point - start_point) >= std::chrono::duration(0.1f)) { Log::ErrInstance() << "speed cvar took " << std::chrono::duration_cast>(end_point - start_point) << Log::Endl; } float dx, dy; start_point = std::chrono::high_resolution_clock::now(); SDL_GetRelativeMouseState(&dx, &dy); end_point = std::chrono::high_resolution_clock::now(); if((end_point - start_point) >= std::chrono::duration(0.1f)) { Log::ErrInstance() << "SDL_GetRelativeMouseState took " << std::chrono::duration_cast>(end_point - start_point) << Log::Endl; } float deltaYaw = dx * sensitivity; float deltaPitch = dy * sensitivity; CameraAngles.y -= CAngle::radians(deltaYaw); CameraAngles.x -= CAngle::radians(deltaPitch); CameraAngles.x.clamp180deg(-89.0f, 89.0f); glm::quat qPitch = glm::angleAxis(CameraAngles.x.asRadians(), glm::vec3(1, 0, 0)); glm::quat qYaw = glm::angleAxis(CameraAngles.y.asRadians(), glm::vec3(0, 1, 0)); glm::quat orientation = glm::normalize(qYaw * qPitch); CameraTransform.SetRotation(glm::normalize(orientation)); start_point = std::chrono::high_resolution_clock::now(); SDL_PumpEvents(); end_point = std::chrono::high_resolution_clock::now(); if((end_point - start_point) >= std::chrono::duration(0.1f)) { Log::ErrInstance() << "SDL_PumpEvents took " << std::chrono::duration_cast>(end_point - start_point) << Log::Endl; } start_point = std::chrono::high_resolution_clock::now(); const bool* keyboard = SDL_GetKeyboardState(NULL); end_point = std::chrono::high_resolution_clock::now(); if((end_point - start_point) >= std::chrono::duration(0.1f)) { Log::ErrInstance() << "SDL_GetKeyboardState took " << std::chrono::duration_cast>(end_point - start_point) << Log::Endl; } Forward = keyboard[SDL_SCANCODE_W ]; Back = keyboard[SDL_SCANCODE_S ]; Left = keyboard[SDL_SCANCODE_A ]; Right = keyboard[SDL_SCANCODE_D ]; Shift = keyboard[SDL_SCANCODE_LSHIFT]; Ctrl = keyboard[SDL_SCANCODE_LCTRL ]; auto euler_repr = CameraTransform.GetEulerRotation().GetRotation(); if(dx != 0.0f || dy != 0.0f) { //Log::Instance() << "Delta mouse: " << dx << ", " << dy << "; Angles: " << euler_repr.x.asDegrees() << ", " << euler_repr.y.asDegrees() << ", " << euler_repr.z.asDegrees() << Log::Endl; } auto global_end_point = CEngine::GetInstance()->Time.GetCurrent(); auto update_diff = std::chrono::duration_cast>(global_end_point - global_start_point); if(update_diff.count() >= 0.1f) { Log::ErrInstance() << "global testrender update took " << update_diff.count() << Log::Endl; } } LINK_COMPONENT_TO_CLASS(CTestRender, testrender)