diff --git a/Engine_Master_UPC/AnimationComponent.cpp b/Engine_Master_UPC/AnimationComponent.cpp index b2443907..68f23e65 100644 --- a/Engine_Master_UPC/AnimationComponent.cpp +++ b/Engine_Master_UPC/AnimationComponent.cpp @@ -13,9 +13,10 @@ #include "GameObject.h" #include "Transform.h" #include "StateMachineScript.h" -#include "ScriptFactory.h" +#include "GenericTypeFactory.h" #include "Script.h" -#include "ScriptComponentRef.h" +#include "ComponentRef.h" +#include "FieldUtils.h" #include "ModuleScene.h" #include "Scene.h" @@ -873,163 +874,8 @@ void AnimationComponent::drawStateBehaviourFieldsUi(AnimationStateMachineState& void AnimationComponent::drawScriptFieldsUi(Script& script) { - ScriptFieldList fieldList = script.getExposedFields(); - char* base = reinterpret_cast(&script); - - for (const ScriptFieldInfo& field : fieldList.fields) - { - void* data = base + field.offset; - bool changed = false; - - switch (field.type) - { - case ScriptFieldType::Float: - { - float* value = reinterpret_cast(data); - changed = ImGui::DragFloat(field.name, value, field.floatInfo.dragSpeed, field.floatInfo.min, field.floatInfo.max); - break; - } - - case ScriptFieldType::Int: - { - int* value = reinterpret_cast(data); - changed = ImGui::DragInt(field.name, value); - break; - } - - case ScriptFieldType::Bool: - { - bool* value = reinterpret_cast(data); - changed = ImGui::Checkbox(field.name, value); - break; - } - - case ScriptFieldType::Vec3: - { - Vector3* value = reinterpret_cast(data); - changed = ImGui::DragFloat3(field.name, &value->x, 0.1f); - break; - } - - case ScriptFieldType::EnumInt: - { - int* value = reinterpret_cast(data); - - const char* preview = ""; - if (*value >= 0 && *value < field.enumInfo.count) - { - preview = field.enumInfo.names[*value]; - } - - if (ImGui::BeginCombo(field.name, preview)) - { - for (int enumIndex = 0; enumIndex < field.enumInfo.count; ++enumIndex) - { - bool selected = (*value == enumIndex); - if (ImGui::Selectable(field.enumInfo.names[enumIndex], selected)) - { - *value = enumIndex; - changed = true; - } - - if (selected) - { - ImGui::SetItemDefaultFocus(); - } - } - - ImGui::EndCombo(); - } - break; - } - - case ScriptFieldType::String: - { - std::string* value = reinterpret_cast(data); - - char buffer[256]; - std::strncpy(buffer, value->c_str(), sizeof(buffer)); - buffer[sizeof(buffer) - 1] = '\0'; - - if (ImGui::InputText(field.name, buffer, sizeof(buffer))) - { - *value = buffer; - changed = true; - } - break; - } - - case ScriptFieldType::ComponentRef: - { - ScriptComponentRef* componentReference = reinterpret_cast*>(data); - - Component* component = componentReference->component; - - ImGui::Text("%s", field.name); - ImGui::SameLine(); - - if (component != nullptr) - { - ImGui::TextColored(ImVec4(0.0f, 1.0f, 0.0f, 1.0f), "%s", component->getOwner()->GetName().c_str()); - } - else - { - ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "None"); - } - - if (ImGui::BeginDragDropTarget()) - { - if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("GAME_OBJECT")) - { - GameObject* droppedObject = *(GameObject**)payload->Data; - GameObject* sceneObject = app->getModuleScene()->getScene()->findGameObjectByUID(droppedObject->GetID()); - - if (sceneObject != nullptr) - { - Component* candidate = nullptr; - - if (field.componentRefInfo.componentType == ComponentType::TRANSFORM) - { - candidate = sceneObject->GetTransform(); - } - else - { - candidate = sceneObject->GetComponent(field.componentRefInfo.componentType); - } - - if (candidate != nullptr) - { - componentReference->uid = candidate->getID(); - componentReference->component = candidate; - script.onFieldEdited(field); - changed = true; - } - } - } - - ImGui::EndDragDropTarget(); - } - - ImGui::SameLine(); - - std::string clearLabel = std::string("Clear###") + field.name; - if (ImGui::Button(clearLabel.c_str())) - { - componentReference->uid = 0; - componentReference->component = nullptr; - script.onFieldEdited(field); - changed = true; - } - break; - } - } - - if (changed) - { - script.onFieldEdited(field); - m_stateMachineDirty = true; - } - } + FieldUtils::drawUi(script, reinterpret_cast(&script)); + m_stateMachineDirty = true; } void AnimationComponent::debugDrawRecursive(GameObject* go) { @@ -1689,7 +1535,7 @@ StateMachineScript* AnimationComponent::createStateBehaviourIfNeeded(const Anima return existing; } - std::unique_ptr