diff --git a/project/project_manager.py b/project/project_manager.py index 9156891f..d6f87b18 100644 --- a/project/project_manager.py +++ b/project/project_manager.py @@ -28,7 +28,6 @@ from project.scene_description import ( build_scene_description_from_world, build_runtime_manifest, build_runtime_scene, - build_scene_description_from_cache, load_json, normalize_scene_description, save_json, @@ -93,18 +92,12 @@ class ProjectManager: elif not normalized_path.lower().endswith(SCENE_DESCRIPTION_EXTENSION): normalized_path = f"Scenes/{scene_name}{SCENE_DESCRIPTION_EXTENSION}" - normalized_cache = str(scene_entry.get("cache_path", "") or "").replace("\\", "/").strip() - if normalized_cache.lower().endswith("scene.bam"): - normalized_cache = "" - normalized_entry = { "guid": scene_guid, "name": scene_name, "path": normalized_path, "enabled_in_build": bool(scene_entry.get("enabled_in_build", True)), } - if normalized_cache: - normalized_entry["cache_path"] = normalized_cache return normalized_entry def _upgrade_scene_description_files(self, project_path, project_config): @@ -531,77 +524,6 @@ class ProjectManager: return {} return asset_database.register_asset(asset_path, copy_into_assets=False) - def _migrate_legacy_project_if_needed(self, project_path, project_config): - project_path = normalize_path(project_path) - if int(project_config.get("schema_version", 1) or 1) >= PROJECT_SCHEMA_VERSION: - return project_config - - print(f"开始迁移旧项目到 v{PROJECT_SCHEMA_VERSION}: {project_path}") - self._create_legacy_backup(project_path) - - layout = ProjectLayout(project_path) - ensure_project_directories(layout) - asset_database = AssetDatabase(project_path, world=self.world) - - legacy_sources = [ - os.path.join(project_path, "models"), - os.path.join(project_path, "textures"), - os.path.join(project_path, "Resources"), - os.path.join(project_path, "scripts"), - ] - for source_root in legacy_sources: - if not os.path.exists(source_root): - continue - for root, _, files in os.walk(source_root): - # 跳过缓存目录与无意义的中间文件 - if os.path.basename(root) == "__pycache__": - continue - for file_name in files: - if file_name.endswith((".meta", ".pyc", ".pyo")): - continue - source_file = os.path.join(root, file_name) - asset_database.import_asset(source_file) - - scene_guid = generate_guid() - scene_name = "Main" - scene_entry = self._build_scene_entry(scene_guid, scene_name) - scene_paths = self._scene_paths(scene_entry, project_path=project_path) - - legacy_scene_file = os.path.join(project_path, "scenes", "scene.bam") - if os.path.exists(legacy_scene_file): - legacy_gui = legacy_scene_file.replace(".bam", "_gui.json") - legacy_lui = legacy_scene_file.replace(".bam", "_lui.json") - if os.path.exists(legacy_gui): - shutil.copy2(legacy_gui, scene_paths["scene_gui_file"]) - if os.path.exists(legacy_lui): - shutil.copy2(legacy_lui, scene_paths["scene_lui_file"]) - - migrated_config = self._create_default_project_config(project_path, project_config.get("name") or os.path.basename(project_path)) - migrated_config["created_at"] = project_config.get("created_at") or project_config.get("created") or migrated_config["created_at"] - migrated_config["last_modified"] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - migrated_config["scenes"] = [scene_entry] - migrated_config["startup_scene_guid"] = scene_guid - migrated_config["last_open_scene_guid"] = scene_guid - - if os.path.exists(legacy_scene_file): - scene_description = build_scene_description_from_cache( - world=self.world, - asset_database=asset_database, - project_root=project_path, - scene_guid=scene_guid, - scene_name=scene_name, - scene_file_rel=scene_entry["path"], - cache_bam_path=legacy_scene_file, - cache_gui_path=scene_paths["scene_gui_file"], - cache_lui_path=scene_paths["scene_lui_file"], - camera_state=self._capture_camera_state(), - ) - save_json(os.path.join(project_path, scene_entry["path"].replace("/", os.sep)), scene_description) - - self._write_project_config(project_path, migrated_config) - print(f"✓ 旧项目迁移完成: {project_path}") - return migrated_config - def _retarget_live_scene_asset_paths(self): asset_database = self.get_asset_database() if not asset_database or not getattr(self.world, "render", None): @@ -783,7 +705,6 @@ class ProjectManager: previous_project_path = self.current_project_path previous_project_config = self.project_config - project_config = self._migrate_legacy_project_if_needed(project_path, project_config) ensure_project_directories(ProjectLayout(project_path)) project_config = self._ensure_v2_project_defaults(project_path, project_config) _, project_config = self._upgrade_scene_description_files(project_path, project_config) @@ -841,30 +762,6 @@ class ProjectManager: """ return self.openProject(project_path) - def _write_scene_description_from_cache(self, scene_entry, project_path): - scene_paths = self._scene_paths(scene_entry, project_path=project_path) - asset_database = self.get_asset_database(project_path, reload=True) - if asset_database: - asset_database.ensure_project_assets_registered() - legacy_cache_rel = str((scene_entry or {}).get("cache_path", "") or "").replace("/", os.sep) - legacy_cache_file = os.path.join(project_path, legacy_cache_rel) if legacy_cache_rel else "" - - scene_description = build_scene_description_from_cache( - world=self.world, - asset_database=asset_database, - project_root=project_path, - scene_guid=scene_entry["guid"], - scene_name=scene_entry["name"], - scene_file_rel=scene_entry["path"], - cache_bam_path=legacy_cache_file, - cache_gui_path=scene_paths["scene_gui_file"], - cache_lui_path=scene_paths["scene_lui_file"], - camera_state=self._capture_camera_state(), - ) - scene_file_path = os.path.join(project_path, scene_entry["path"].replace("/", os.sep)) - save_json(scene_file_path, scene_description) - return scene_description - def _capture_scene_sidecar_snapshots(self, scene_paths): gui_snapshot = self._capture_gui_snapshot_from_world() lui_snapshot = self._capture_lui_snapshot_from_world() @@ -999,7 +896,7 @@ class ProjectManager: gui_snapshot, lui_snapshot = self._capture_scene_sidecar_snapshots(scene_paths) root_nodes = self._collect_live_scene_root_nodes() if not root_nodes: - return self._write_scene_description_from_cache(scene_entry, project_path) + raise RuntimeError("当前场景没有可保存的根节点") scene_description = build_scene_description_from_world( asset_database=asset_database, @@ -1757,10 +1654,11 @@ class ProjectManager: legacy_scene_bams.append(os.path.join(root, file_name)) validation["checks"].append( { - "name": "no_project_scene_bam", + "name": "no_scene_bam_in_scene_pipeline", "path": ", ".join(legacy_scene_bams), "ok": not legacy_scene_bams, "required": True, + "detail": "scene.bam 仅允许作为模型资源/模型缓存存在,不允许进入项目场景与运行时场景链路", } ) if legacy_scene_bams: diff --git a/project/scene_description.py b/project/scene_description.py index 53a4ad62..ed1ab69c 100644 --- a/project/scene_description.py +++ b/project/scene_description.py @@ -6,8 +6,6 @@ import json import os from datetime import datetime -from panda3d.core import Filename - from project.project_schema import ( ENGINE_NAME, MANIFEST_SCHEMA_VERSION, @@ -370,48 +368,6 @@ def _build_scene_description_payload( "nodes": node_entries, } return description - - -def build_scene_description_from_cache( - *, - world, - asset_database, - project_root: str, - scene_guid: str, - scene_name: str, - scene_file_rel: str, - cache_bam_path: str, - cache_gui_path: str = "", - cache_lui_path: str = "", - camera_state: dict | None = None, -): - gui_elements = load_json(cache_gui_path, []) - lui_snapshot = load_json(cache_lui_path, {}) - scene_np = world.loader.loadModel(Filename.fromOsSpecific(cache_bam_path)) - if not scene_np or scene_np.isEmpty(): - raise RuntimeError(f"无法从缓存场景生成描述: {cache_bam_path}") - - try: - root_nodes = list(scene_np.getChildren()) - except Exception: - root_nodes = [] - - return _build_scene_description_payload( - asset_database=asset_database, - project_root=project_root, - scene_guid=scene_guid, - scene_name=scene_name, - scene_file_rel=scene_file_rel, - root_nodes=root_nodes, - cache_bam_path=cache_bam_path, - cache_gui_path=cache_gui_path, - cache_lui_path=cache_lui_path, - gui_elements=gui_elements, - lui_snapshot=lui_snapshot, - camera_state=camera_state, - ) - - def build_scene_description_from_world( *, asset_database,