383 lines
13 KiB
Python
383 lines
13 KiB
Python
"""
|
|
Morphing和变形动画插件
|
|
完整的顶点变形、morphing目标、网格变形解决方案
|
|
"""
|
|
|
|
from plugins.plugin_manager import BasePlugin
|
|
from direct.showbase.DirectObject import DirectObject
|
|
|
|
# 导入核心模块
|
|
from .core import MorphingCore
|
|
from .advanced import AnimationStateMachine, AnimationCurveEditor, PhysicsAnimationIntegration
|
|
from .optimization import AnimationCompressor, AnimationLODSystem, AnimationCacheManager
|
|
from .network import AnimationNetworkSync
|
|
from .tools import AnimationAnalyzer, AnimationEditor, DebugVisualizer, AnimationProfiler
|
|
|
|
class MorphingAnimationPlugin(BasePlugin):
|
|
"""
|
|
Morphing和变形动画插件
|
|
提供完整的顶点变形、morphing目标、网格变形等高级动画功能
|
|
"""
|
|
|
|
def __init__(self, plugin_manager, name):
|
|
"""
|
|
初始化Morphing动画插件
|
|
:param plugin_manager: 插件管理器
|
|
:param name: 插件名称
|
|
"""
|
|
super().__init__(plugin_manager, name)
|
|
self.config = {
|
|
"version": "1.0.0",
|
|
"author": "Morphing Animation Team",
|
|
"description": "完整的顶点变形、morphing目标、网格变形解决方案"
|
|
}
|
|
|
|
# 核心系统组件
|
|
self.core_system = None
|
|
self.state_machine_system = None
|
|
self.curve_editor_system = None
|
|
self.physics_integration_system = None
|
|
self.compressor_system = None
|
|
self.lod_system = None
|
|
self.cache_manager_system = None
|
|
self.network_system = None
|
|
|
|
# 工具系统组件
|
|
self.analyzer_system = None
|
|
self.editor_system = None
|
|
self.visualizer_system = None
|
|
self.profiler_system = None
|
|
|
|
self.is_enabled = False
|
|
self.update_task = None
|
|
|
|
print(f"Morphing动画插件初始化: {self.name}")
|
|
|
|
def initialize(self) -> bool:
|
|
"""
|
|
初始化插件
|
|
:return: 是否初始化成功
|
|
"""
|
|
try:
|
|
world = self.plugin_manager.world
|
|
|
|
# 创建核心系统
|
|
self.core_system = MorphingCore(world)
|
|
|
|
# 创建高级功能系统
|
|
self.curve_editor_system = AnimationCurveEditor(self.core_system)
|
|
self.physics_integration_system = PhysicsAnimationIntegration(self.core_system)
|
|
|
|
# 创建优化系统
|
|
self.compressor_system = AnimationCompressor()
|
|
self.lod_system = AnimationLODSystem(world)
|
|
self.cache_manager_system = AnimationCacheManager()
|
|
|
|
# 创建网络同步系统
|
|
self.network_system = AnimationNetworkSync(world, self.core_system)
|
|
|
|
# 创建工具系统
|
|
self.analyzer_system = AnimationAnalyzer(self.core_system)
|
|
self.editor_system = AnimationEditor(self.core_system, self.curve_editor_system)
|
|
self.visualizer_system = DebugVisualizer(world, self.core_system)
|
|
self.profiler_system = AnimationProfiler(world, self.core_system)
|
|
|
|
print(f"Morphing动画插件初始化成功: {self.name}")
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"Morphing动画插件初始化失败: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
def enable(self) -> bool:
|
|
"""
|
|
启用插件
|
|
:return: 是否启用成功
|
|
"""
|
|
if not super().enable():
|
|
return False
|
|
|
|
if self.is_enabled:
|
|
print(f"Morphing动画插件已启用: {self.name}")
|
|
return True
|
|
|
|
try:
|
|
# 启动核心系统更新
|
|
self.core_system.start_updating()
|
|
|
|
# 启动曲线编辑器更新
|
|
self.curve_editor_system.start_updating()
|
|
|
|
# 启动物理集成系统更新
|
|
self.physics_integration_system.start_updating()
|
|
|
|
# 启动网络同步
|
|
self.network_system.start_sync_task()
|
|
|
|
# 启动工具系统更新
|
|
self.visualizer_system.is_visualizing = True
|
|
self.profiler_system.is_profiling = True
|
|
|
|
# 启动更新任务
|
|
self.update_task = self.plugin_manager.world.taskMgr.add(
|
|
self._update_task,
|
|
f"morphing_animation_update_{self.name}",
|
|
sort=35
|
|
)
|
|
|
|
# 标记为已启用
|
|
self.is_enabled = True
|
|
|
|
print(f"Morphing动画插件启用成功: {self.name}")
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"Morphing动画插件启用失败: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
def disable(self) -> bool:
|
|
"""
|
|
禁用插件
|
|
:return: 是否禁用成功
|
|
"""
|
|
if not super().disable():
|
|
return False
|
|
|
|
if self.is_enabled:
|
|
print(f"Morphing动画插件已禁用: {self.name}")
|
|
return True
|
|
|
|
try:
|
|
# 停止更新任务
|
|
if self.update_task:
|
|
self.plugin_manager.world.taskMgr.remove(self.update_task)
|
|
self.update_task = None
|
|
|
|
# 停止核心系统更新
|
|
self.core_system.stop_updating()
|
|
|
|
# 停止曲线编辑器更新
|
|
self.curve_editor_system.stop_updating()
|
|
|
|
# 停止物理集成系统更新
|
|
self.physics_integration_system.stop_updating()
|
|
|
|
# 停止网络同步
|
|
self.network_system.stop_sync_task()
|
|
|
|
# 停止工具系统更新
|
|
self.visualizer_system.is_visualizing = False
|
|
self.profiler_system.is_profiling = False
|
|
|
|
# 标记为已禁用
|
|
self.is_enabled = False
|
|
|
|
print(f"Morphing动画插件禁用成功: {self.name}")
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"Morphing动画插件禁用失败: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
def finalize(self) -> None:
|
|
"""
|
|
清理插件资源
|
|
"""
|
|
print(f"清理Morphing动画插件资源: {self.name}")
|
|
|
|
try:
|
|
# 停止更新任务
|
|
if self.update_task:
|
|
self.plugin_manager.world.taskMgr.remove(self.update_task)
|
|
self.update_task = None
|
|
|
|
# 停止所有系统
|
|
if self.core_system:
|
|
self.core_system.stop_updating()
|
|
if self.curve_editor_system:
|
|
self.curve_editor_system.stop_updating()
|
|
if self.physics_integration_system:
|
|
self.physics_integration_system.stop_updating()
|
|
if self.network_system:
|
|
self.network_system.stop_sync_task()
|
|
if self.visualizer_system:
|
|
self.visualizer_system.is_visualizing = False
|
|
if self.profiler_system:
|
|
self.profiler_system.is_profiling = False
|
|
|
|
# 清理资源
|
|
self.core_system = None
|
|
self.state_machine_system = None
|
|
self.curve_editor_system = None
|
|
self.physics_integration_system = None
|
|
self.compressor_system = None
|
|
self.lod_system = None
|
|
self.cache_manager_system = None
|
|
self.network_system = None
|
|
self.analyzer_system = None
|
|
self.editor_system = None
|
|
self.visualizer_system = None
|
|
self.profiler_system = None
|
|
|
|
print(f"Morphing动画插件资源清理完成: {self.name}")
|
|
|
|
except Exception as e:
|
|
print(f"清理Morphing动画插件资源失败: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
|
|
def _update_task(self, task) -> int:
|
|
"""
|
|
插件更新任务
|
|
:param task: 任务对象
|
|
:return: 任务状态
|
|
"""
|
|
try:
|
|
dt = globalClock.getDt()
|
|
|
|
# 更新核心系统
|
|
if self.core_system:
|
|
self.core_system.update(dt)
|
|
|
|
# 更新高级功能系统
|
|
if self.curve_editor_system:
|
|
self.curve_editor_system.update(dt)
|
|
|
|
# 更新物理集成系统
|
|
if self.physics_integration_system:
|
|
self.physics_integration_system.update(dt)
|
|
|
|
# 更新LOD系统
|
|
if self.lod_system and self.core_system:
|
|
self.lod_system.update_lod_levels(self.core_system.model_data)
|
|
|
|
# 更新工具系统
|
|
if self.visualizer_system:
|
|
self.visualizer_system.update(dt)
|
|
|
|
if self.profiler_system:
|
|
self.profiler_system.sample_performance(dt)
|
|
|
|
except Exception as e:
|
|
print(f"插件更新任务出错: {e}")
|
|
|
|
return task.cont
|
|
|
|
# 核心系统访问方法
|
|
def get_core_system(self):
|
|
"""
|
|
获取核心动画系统
|
|
:return: MorphingCore实例
|
|
"""
|
|
return self.core_system
|
|
|
|
def get_state_machine_system(self, model_id: str):
|
|
"""
|
|
获取动画状态机系统
|
|
:param model_id: 模型ID
|
|
:return: AnimationStateMachine实例
|
|
"""
|
|
if self.core_system:
|
|
if not self.state_machine_system:
|
|
self.state_machine_system = {}
|
|
if model_id not in self.state_machine_system:
|
|
self.state_machine_system[model_id] = AnimationStateMachine(self.core_system, model_id)
|
|
return self.state_machine_system[model_id]
|
|
return None
|
|
|
|
def get_curve_editor_system(self):
|
|
"""
|
|
获取曲线编辑器系统
|
|
:return: AnimationCurveEditor实例
|
|
"""
|
|
return self.curve_editor_system
|
|
|
|
def get_physics_integration_system(self):
|
|
"""
|
|
获取物理集成系统
|
|
:return: PhysicsAnimationIntegration实例
|
|
"""
|
|
return self.physics_integration_system
|
|
|
|
def get_compressor_system(self):
|
|
"""
|
|
获取压缩系统
|
|
:return: AnimationCompressor实例
|
|
"""
|
|
return self.compressor_system
|
|
|
|
def get_lod_system(self):
|
|
"""
|
|
获取LOD系统
|
|
:return: AnimationLODSystem实例
|
|
"""
|
|
return self.lod_system
|
|
|
|
def get_cache_manager_system(self):
|
|
"""
|
|
获取缓存管理系统
|
|
:return: AnimationCacheManager实例
|
|
"""
|
|
return self.cache_manager_system
|
|
|
|
def get_network_system(self):
|
|
"""
|
|
获取网络同步系统
|
|
:return: AnimationNetworkSync实例
|
|
"""
|
|
return self.network_system
|
|
|
|
# 工具系统访问方法
|
|
def get_analyzer_system(self):
|
|
"""
|
|
获取动画分析器系统
|
|
:return: AnimationAnalyzer实例
|
|
"""
|
|
return self.analyzer_system
|
|
|
|
def get_editor_system(self):
|
|
"""
|
|
获取动画编辑器系统
|
|
:return: AnimationEditor实例
|
|
"""
|
|
return self.editor_system
|
|
|
|
def get_visualizer_system(self):
|
|
"""
|
|
获取调试可视化工具系统
|
|
:return: DebugVisualizer实例
|
|
"""
|
|
return self.visualizer_system
|
|
|
|
def get_profiler_system(self):
|
|
"""
|
|
获取动画性能分析器系统
|
|
:return: AnimationProfiler实例
|
|
"""
|
|
return self.profiler_system
|
|
|
|
# 兼容性接口
|
|
Plugin = MorphingAnimationPlugin
|
|
|
|
__all__ = [
|
|
'MorphingAnimationPlugin',
|
|
'Plugin',
|
|
'MorphingCore',
|
|
'AnimationStateMachine',
|
|
'AnimationCurveEditor',
|
|
'PhysicsAnimationIntegration',
|
|
'AnimationCompressor',
|
|
'AnimationLODSystem',
|
|
'AnimationCacheManager',
|
|
'AnimationNetworkSync',
|
|
'AnimationAnalyzer',
|
|
'AnimationEditor',
|
|
'DebugVisualizer',
|
|
'AnimationProfiler'
|
|
] |