#pragma once #include "wren.h" #include #include #include "ScriptModule.h" #include #include #include "Engine.h" #include "../Scene/Entities/Entity.h" #include #include #include #include #include #include #include #include #include namespace Nuake { namespace ScriptAPI { class SceneModule : public ScriptModule { std::string GetModuleName() override { return "Scene"; } void RegisterModule(WrenVM* vm) override { RegisterMethod("GetEntityID(_)", (void*)GetEntity); RegisterMethod("EntityHasComponent(_,_)", (void*)EntityHasComponent); RegisterMethod("GetTranslation_(_)", (void*)GetTranslation); RegisterMethod("SetTranslation_(_,_,_,_)", (void*)SetTranslation); RegisterMethod("GetRotation_(_)", (void*)GetRotation); RegisterMethod("SetRotation_(_,_,_,_)", (void*)SetRotation); RegisterMethod("SetLightIntensity_(_,_)", (void*)SetLightIntensity); RegisterMethod("GetLightIntensity_(_)", (void*)GetLightIntensity); RegisterMethod("GetScript_(_)", (void*)GetScript); RegisterMethod("SetCameraDirection_(_,_,_,_)", (void*)SetCameraDirection); RegisterMethod("GetCameraDirection_(_)", (void*)GetCameraDirection); RegisterMethod("GetCameraRight_(_)", (void*)GetCameraRight); RegisterMethod("MoveAndSlide_(_,_,_,_)", (void*)MoveAndSlide); RegisterMethod("IsCharacterControllerOnGround_(_)", (void*)IsCharacterControllerOnGround); RegisterMethod("TriggerGetOverlappingBodyCount_(_)", (void*)TriggerGetOverlappingBodyCount); RegisterMethod("TriggerGetOverlappingBodies_(_)", (void*)TriggerGetOverlappingBodies); RegisterMethod("BrushGetTargets_(_)", (void*)BrushGetTargets); RegisterMethod("BrushGetTargetsCount_(_)", (void*)BrushGetTargetsCount); } static void GetEntity(WrenVM* vm) { std::string name = wrenGetSlotString(vm, 1); int handle = Engine::GetCurrentScene()->GetEntity(name).GetHandle(); wrenSetSlotDouble(vm, 0, handle); } static void EntityHasComponent(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); std::string name = wrenGetSlotString(vm, 2); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); if (name == "Transform") { bool result = ent.HasComponent(); wrenSetSlotBool(vm, 0, result); } if (name == "Light") { bool result = ent.HasComponent(); wrenSetSlotBool(vm, 0, result); } if (name == "QuakeMap") { bool result = ent.HasComponent(); wrenSetSlotBool(vm, 0, result); } if (name == "CharacterController") { bool result = ent.HasComponent(); wrenSetSlotBool(vm, 0, result); } if (name == "Camera") { bool result = ent.HasComponent(); wrenSetSlotBool(vm, 0, result); } if (name == "Script") { bool result = ent.HasComponent(); wrenSetSlotBool(vm, 0, result); } if (name == "Rigidbody") { bool result = ent.HasComponent(); wrenSetSlotBool(vm, 0, result); } if (name == "Script") { bool result = ent.HasComponent(); wrenSetSlotBool(vm, 0, result); } if (name == "Brush") { bool result = ent.HasComponent(); wrenSetSlotBool(vm, 0, result); } } static void GetScript(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); if (ent.HasComponent()) { wrenSetSlotHandle(vm, 0, ent.GetComponent().mWrenScript->m_Instance); } } static void SetLightIntensity(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); float intensity = wrenGetSlotDouble(vm, 2); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); auto& light = ent.GetComponent(); light.Strength = intensity; } static void GetLightIntensity(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); float intensity = wrenGetSlotDouble(vm, 2); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); auto& light = ent.GetComponent(); wrenSetSlotDouble(vm, 0, light.Strength); } static void SetCameraDirection(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); float x = wrenGetSlotDouble(vm, 2); float y = wrenGetSlotDouble(vm, 3); float z = wrenGetSlotDouble(vm, 4); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); auto& cam = ent.GetComponent(); cam.CameraInstance->SetDirection(Vector3(x, y, z)); } static void GetCameraDirection(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); auto& cam = ent.GetComponent(); Vector3 dir = cam.CameraInstance->GetDirection(); wrenEnsureSlots(vm, 4); // set the slots // Fill the list wrenSetSlotNewList(vm, 0); wrenSetSlotDouble(vm, 1, dir.x); wrenSetSlotDouble(vm, 2, dir.y); wrenSetSlotDouble(vm, 3, dir.z); wrenInsertInList(vm, 0, -1, 1); wrenInsertInList(vm, 0, -1, 2); wrenInsertInList(vm, 0, -1, 3); } static void GetCameraRight(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); auto& cam = ent.GetComponent(); Vector3 right = cam.CameraInstance->GetRight(); // set the slots wrenSetSlotDouble(vm, 1, right.x); wrenSetSlotDouble(vm, 2, right.y); wrenSetSlotDouble(vm, 3, right.z); // Fill the list wrenSetSlotNewList(vm, 0); wrenInsertInList(vm, 0, 0, 1); wrenInsertInList(vm, 0, 1, 2); wrenInsertInList(vm, 0, 2, 3); } static void IsCharacterControllerOnGround(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); auto& characterController = ent.GetComponent(); bool result = characterController.CharacterController->IsOnGround; wrenSetSlotBool(vm, 0, result); } static void MoveAndSlide(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); float x = wrenGetSlotDouble(vm, 2); float y = wrenGetSlotDouble(vm, 3); float z = wrenGetSlotDouble(vm, 4); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); auto& characterController = ent.GetComponent(); characterController.CharacterController->MoveAndSlide(Vector3(x, y, z)); } static void GetTranslation(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); auto& transform = ent.GetComponent(); // set the slots wrenSetSlotDouble(vm, 1, transform.Translation.x); wrenSetSlotDouble(vm, 2, transform.Translation.y); wrenSetSlotDouble(vm, 3, transform.Translation.z); // Fill the list wrenSetSlotNewList(vm, 0); wrenInsertInList(vm, 0, 0, 1); wrenInsertInList(vm, 0, 1, 2); wrenInsertInList(vm, 0, 2, 3); } static void GetRotation(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); auto& transform = ent.GetComponent(); // set the slots wrenSetSlotDouble(vm, 1, transform.Rotation.x); wrenSetSlotDouble(vm, 2, transform.Rotation.y); wrenSetSlotDouble(vm, 3, transform.Rotation.z); // Fill the list wrenSetSlotNewList(vm, 0); wrenInsertInList(vm, 0, 0, 1); wrenInsertInList(vm, 0, 1, 2); wrenInsertInList(vm, 0, 2, 3); } static void SetRotation(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); auto& transform = ent.GetComponent(); // set the slots float x = wrenGetSlotDouble(vm, 2); float y = wrenGetSlotDouble(vm, 3); float z = wrenGetSlotDouble(vm, 4); transform.Rotation = Vector3(x, y, z); } static void SetTranslation(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); auto& transform = ent.GetComponent(); // set the slots float x = wrenGetSlotDouble(vm, 2); float y = wrenGetSlotDouble(vm, 3); float z = wrenGetSlotDouble(vm, 4); transform.Translation = Vector3(x, y, z); } static void TriggerGetOverlappingBodyCount(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); TriggerZone trigger = ent.GetComponent(); int count = trigger.GetOverLappingCount(); wrenSetSlotDouble(vm, 0, count); } static void TriggerGetOverlappingBodies(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); TriggerZone trigger = ent.GetComponent(); std::vector entities = trigger.GetOverlappingBodies(); wrenEnsureSlots(vm, entities.size()); wrenSetSlotNewList(vm, 0); int idx = 1; for (auto& e : entities) { wrenSetSlotDouble(vm, idx, e.GetHandle()); wrenInsertInList(vm, 0, -1, idx); idx++; } } static void BrushGetTargets(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); BSPBrushComponent& brush = ent.GetComponent(); wrenEnsureSlots(vm, brush.Targets.size()); wrenSetSlotNewList(vm, 0); int idx = 1; for (auto& e : brush.Targets) { wrenSetSlotDouble(vm, idx, e.GetHandle()); wrenInsertInList(vm, 0, -1, idx); idx++; } } static void BrushGetTargetsCount(WrenVM* vm) { int handle = wrenGetSlotDouble(vm, 1); Entity ent = Entity((entt::entity)handle, Engine::GetCurrentScene().get()); BSPBrushComponent& brush = ent.GetComponent(); wrenSetSlotDouble(vm, 0, brush.Targets.size()); } }; } }