EG/core/vr/config/vr_config.py
2025-10-11 16:41:59 +08:00

273 lines
8.2 KiB
Python

"""
VR配置管理器模块
负责VR设置的保存、加载和管理
"""
import os
import json
from pathlib import Path
class VRConfigManager:
"""VR配置管理器类"""
def __init__(self, config_dir=None):
"""初始化配置管理器
Args:
config_dir: 配置目录路径,默认为项目目录/config
"""
if config_dir is None:
# 默认使用项目根目录下的config文件夹
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
config_dir = os.path.join(project_root, "config")
self.config_dir = Path(config_dir)
self.config_file = self.config_dir / "vr_settings.json"
# 确保配置目录存在
self.config_dir.mkdir(parents=True, exist_ok=True)
# 默认配置
self.default_config = {
"render_mode": "normal", # "normal" 或 "render_pipeline"
"resolution_scale": 0.75,
"pipeline_resolution_scale": 0.75,
"quality_preset": "balanced", # "performance", "balanced", "quality"
"anti_aliasing": "4x", # "无", "2x", "4x", "8x"
"refresh_rate": "90Hz", # "72Hz", "90Hz", "120Hz", "144Hz"
"async_reprojection": True, # 异步重投影开关
"pipeline_vr_config": {
"enable_shadows": True,
"enable_ao": True,
"enable_bloom": False,
"enable_motion_blur": False,
"enable_ssr": False,
"shadow_quality": "medium",
"ao_quality": "low"
}
}
def load_config(self):
"""加载VR配置
Returns:
dict: VR配置字典
"""
try:
if self.config_file.exists():
with open(self.config_file, 'r', encoding='utf-8') as f:
config = json.load(f)
print(f"✓ VR配置已加载: {self.config_file}")
return config
else:
print(f"⚠️ 配置文件不存在,使用默认配置: {self.config_file}")
return self.default_config.copy()
except Exception as e:
print(f"❌ 加载VR配置失败: {e}")
print(" 使用默认配置")
return self.default_config.copy()
def save_config(self, config):
"""保存VR配置
Args:
config: VR配置字典
Returns:
bool: 保存是否成功
"""
try:
with open(self.config_file, 'w', encoding='utf-8') as f:
json.dump(config, f, indent=4, ensure_ascii=False)
print(f"✓ VR配置已保存: {self.config_file}")
return True
except Exception as e:
print(f"❌ 保存VR配置失败: {e}")
import traceback
traceback.print_exc()
return False
def get_render_mode(self):
"""获取渲染模式配置
Returns:
str: 渲染模式 ("normal""render_pipeline")
"""
config = self.load_config()
return config.get("render_mode", "normal")
def set_render_mode(self, mode):
"""设置渲染模式并保存
Args:
mode: 渲染模式字符串
Returns:
bool: 设置是否成功
"""
if mode not in ["normal", "render_pipeline"]:
print(f"❌ 无效的渲染模式: {mode}")
return False
config = self.load_config()
config["render_mode"] = mode
return self.save_config(config)
def get_resolution_scale(self):
"""获取分辨率缩放配置
Returns:
float: 分辨率缩放系数
"""
config = self.load_config()
return config.get("resolution_scale", 0.75)
def set_resolution_scale(self, scale):
"""设置分辨率缩放并保存
Args:
scale: 分辨率缩放系数 (0.5-1.0)
Returns:
bool: 设置是否成功
"""
if not 0.5 <= scale <= 1.0:
print(f"❌ 无效的分辨率缩放: {scale} (应在0.5-1.0之间)")
return False
config = self.load_config()
config["resolution_scale"] = scale
return self.save_config(config)
def get_quality_preset(self):
"""获取质量预设
Returns:
str: 质量预设名称
"""
config = self.load_config()
return config.get("quality_preset", "balanced")
def set_quality_preset(self, preset):
"""设置质量预设并保存
Args:
preset: 质量预设 ("performance", "balanced", "quality")
Returns:
bool: 设置是否成功
"""
if preset not in ["performance", "balanced", "quality"]:
print(f"❌ 无效的质量预设: {preset}")
return False
config = self.load_config()
config["quality_preset"] = preset
return self.save_config(config)
def get_pipeline_config(self):
"""获取RenderPipeline VR配置
Returns:
dict: Pipeline配置字典
"""
config = self.load_config()
return config.get("pipeline_vr_config", self.default_config["pipeline_vr_config"].copy())
def update_pipeline_config(self, pipeline_config):
"""更新RenderPipeline VR配置
Args:
pipeline_config: Pipeline配置字典
Returns:
bool: 更新是否成功
"""
config = self.load_config()
config["pipeline_vr_config"] = pipeline_config
return self.save_config(config)
def reset_to_defaults(self):
"""重置为默认配置
Returns:
bool: 重置是否成功
"""
return self.save_config(self.default_config.copy())
def apply_config_to_vr_manager(self, vr_manager):
"""将配置应用到VR管理器
Args:
vr_manager: VRManager实例
Returns:
bool: 应用是否成功
"""
try:
config = self.load_config()
# 应用渲染模式
render_mode = config.get("render_mode", "normal")
from core.vr import VRRenderMode
if render_mode == "render_pipeline":
vr_manager.vr_render_mode = VRRenderMode.RENDER_PIPELINE
else:
vr_manager.vr_render_mode = VRRenderMode.NORMAL
# 应用分辨率缩放
resolution_scale = config.get("resolution_scale", 0.75)
vr_manager.resolution_scale = resolution_scale
# 应用Pipeline分辨率缩放
pipeline_resolution_scale = config.get("pipeline_resolution_scale", 0.75)
vr_manager.pipeline_resolution_scale = pipeline_resolution_scale
# 应用质量预设
quality_preset = config.get("quality_preset", "balanced")
vr_manager.current_quality_preset = quality_preset
# 应用Pipeline配置
pipeline_config = config.get("pipeline_vr_config", {})
if pipeline_config:
vr_manager.pipeline_vr_config.update(pipeline_config)
print("✓ VR配置已应用到VR管理器")
return True
except Exception as e:
print(f"❌ 应用VR配置失败: {e}")
import traceback
traceback.print_exc()
return False
def save_from_vr_manager(self, vr_manager):
"""从VR管理器保存当前配置
Args:
vr_manager: VRManager实例
Returns:
bool: 保存是否成功
"""
try:
config = {
"render_mode": vr_manager.vr_render_mode.value,
"resolution_scale": vr_manager.resolution_scale,
"pipeline_resolution_scale": vr_manager.pipeline_resolution_scale,
"quality_preset": vr_manager.current_quality_preset,
"pipeline_vr_config": vr_manager.pipeline_vr_config.copy()
}
return self.save_config(config)
except Exception as e:
print(f"❌ 从VR管理器保存配置失败: {e}")
import traceback
traceback.print_exc()
return False