411 lines
14 KiB
Python
411 lines
14 KiB
Python
"""
|
||
粒子系统插件主文件
|
||
"""
|
||
|
||
from plugins.plugin_manager import BasePlugin
|
||
from .core.particle_manager import ParticleManager
|
||
from .editor.particle_editor import ParticleEditor
|
||
from .tools.performance_monitor import PerformanceMonitor
|
||
from .editor.preset_manager import PresetManager
|
||
|
||
class Plugin(BasePlugin):
|
||
"""
|
||
粒子系统插件
|
||
提供完整的3D粒子特效功能
|
||
"""
|
||
|
||
def __init__(self, plugin_manager, name):
|
||
super().__init__(plugin_manager, name)
|
||
self.config = {
|
||
"version": "1.0.0",
|
||
"author": "EG Team",
|
||
"description": "高性能3D粒子系统插件,支持火焰、烟雾、爆炸等多种特效"
|
||
}
|
||
|
||
# 核心组件
|
||
self.particle_manager = None
|
||
self.particle_editor = None
|
||
self.performance_monitor = None
|
||
self.preset_manager = None
|
||
|
||
# GUI元素
|
||
self.gui_elements = []
|
||
|
||
# 事件处理器
|
||
self.event_handlers = {}
|
||
|
||
# 插件状态
|
||
self.is_initialized = False
|
||
self.is_enabled = False
|
||
|
||
def initialize(self) -> bool:
|
||
"""
|
||
初始化插件
|
||
"""
|
||
try:
|
||
if self.is_initialized:
|
||
return True
|
||
|
||
print(f"初始化粒子系统插件: {self.name}")
|
||
|
||
# 初始化粒子管理器
|
||
self.particle_manager = ParticleManager(self.plugin_manager.world)
|
||
|
||
# 初始化性能监控器
|
||
self.performance_monitor = PerformanceMonitor(self.particle_manager)
|
||
|
||
# 初始化粒子编辑器
|
||
self.particle_editor = ParticleEditor(
|
||
self.plugin_manager.world,
|
||
self.particle_manager
|
||
)
|
||
|
||
# 初始化预设管理器
|
||
self.preset_manager = PresetManager()
|
||
|
||
self.is_initialized = True
|
||
print("✓ 粒子系统插件初始化完成")
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"✗ 粒子系统插件初始化失败: {e}")
|
||
return False
|
||
|
||
def enable(self) -> bool:
|
||
"""
|
||
启用插件
|
||
"""
|
||
if not super().enable():
|
||
return False
|
||
|
||
if self.is_enabled:
|
||
return True
|
||
|
||
try:
|
||
print(f"启用粒子系统插件: {self.name}")
|
||
|
||
# 启用粒子管理器
|
||
if self.particle_manager:
|
||
self.particle_manager.enable()
|
||
|
||
# 注册事件处理器
|
||
self._register_event_handlers()
|
||
|
||
# 创建GUI界面
|
||
self._create_gui()
|
||
|
||
# 启动性能监控
|
||
if self.performance_monitor:
|
||
self.performance_monitor.start()
|
||
|
||
self.is_enabled = True
|
||
print("✓ 粒子系统插件启用成功")
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"✗ 粒子系统插件启用失败: {e}")
|
||
return False
|
||
|
||
def disable(self) -> bool:
|
||
"""
|
||
禁用插件
|
||
"""
|
||
if not super().disable():
|
||
return False
|
||
|
||
if not self.is_enabled:
|
||
return True
|
||
|
||
try:
|
||
print(f"禁用粒子系统插件: {self.name}")
|
||
|
||
# 停止性能监控
|
||
if self.performance_monitor:
|
||
self.performance_monitor.stop()
|
||
|
||
# 清理GUI界面
|
||
self._cleanup_gui()
|
||
|
||
# 移除事件处理器
|
||
self._unregister_event_handlers()
|
||
|
||
# 禁用粒子管理器
|
||
if self.particle_manager:
|
||
self.particle_manager.disable()
|
||
|
||
self.is_enabled = False
|
||
print("✓ 粒子系统插件禁用成功")
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"✗ 粒子系统插件禁用失败: {e}")
|
||
return False
|
||
|
||
def finalize(self):
|
||
"""
|
||
清理插件资源
|
||
"""
|
||
print(f"清理粒子系统插件资源: {self.name}")
|
||
|
||
# 清理所有组件
|
||
if self.particle_editor:
|
||
self.particle_editor.cleanup()
|
||
self.particle_editor = None
|
||
|
||
if self.performance_monitor:
|
||
self.performance_monitor.cleanup()
|
||
self.performance_monitor = None
|
||
|
||
if self.particle_manager:
|
||
self.particle_manager.cleanup()
|
||
self.particle_manager = None
|
||
|
||
if self.preset_manager:
|
||
self.preset_manager = None
|
||
|
||
self.is_initialized = False
|
||
self.is_enabled = False
|
||
|
||
def _register_event_handlers(self):
|
||
"""
|
||
注册事件处理器
|
||
"""
|
||
world = self.plugin_manager.world
|
||
|
||
# 粒子系统控制快捷键
|
||
self.event_handlers['f5'] = self.toggle_particle_editor
|
||
self.event_handlers['f6'] = self.toggle_performance_monitor
|
||
self.event_handlers['f7'] = self.create_test_particles
|
||
self.event_handlers['f8'] = self.clear_all_particles
|
||
self.event_handlers['f9'] = self.create_fire_effect
|
||
self.event_handlers['f10'] = self.create_smoke_effect
|
||
self.event_handlers['f11'] = self.create_explosion_effect
|
||
self.event_handlers['f12'] = self.create_water_effect
|
||
|
||
# 注册事件
|
||
for event, handler in self.event_handlers.items():
|
||
world.accept(event, handler)
|
||
world.accept(event.upper(), handler) # 同时注册大写事件
|
||
|
||
def _unregister_event_handlers(self):
|
||
"""
|
||
移除事件处理器
|
||
"""
|
||
world = self.plugin_manager.world
|
||
|
||
for event in self.event_handlers.keys():
|
||
world.ignore(event)
|
||
world.ignore(event.upper())
|
||
|
||
self.event_handlers.clear()
|
||
|
||
def _create_gui(self):
|
||
"""
|
||
创建GUI界面
|
||
"""
|
||
try:
|
||
world = self.plugin_manager.world
|
||
|
||
# 检查是否有GUI管理器
|
||
if not hasattr(world, 'gui_manager') or not world.gui_manager:
|
||
print("⚠ GUI管理器不可用,跳过GUI创建")
|
||
return
|
||
|
||
gui_manager = world.gui_manager
|
||
|
||
# 创建粒子系统控制面板
|
||
panel_button = gui_manager.createGUIButton(
|
||
pos=(0.02, 0, 0.95),
|
||
text="粒子系统",
|
||
size=0.06
|
||
)
|
||
self.gui_elements.append(panel_button)
|
||
|
||
# 创建快速效果按钮
|
||
effects = [
|
||
("火焰 [F9]", self.create_fire_effect),
|
||
("烟雾 [F10]", self.create_smoke_effect),
|
||
("爆炸 [F11]", self.create_explosion_effect),
|
||
("水花 [F12]", self.create_water_effect),
|
||
("测试 [F7]", self.create_test_particles),
|
||
("清除 [F8]", self.clear_all_particles)
|
||
]
|
||
|
||
for i, (name, callback) in enumerate(effects):
|
||
button = gui_manager.createGUIButton(
|
||
pos=(0.02, 0, 0.88 - i * 0.07),
|
||
text=name,
|
||
size=0.05
|
||
)
|
||
self.gui_elements.append(button)
|
||
world.accept(f"particle_effect_{name}", callback)
|
||
|
||
# 创建工具按钮
|
||
tools = [
|
||
("编辑器 [F5]", self.toggle_particle_editor),
|
||
("性能监控 [F6]", self.toggle_performance_monitor)
|
||
]
|
||
|
||
for i, (name, callback) in enumerate(tools):
|
||
button = gui_manager.createGUIButton(
|
||
pos=(0.02, 0, 0.40 - i * 0.07),
|
||
text=name,
|
||
size=0.05
|
||
)
|
||
self.gui_elements.append(button)
|
||
|
||
except Exception as e:
|
||
print(f"⚠ GUI创建失败: {e}")
|
||
|
||
def _cleanup_gui(self):
|
||
"""
|
||
清理GUI界面
|
||
"""
|
||
try:
|
||
world = self.plugin_manager.world
|
||
|
||
if hasattr(world, 'gui_manager') and world.gui_manager:
|
||
gui_manager = world.gui_manager
|
||
|
||
# 删除所有GUI元素
|
||
for element in self.gui_elements:
|
||
gui_manager.deleteGUIElement(element)
|
||
|
||
self.gui_elements.clear()
|
||
|
||
except Exception as e:
|
||
print(f"⚠ GUI清理失败: {e}")
|
||
|
||
# 事件处理方法
|
||
def toggle_particle_editor(self):
|
||
"""切换粒子编辑器显示"""
|
||
if self.particle_editor:
|
||
self.particle_editor.toggle_visibility()
|
||
|
||
def toggle_performance_monitor(self):
|
||
"""切换性能监控器显示"""
|
||
if self.performance_monitor:
|
||
self.performance_monitor.toggle_display()
|
||
|
||
def create_test_particles(self):
|
||
"""创建测试粒子"""
|
||
if self.particle_manager:
|
||
self.particle_manager.create_test_effect()
|
||
|
||
def clear_all_particles(self):
|
||
"""清除所有粒子"""
|
||
if self.particle_manager:
|
||
self.particle_manager.clear_all_particles()
|
||
|
||
def create_fire_effect(self):
|
||
"""创建火焰效果"""
|
||
if self.particle_manager:
|
||
self.particle_manager.create_fire_effect()
|
||
|
||
def create_smoke_effect(self):
|
||
"""创建烟雾效果"""
|
||
if self.particle_manager:
|
||
self.particle_manager.create_smoke_effect()
|
||
|
||
def create_explosion_effect(self):
|
||
"""创建爆炸效果"""
|
||
if self.particle_manager:
|
||
self.particle_manager.create_explosion_effect()
|
||
|
||
def create_water_effect(self):
|
||
"""创建水花效果"""
|
||
if self.particle_manager:
|
||
self.particle_manager.create_water_effect()
|
||
|
||
def create_magic_effect(self):
|
||
"""创建魔法效果"""
|
||
if self.particle_manager:
|
||
self.particle_manager.create_magic_effect()
|
||
|
||
def create_snow_effect(self):
|
||
"""创建雪花效果"""
|
||
if self.particle_manager:
|
||
self.particle_manager.create_snow_effect()
|
||
|
||
def get_info(self) -> dict:
|
||
"""
|
||
获取插件信息
|
||
"""
|
||
info = super().get_info()
|
||
info.update({
|
||
"version": self.config.get("version", "1.0.0"),
|
||
"author": self.config.get("author", "EG Team"),
|
||
"description": self.config.get("description", "粒子系统插件"),
|
||
"particle_count": self.particle_manager.get_particle_count() if self.particle_manager else 0,
|
||
"active_emitters": self.particle_manager.get_emitter_count() if self.particle_manager else 0,
|
||
"is_enabled": self.is_enabled,
|
||
"is_initialized": self.is_initialized
|
||
})
|
||
return info
|
||
|
||
# 高级功能接口
|
||
def load_preset(self, preset_name: str):
|
||
"""加载预设效果"""
|
||
if self.preset_manager and self.particle_manager:
|
||
config = self.preset_manager.get_preset_config(preset_name)
|
||
if config:
|
||
# 在摄像机前方创建效果
|
||
camera_pos = self.plugin_manager.world.camera.getPos()
|
||
camera_forward = self.plugin_manager.world.camera.getNetTransform().getMat().getRow3(1)
|
||
position = camera_pos + camera_forward * 5
|
||
|
||
self.particle_manager.create_emitter(
|
||
config.get('emitter_type', 'default'),
|
||
position,
|
||
config
|
||
)
|
||
print(f"✓ 加载预设: {preset_name}")
|
||
else:
|
||
print(f"✗ 预设未找到: {preset_name}")
|
||
|
||
def save_current_as_preset(self, preset_name: str, description: str = ""):
|
||
"""保存当前效果为预设"""
|
||
if self.preset_manager and self.particle_editor:
|
||
config = self.particle_editor.get_current_config()
|
||
if config:
|
||
success = self.preset_manager.save_preset(
|
||
preset_name,
|
||
config,
|
||
description
|
||
)
|
||
if success:
|
||
print(f"✓ 保存预设: {preset_name}")
|
||
else:
|
||
print(f"✗ 保存预设失败: {preset_name}")
|
||
else:
|
||
print("✗ 没有可保存的配置")
|
||
|
||
def list_presets(self):
|
||
"""列出所有预设"""
|
||
if self.preset_manager:
|
||
presets = self.preset_manager.list_presets()
|
||
print("可用预设:")
|
||
for preset in presets:
|
||
print(f" - {preset}")
|
||
return presets
|
||
return []
|
||
|
||
def set_global_time_scale(self, scale: float):
|
||
"""设置全局时间缩放"""
|
||
if self.particle_manager:
|
||
self.particle_manager.set_global_time_scale(scale)
|
||
|
||
def set_max_particles(self, max_count: int):
|
||
"""设置最大粒子数"""
|
||
if self.particle_manager:
|
||
self.particle_manager.set_max_particles(max_count)
|
||
|
||
def set_emit_rate_multiplier(self, multiplier: float):
|
||
"""设置发射速率倍增器"""
|
||
if self.particle_manager:
|
||
self.particle_manager.set_emit_rate_multiplier(multiplier)
|
||
|
||
def set_particle_size_multiplier(self, multiplier: float):
|
||
"""设置粒子尺寸倍增器"""
|
||
if self.particle_manager:
|
||
self.particle_manager.set_particle_size_multiplier(multiplier) |