MetaCore/do_ecs_refactor.py

58 lines
3.6 KiB
Python

import os
import re
def process_file(filepath):
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
original_content = content
# Component replacements
# MeshRenderer
content = re.sub(r'\.MeshRenderer\s*->', '.GetComponent<MetaCoreMeshRendererComponent>().', content)
content = re.sub(r'->MeshRenderer\s*->', '->GetComponent<MetaCoreMeshRendererComponent>().', content)
content = re.sub(r'\.MeshRenderer\s*\.\s*has_value\(\)', '.HasComponent<MetaCoreMeshRendererComponent>()', content)
content = re.sub(r'->MeshRenderer\s*\.\s*has_value\(\)', '->HasComponent<MetaCoreMeshRendererComponent>()', content)
content = re.sub(r'\.MeshRenderer\s*=\s*(.*?);', r'.AddComponent<MetaCoreMeshRendererComponent>(\1);', content)
content = re.sub(r'->MeshRenderer\s*=\s*(.*?);', r'->AddComponent<MetaCoreMeshRendererComponent>(\1);', content)
content = re.sub(r'\.MeshRenderer\s*\.\s*reset\(\)', '.RemoveComponent<MetaCoreMeshRendererComponent>()', content)
# Camera
content = re.sub(r'\.Camera\s*->', '.GetComponent<MetaCoreCameraComponent>().', content)
content = re.sub(r'->Camera\s*->', '->GetComponent<MetaCoreCameraComponent>().', content)
content = re.sub(r'\.Camera\s*\.\s*has_value\(\)', '.HasComponent<MetaCoreCameraComponent>()', content)
content = re.sub(r'->Camera\s*\.\s*has_value\(\)', '->HasComponent<MetaCoreCameraComponent>()', content)
content = re.sub(r'\.Camera\s*=\s*(.*?);', r'.AddComponent<MetaCoreCameraComponent>(\1);', content)
content = re.sub(r'->Camera\s*=\s*(.*?);', r'->AddComponent<MetaCoreCameraComponent>(\1);', content)
# Light
content = re.sub(r'\.Light\s*->', '.GetComponent<MetaCoreLightComponent>().', content)
content = re.sub(r'->Light\s*->', '->GetComponent<MetaCoreLightComponent>().', content)
content = re.sub(r'\.Light\s*\.\s*has_value\(\)', '.HasComponent<MetaCoreLightComponent>()', content)
content = re.sub(r'->Light\s*\.\s*has_value\(\)', '->HasComponent<MetaCoreLightComponent>()', content)
content = re.sub(r'\.Light\s*=\s*(.*?);', r'.AddComponent<MetaCoreLightComponent>(\1);', content)
content = re.sub(r'->Light\s*=\s*(.*?);', r'->AddComponent<MetaCoreLightComponent>(\1);', content)
# PrefabInstance
content = re.sub(r'\.PrefabInstance\s*->', '.GetComponent<MetaCorePrefabInstanceMetadata>().', content)
content = re.sub(r'->PrefabInstance\s*->', '->GetComponent<MetaCorePrefabInstanceMetadata>().', content)
content = re.sub(r'\.PrefabInstance\s*\.\s*has_value\(\)', '.HasComponent<MetaCorePrefabInstanceMetadata>()', content)
content = re.sub(r'->PrefabInstance\s*\.\s*has_value\(\)', '->HasComponent<MetaCorePrefabInstanceMetadata>()', content)
content = re.sub(r'\.PrefabInstance\s*=\s*(.*?);', r'.AddComponent<MetaCorePrefabInstanceMetadata>(\1);', content)
content = re.sub(r'->PrefabInstance\s*=\s*(.*?);', r'->AddComponent<MetaCorePrefabInstanceMetadata>(\1);', content)
# Direct struct members (Id, ParentId, Name, Transform)
# We must be careful not to replace `object.Id` everywhere blindly if `object` is not a GameObject.
# But in this codebase, typical variable names are `gameObject`, `object`, `rootObject`, `currentObject`.
# It's safer to rely on compiler errors for the rest and fix them manually.
if content != original_content:
with open(filepath, 'w', encoding='utf-8') as f:
f.write(content)
print(f"Updated {filepath}")
for root, _, files in os.walk('Source'):
for file in files:
if file.endswith('.cpp') or file.endswith('.h'):
process_file(os.path.join(root, file))