移除qt依赖
This commit is contained in:
parent
f07a394d9f
commit
33e62bd1e4
@ -1,271 +0,0 @@
|
||||
from panda3d.core import *
|
||||
from direct.interval.IntervalGlobal import *
|
||||
|
||||
class Env_Grid_Maker:
|
||||
def __init__(self, XYPlaneShow = True, XZPlaneShow = False, YZPlaneShow = False, endCapLinesShow = True, XSize = 50, YSize = 50, ZSize = 50, gridStep = 10, subdiv = 10):
|
||||
#Create line objects
|
||||
self.axisLines = LineSegs()
|
||||
self.gridLines = LineSegs()
|
||||
self.subdivLines = LineSegs()
|
||||
|
||||
#Init passed variables
|
||||
self.XSize = XSize
|
||||
self.YSize = YSize
|
||||
self.ZSize = ZSize
|
||||
self.gridStep = gridStep
|
||||
self.subdiv = subdiv
|
||||
|
||||
#Init default variables
|
||||
|
||||
#Plane and end cap line visibility (1 is show, 0 is hide)
|
||||
self.XYPlaneShow = XYPlaneShow
|
||||
self.XZPlaneShow = XZPlaneShow
|
||||
self.YZPlaneShow = YZPlaneShow
|
||||
self.endCapLinesShow = endCapLinesShow
|
||||
|
||||
#Alpha variables for each plane
|
||||
#self.XYPlaneAlpha = 1
|
||||
#self.XZPlaneAlpha = 1
|
||||
#self.YZPlaneAlpha = 1
|
||||
|
||||
#Colors (RGBA passed as a VBase4 object)
|
||||
self.XAxisColor = VBase4(1, 0, 0, 1)
|
||||
self.YAxisColor = VBase4(0, 1, 0, 1)
|
||||
self.ZAxisColor = VBase4(0, 0, 1, 1)
|
||||
self.gridColor = VBase4(1, 1, 1, 1)
|
||||
self.subdivColor = VBase4(.35, .35, .35, 1)
|
||||
|
||||
#Line thicknesses (in pixels)
|
||||
self.axisThickness = 3
|
||||
self.gridThickness = 1
|
||||
self.subdivThickness = 1
|
||||
|
||||
|
||||
def create(self):
|
||||
#Set line thicknesses
|
||||
self.axisLines.setThickness(self.axisThickness)
|
||||
self.gridLines.setThickness(self.gridThickness)
|
||||
self.subdivLines.setThickness(self.subdivThickness)
|
||||
|
||||
if(self.XSize != 0):
|
||||
#Draw X axis line
|
||||
self.axisLines.setColor(self.XAxisColor)
|
||||
self.axisLines.moveTo(-(self.XSize), 0, 0)
|
||||
self.axisLines.drawTo(self.XSize, 0, 0)
|
||||
|
||||
if(self.YSize != 0):
|
||||
#Draw Y axis line
|
||||
self.axisLines.setColor(self.YAxisColor)
|
||||
self.axisLines.moveTo(0, -(self.YSize), 0)
|
||||
self.axisLines.drawTo(0, self.YSize, 0)
|
||||
|
||||
if(self.ZSize != 0):
|
||||
#Draw Z axis line
|
||||
self.axisLines.setColor(self.ZAxisColor)
|
||||
self.axisLines.moveTo(0, 0, -(self.ZSize))
|
||||
self.axisLines.drawTo(0, 0, self.ZSize)
|
||||
|
||||
#Check to see if primary grid lines should be drawn at all
|
||||
if(self.gridStep != 0):
|
||||
|
||||
#Draw primary grid lines
|
||||
self.gridLines.setColor(self.gridColor)
|
||||
|
||||
#Draw primary grid lines metering x axis if any x-length
|
||||
if(self.XSize != 0):
|
||||
if((self.YSize != 0) and (self.XYPlaneShow)):
|
||||
#Draw y lines across x axis starting from center moving out
|
||||
#XY Plane
|
||||
for x in self.myfrange(0, self.XSize, self.gridStep):
|
||||
self.gridLines.moveTo(x, -(self.YSize), 0)
|
||||
self.gridLines.drawTo(x, self.YSize, 0)
|
||||
self.gridLines.moveTo(-x, -(self.YSize), 0)
|
||||
self.gridLines.drawTo(-x, self.YSize, 0)
|
||||
|
||||
if(self.endCapLinesShow):
|
||||
#Draw endcap lines
|
||||
self.gridLines.moveTo(self.XSize, -(self.YSize), 0)
|
||||
self.gridLines.drawTo(self.XSize, self.YSize, 0)
|
||||
self.gridLines.moveTo(-(self.XSize), -(self.YSize), 0)
|
||||
self.gridLines.drawTo(-(self.XSize), self.YSize, 0)
|
||||
|
||||
if((self.ZSize != 0) and (self.XZPlaneShow)):
|
||||
#Draw z lines across x axis starting from center moving out
|
||||
#XZ Plane
|
||||
for x in self.myfrange(0, self.XSize, self.gridStep):
|
||||
self.gridLines.moveTo(x, 0, -(self.ZSize))
|
||||
self.gridLines.drawTo(x, 0, self.ZSize)
|
||||
self.gridLines.moveTo(-x, 0, -(self.ZSize))
|
||||
self.gridLines.drawTo(-x, 0, self.ZSize)
|
||||
|
||||
if(self.endCapLinesShow):
|
||||
#Draw endcap lines
|
||||
self.gridLines.moveTo(self.XSize, 0, -(self.ZSize))
|
||||
self.gridLines.drawTo(self.XSize, 0, self.ZSize)
|
||||
self.gridLines.moveTo(-(self.XSize), 0, -(self.ZSize))
|
||||
self.gridLines.drawTo(-(self.XSize), 0, self.ZSize)
|
||||
|
||||
#Draw primary grid lines metering y axis if any y-length
|
||||
if(self.YSize != 0):
|
||||
|
||||
if((self.YSize != 0) and (self.XYPlaneShow)):
|
||||
#Draw x lines across y axis
|
||||
#XY Plane
|
||||
for y in self.myfrange(0, self.YSize, self.gridStep):
|
||||
self.gridLines.moveTo(-(self.XSize), y, 0)
|
||||
self.gridLines.drawTo(self.XSize, y, 0)
|
||||
self.gridLines.moveTo(-(self.XSize), -y, 0)
|
||||
self.gridLines.drawTo(self.XSize, -y, 0)
|
||||
|
||||
if(self.endCapLinesShow):
|
||||
#Draw endcap lines
|
||||
self.gridLines.moveTo(-(self.XSize), self.YSize, 0)
|
||||
self.gridLines.drawTo(self.XSize, self.YSize, 0)
|
||||
self.gridLines.moveTo(-(self.XSize), -(self.YSize), 0)
|
||||
self.gridLines.drawTo(self.XSize, -(self.YSize), 0)
|
||||
|
||||
if((self.ZSize != 0) and (self.YZPlaneShow)):
|
||||
#Draw z lines across y axis
|
||||
#YZ Plane
|
||||
for y in self.myfrange(0, self.YSize, self.gridStep):
|
||||
self.gridLines.moveTo(0, y, -(self.ZSize))
|
||||
self.gridLines.drawTo(0, y, self.ZSize)
|
||||
self.gridLines.moveTo(0, -y, -(self.ZSize))
|
||||
self.gridLines.drawTo(0, -y, self.ZSize)
|
||||
|
||||
if(self.endCapLinesShow):
|
||||
#Draw endcap lines
|
||||
self.gridLines.moveTo(0, self.YSize, -(self.ZSize))
|
||||
self.gridLines.drawTo(0, self.YSize, self.ZSize)
|
||||
self.gridLines.moveTo(0, -(self.YSize), -(self.ZSize))
|
||||
self.gridLines.drawTo(0, -(self.YSize), self.ZSize)
|
||||
|
||||
#Draw primary grid lines metering z axis if any z-length
|
||||
if(self.ZSize != 0):
|
||||
if((self.XSize != 0) and (self.XZPlaneShow)):
|
||||
#Draw x lines across z axis
|
||||
#XZ Plane
|
||||
for z in self.myfrange(0, self.ZSize, self.gridStep):
|
||||
self.gridLines.moveTo(-(self.XSize), 0, z)
|
||||
self.gridLines.drawTo(self.XSize, 0, z)
|
||||
self.gridLines.moveTo(-(self.XSize), 0, -z)
|
||||
self.gridLines.drawTo(self.XSize, 0, -z)
|
||||
|
||||
if(self.endCapLinesShow):
|
||||
#Draw endcap lines
|
||||
self.gridLines.moveTo(-(self.XSize), 0, self.ZSize)
|
||||
self.gridLines.drawTo(self.XSize, 0, self.ZSize)
|
||||
self.gridLines.moveTo(-(self.XSize), 0, -(self.ZSize))
|
||||
self.gridLines.drawTo(self.XSize, 0, -(self.ZSize))
|
||||
|
||||
if((self.YSize != 0) and (self.YZPlaneShow)):
|
||||
#Draw y lines across z axis
|
||||
#YZ Plane
|
||||
for z in self.myfrange(0, self.ZSize, self.gridStep):
|
||||
self.gridLines.moveTo(0, -(self.YSize), z)
|
||||
self.gridLines.drawTo(0, self.YSize, z)
|
||||
self.gridLines.moveTo(0, -(self.YSize), -z)
|
||||
self.gridLines.drawTo(0, self.YSize, -z)
|
||||
|
||||
if(self.endCapLinesShow):
|
||||
#Draw endcap lines
|
||||
self.gridLines.moveTo(0, -(self.YSize), self.ZSize)
|
||||
self.gridLines.drawTo(0, self.YSize, self.ZSize)
|
||||
self.gridLines.moveTo(0, -(self.YSize), -(self.ZSize))
|
||||
self.gridLines.drawTo(0, self.YSize, -(self.ZSize))
|
||||
|
||||
#Check to see if secondary grid lines should be drawn
|
||||
if(self.subdiv != 0):
|
||||
|
||||
#Draw secondary grid lines
|
||||
self.subdivLines.setColor(self.subdivColor)
|
||||
|
||||
if(self.XSize != 0):
|
||||
adjustedstep = self.gridStep / self.subdiv
|
||||
if((self.YSize != 0) and (self.XYPlaneShow)):
|
||||
#Draw y lines across x axis starting from center moving out
|
||||
#XY
|
||||
for x in self.myfrange(0, self.XSize, adjustedstep):
|
||||
self.subdivLines.moveTo(x, -(self.YSize), 0)
|
||||
self.subdivLines.drawTo(x, self.YSize, 0)
|
||||
self.subdivLines.moveTo(-x, -(self.YSize), 0)
|
||||
self.subdivLines.drawTo(-x, self.YSize, 0)
|
||||
|
||||
if((self.ZSize != 0) and (self.XZPlaneShow)):
|
||||
#Draw z lines across x axis starting from center moving out
|
||||
#XZ
|
||||
for x in self.myfrange(0, self.XSize, adjustedstep):
|
||||
self.subdivLines.moveTo(x, 0, -(self.ZSize))
|
||||
self.subdivLines.drawTo(x, 0, self.ZSize)
|
||||
self.subdivLines.moveTo(-x, 0, -(self.ZSize))
|
||||
self.subdivLines.drawTo(-x, 0, self.ZSize)
|
||||
|
||||
if(self.YSize != 0):
|
||||
if((self.YSize != 0) and (self.XYPlaneShow)):
|
||||
#Draw x lines across y axis
|
||||
#XY
|
||||
for y in self.myfrange(0, self.YSize, adjustedstep):
|
||||
self.subdivLines.moveTo(-(self.XSize), y, 0)
|
||||
self.subdivLines.drawTo(self.XSize, y, 0)
|
||||
self.subdivLines.moveTo(-(self.XSize), -y, 0)
|
||||
self.subdivLines.drawTo(self.XSize, -y, 0)
|
||||
if((self.ZSize != 0) and (self.YZPlaneShow)):
|
||||
#Draw z lines across y axis
|
||||
#YZ
|
||||
for y in self.myfrange(0, self.YSize, adjustedstep):
|
||||
self.subdivLines.moveTo(0, y, -(self.ZSize))
|
||||
self.subdivLines.drawTo(0, y, self.ZSize)
|
||||
self.subdivLines.moveTo(0, -y, -(self.ZSize))
|
||||
self.subdivLines.drawTo(0, -y, self.ZSize)
|
||||
|
||||
if(self.ZSize != 0):
|
||||
|
||||
if((self.XSize != 0) and (self.XZPlaneShow)):
|
||||
#Draw x lines across z axis
|
||||
#XZ
|
||||
for z in self.myfrange(0, self.ZSize, adjustedstep):
|
||||
self.subdivLines.moveTo(-(self.XSize), 0, z)
|
||||
self.subdivLines.drawTo(self.XSize, 0, z)
|
||||
self.subdivLines.moveTo(-(self.XSize), 0, -z)
|
||||
self.subdivLines.drawTo(self.XSize, 0, -z)
|
||||
|
||||
if((self.YSize != 0) and (self.YZPlaneShow)):
|
||||
#Draw y lines across z axis
|
||||
#YZ
|
||||
for z in self.myfrange(0, self.ZSize, adjustedstep):
|
||||
self.subdivLines.moveTo(0, -(self.YSize), z)
|
||||
self.subdivLines.drawTo(0, self.YSize, z)
|
||||
self.subdivLines.moveTo(0, -(self.YSize), -z)
|
||||
self.subdivLines.drawTo(0, self.YSize, -z)
|
||||
|
||||
#Create ThreeAxisGrid nodes and nodepaths
|
||||
#Create parent node and path
|
||||
self.parentNode = PandaNode('threeaxisgrid-parentnode')
|
||||
self.parentNodePath = NodePath(self.parentNode)
|
||||
|
||||
#Create axis lines node and path, then reparent
|
||||
self.axisLinesNode = self.axisLines.create()
|
||||
self.axisLinesNodePath = NodePath(self.axisLinesNode)
|
||||
self.axisLinesNodePath.reparentTo(self.parentNodePath)
|
||||
|
||||
#Create grid lines node and path, then reparent
|
||||
self.gridLinesNode = self.gridLines.create()
|
||||
self.gridLinesNodePath = NodePath(self.gridLinesNode)
|
||||
self.gridLinesNodePath.reparentTo(self.parentNodePath)
|
||||
|
||||
#Create subdivision lines node and path then reparent
|
||||
self.subdivLinesNode = self.subdivLines.create()
|
||||
self.subdivLinesNodePath = NodePath(self.subdivLinesNode)
|
||||
self.subdivLinesNodePath.reparentTo(self.parentNodePath)
|
||||
|
||||
return self.parentNodePath
|
||||
def myfrange(self, start, stop=None, step=None):
|
||||
if stop is None:
|
||||
stop = float(start)
|
||||
start = 0.0
|
||||
if step is None:
|
||||
step = 1.0
|
||||
cur = float(start)
|
||||
while cur < stop:
|
||||
yield cur
|
||||
cur += step
|
||||
@ -1,2 +0,0 @@
|
||||
name="QMeta3D"
|
||||
__all__ = ["Env_Grid_Maker"]
|
||||
@ -1,188 +0,0 @@
|
||||
import sys
|
||||
import os
|
||||
|
||||
from core.CustomMouseController import CustomMouseController
|
||||
|
||||
# 获取 RenderPipelineFile 的路径
|
||||
render_pipeline_path = './RenderPipelineFile'
|
||||
# 将该路径添加到 sys.path 中,确保 Python 能够找到它
|
||||
project_root = os.path.dirname(os.path.abspath(__file__))
|
||||
sys.path.insert(0, project_root)
|
||||
sys.path.insert(0, render_pipeline_path)
|
||||
|
||||
from RenderPipelineFile.rpcore import RenderPipeline
|
||||
_global_render_pipeline = None
|
||||
|
||||
from PyQt5.QtCore import *
|
||||
from PyQt5.QtGui import *
|
||||
from PyQt5.QtWidgets import *
|
||||
|
||||
from panda3d.core import *
|
||||
from panda3d.core import GraphicsOutput, Texture, ConfigVariableManager, WindowProperties
|
||||
|
||||
from direct.showbase.ShowBase import ShowBase
|
||||
import platform
|
||||
|
||||
from QMeta3D.QMouseWatcherNode import QMouseWatcherNode
|
||||
|
||||
from RenderPipelineFile.rpcore.render_target import RenderTarget
|
||||
__all__ = ["Meta3DWorld"]
|
||||
|
||||
_global_world_instance=None
|
||||
import builtins
|
||||
|
||||
|
||||
class Meta3DWorld(ShowBase):
|
||||
def __init__(self, width=1380, height=750, is_fullscreen=False, size=1.0, clear_color=LVecBase4f(0, 0.5, 0, 1),
|
||||
name="qMeta3D"):
|
||||
|
||||
global _global_world_instance
|
||||
global _global_render_pipeline
|
||||
|
||||
_global_world_instance = self
|
||||
|
||||
sort = -100
|
||||
self.parent = None
|
||||
|
||||
# 设置基本配置
|
||||
loadPrcFileData("", "show-frame-rate-meter 0")
|
||||
loadPrcFileData("", "window-type onscreen") # 改为正常窗口渲染
|
||||
loadPrcFileData("", f"win-size {width} {height}")
|
||||
loadPrcFileData("", "win-fixed-size #f") # 允许窗口调整大小
|
||||
|
||||
# 🚀 VR性能优化配置
|
||||
loadPrcFileData("", "prefer-single-buffer true") # 减少缓冲区交换开销
|
||||
loadPrcFileData("", "gl-force-flush false") # 避免强制glFlush导致的性能损失
|
||||
loadPrcFileData("", "sync-video false") # 禁用默认VSync,让OpenVR控制
|
||||
loadPrcFileData("", "support-stencil false") # 禁用不必要的模板缓冲区
|
||||
loadPrcFileData("", "clock-mode non-real-time")
|
||||
# loadPrcFileData("", "gl-debug true")
|
||||
|
||||
if (is_fullscreen):
|
||||
loadPrcFileData("", "fullscreen #t")
|
||||
|
||||
self.render_pipeline = RenderPipeline()
|
||||
self.render_pipeline.pre_showbase_init()
|
||||
|
||||
ShowBase.__init__(self)
|
||||
|
||||
# 初始化渲染管线并设置可调整大小的标志
|
||||
self.render_pipeline.create(self)
|
||||
_global_render_pipeline = self.render_pipeline
|
||||
|
||||
# 正常窗口渲染不需要额外的输出纹理
|
||||
# 注释掉离屏渲染相关的纹理创建
|
||||
# self.qt_output_tex = Texture("qt_output_tex")
|
||||
# self.qt_output_tex.set_format(Texture.F_rgba8)
|
||||
# self.qt_output_tex.set_component_type(Texture.T_unsigned_byte)
|
||||
# self.win.add_render_texture(self.qt_output_tex, GraphicsOutput.RTM_copy_ram)
|
||||
|
||||
#self.screenTexture = Texture()
|
||||
#self.screenTexture.setMinfilter(Texture.FTLinear)
|
||||
#self.screenTexture.setFormat(Texture.FRgba32)
|
||||
#self.screenTexture.set_wrap_u(Texture.WM_clamp)
|
||||
#self.screenTexture.set_wrap_v(Texture.WM_clamp)
|
||||
|
||||
# buff_size_x = int(self.win.get_x_size() * size)
|
||||
# buff_size_y = int(self.win.get_y_size() * size)
|
||||
# winprops = WindowProperties()
|
||||
# winprops.set_size(buff_size_x, buff_size_y)
|
||||
#
|
||||
#
|
||||
# props = FrameBufferProperties()
|
||||
# props.set_rgb_color(True)
|
||||
# props.set_rgba_bits(8, 8, 8, 8)
|
||||
# props.set_depth_bits(8)
|
||||
|
||||
# self.buff = self.graphicsEngine.make_output(
|
||||
# self.pipe, name, sort,
|
||||
# props, winprops,
|
||||
# GraphicsPipe.BF_resizeable,
|
||||
# self.win.get_gsg(), self.win)
|
||||
|
||||
#self.screenTexture = render_pipeline._final_stage.target.color_tex
|
||||
|
||||
#self.buff.addRenderTexture(self.screenTexture, GraphicsOutput.RTMCopyRam)
|
||||
# self.buff.set_sort(sort)
|
||||
|
||||
|
||||
|
||||
#self.cam = self.makeCamera(self.buff)
|
||||
#self.render_pipeline._showbase.cam=self.makeCamera(self.buff)
|
||||
|
||||
#self.render_pipeline._showbase.cam=self.makeCamera(self.buff)
|
||||
|
||||
#self.render_pipeline._showbase.camera.reparentTo(self.render)
|
||||
#base.camera.reparentTo(self.render)
|
||||
#self.cam.reparentTo(self.render) # 可选同步
|
||||
|
||||
#render_pipeline.set_camera(self.cam)
|
||||
|
||||
#添加渲染效果
|
||||
#self.cam = self.render_pipeline._showbase.cam
|
||||
#self.camNode = self.cam.node()
|
||||
#self.camLens = self.camNode.get_lens()
|
||||
self.render_pipeline._showbase.camera = self.render_pipeline._showbase.cam
|
||||
#self.render_pipeline.daytime_mgr.update()
|
||||
|
||||
|
||||
# if clear_color is None:
|
||||
# self.buff.set_clear_active(GraphicsOutput.RTPColor, False)
|
||||
# else:
|
||||
# self.buff.set_clear_color(clear_color)
|
||||
# self.buff.set_clear_active(GraphicsOutput.RTPColor, True)
|
||||
|
||||
# self.disableMouse()
|
||||
self.mouse_controller = CustomMouseController(self)
|
||||
self.mouse_controller.setUp()
|
||||
|
||||
# 添加错误处理钩子
|
||||
self.accept("transform_state_error", self._handle_transform_error)
|
||||
|
||||
def _handle_transform_error(self):
|
||||
"""处理TransformState相关的错误"""
|
||||
try:
|
||||
from panda3d.core import TransformState, RenderState
|
||||
TransformState.clear_cache()
|
||||
RenderState.clear_cache()
|
||||
print("已清理TransformState和RenderState缓存")
|
||||
except Exception as e:
|
||||
print(f"清理缓存时出错: {e}")
|
||||
|
||||
def render_pipeline(self):
|
||||
"""获取 RenderPipeline 实例"""
|
||||
return self._render_pipeline
|
||||
|
||||
|
||||
def set_parent(self, parent: QWidget):
|
||||
self.parent = parent
|
||||
self.mouseWatcherNode = QMouseWatcherNode(parent)
|
||||
|
||||
def getAspectRatio(self, win = None):
|
||||
if win is None and self.parent is not None:
|
||||
return float(self.parent.width()) / float(self.parent.height())
|
||||
else:
|
||||
return super().getAspectRatio(win)
|
||||
|
||||
def get_render_pipeline():
|
||||
"""获取全局 RenderPipeline 单例"""
|
||||
if _global_render_pipeline is None:
|
||||
raise RuntimeError(
|
||||
"RenderPipeline has not been initialized yet. Please create a 3DWorld instance first.")
|
||||
return _global_render_pipeline
|
||||
|
||||
def resize_buffer(self, width: int, height: int):
|
||||
props = WindowProperties()
|
||||
props.set_size(width, height)
|
||||
self.win.request_properties(props)
|
||||
|
||||
# 重新分配输出贴图的大小
|
||||
self.qt_output_tex.set_x_size(width)
|
||||
self.qt_output_tex.set_y_size(height)
|
||||
|
||||
# 更新 lens 的 aspect ratio
|
||||
if self.camLens:
|
||||
self.camLens.set_film_size(width, height) # 或 set_aspect_ratio(width / height)
|
||||
|
||||
# 强制更新窗口(有时在 Qt 内嵌时需要)
|
||||
self.graphicsEngine.open_windows()
|
||||
@ -1,236 +0,0 @@
|
||||
from PyQt5 import QtWidgets, QtGui
|
||||
from PyQt5.QtCore import *
|
||||
from PyQt5.QtGui import *
|
||||
from PyQt5.QtWidgets import *
|
||||
from direct.task.TaskManagerGlobal import taskMgr
|
||||
|
||||
from QMeta3D.QMeta3D_Buttons_Translation import QMeta3D_Button_translation
|
||||
from QMeta3D.QMeta3D_Keys_Translation import QMeta3D_Key_translation
|
||||
from QMeta3D.QMeta3D_Modifiers_Translation import QMeta3D_Modifier_translation
|
||||
|
||||
__all__ = ["QMeta3DWidget"]
|
||||
|
||||
|
||||
class QMeta3DSynchronizer(QTimer):
|
||||
def __init__(self, qMeta3DWidget, FPS=60):
|
||||
QTimer.__init__(self)
|
||||
self.qMeta3DWidget = qMeta3DWidget
|
||||
dt = 1000 / FPS
|
||||
self.setInterval(int(dt))
|
||||
self.timeout.connect(self.tick)
|
||||
|
||||
def tick(self):
|
||||
try:
|
||||
# 在渲染前清理可能损坏的TransformState对象
|
||||
from panda3d.core import TransformState
|
||||
TransformState.clear_cache()
|
||||
|
||||
taskMgr.step()
|
||||
self.qMeta3DWidget.update()
|
||||
except AssertionError as e:
|
||||
# 专门处理 TransformState has_mat() 断言错误
|
||||
if "has_mat" in str(e):
|
||||
print(f"警告: 检测到TransformState断言错误,已静默处理: {e}")
|
||||
# 尝试恢复渲染状态
|
||||
try:
|
||||
# 强制清理缓存并重试
|
||||
from panda3d.core import TransformState, RenderState
|
||||
TransformState.clear_cache()
|
||||
RenderState.clear_cache()
|
||||
taskMgr.step()
|
||||
self.qMeta3DWidget.update()
|
||||
except:
|
||||
pass
|
||||
else:
|
||||
# 重新抛出其他断言错误
|
||||
raise
|
||||
except Exception as e:
|
||||
# 静默处理其他所有异常
|
||||
print(f"警告: 检测到异常,已静默处理: {e}")
|
||||
|
||||
|
||||
def get_panda_key_modifiers(evt):
|
||||
panda_mods = []
|
||||
qt_mods = evt.modifiers()
|
||||
for qt_mod, panda_mod in QMeta3D_Modifier_translation.items():
|
||||
if (qt_mods & qt_mod) == qt_mod:
|
||||
panda_mods.append(panda_mod)
|
||||
return panda_mods
|
||||
|
||||
|
||||
def get_panda_key_modifiers_prefix(evt):
|
||||
# join all modifiers (except NoModifier, which is None) with '-'
|
||||
prefix = "-".join([mod for mod in get_panda_key_modifiers(evt) if mod is not None])
|
||||
|
||||
# if the prefix is not empty, append a '-'
|
||||
if prefix:
|
||||
prefix += '-'
|
||||
|
||||
return prefix
|
||||
|
||||
|
||||
class QMeta3DWidget(QWidget):
|
||||
def __init__(self, Meta3DWorld, parent=None, FPS=60, debug=False):
|
||||
QWidget.__init__(self, parent)
|
||||
self.rp_sync_requested = False
|
||||
# set fixed geometry
|
||||
self.Meta3DWorld = Meta3DWorld
|
||||
self.Meta3DWorld.set_parent(self)
|
||||
# Setup a timer in Qt that runs taskMgr.step() to simulate Panda's own main loop
|
||||
# pandaTimer = QTimer(self)
|
||||
# pandaTimer.timeout.connect()
|
||||
# pandaTimer.start(0)
|
||||
|
||||
self.setFocusPolicy(Qt.StrongFocus)
|
||||
|
||||
# Setup another timer that redraws this widget in a specific FPS
|
||||
# redrawTimer = QTimer(self)
|
||||
# redrawTimer.timeout.connect(self.update)
|
||||
# redrawTimer.start(1000/FPS)
|
||||
|
||||
self.paintSurface = QPainter()
|
||||
self.rotate = QTransform()
|
||||
self.rotate.rotate(180)
|
||||
self.out_image = QImage()
|
||||
|
||||
size = self.Meta3DWorld.cam.node().get_lens().get_film_size()
|
||||
self.initial_film_size = QSizeF(size.x, size.y)
|
||||
self.initial_size = self.size()
|
||||
|
||||
self.synchronizer = QMeta3DSynchronizer(self, FPS)
|
||||
self.synchronizer.start()
|
||||
|
||||
self.debug = debug
|
||||
|
||||
def mousePressEvent(self, evt):
|
||||
button = evt.button()
|
||||
try:
|
||||
b = "{}{}".format(get_panda_key_modifiers_prefix(evt), QMeta3D_Button_translation[button])
|
||||
if self.debug:
|
||||
print(b)
|
||||
messenger.send(b,[{"x":evt.x(),"y":evt.y()}])
|
||||
except:
|
||||
print("Unimplemented button. Please send an issue on github to fix this problem")
|
||||
|
||||
def mouseMoveEvent(self, evt:QtGui.QMouseEvent):
|
||||
button = evt.button()
|
||||
try:
|
||||
b = "mouse-move"
|
||||
if self.debug:
|
||||
print(b)
|
||||
messenger.send(b,[{"x":evt.x(),"y":evt.y()}])
|
||||
except:
|
||||
print("Unimplemented button. Please send an issue on github to fix this problem")
|
||||
|
||||
|
||||
def mouseReleaseEvent(self, evt):
|
||||
button = evt.button()
|
||||
try:
|
||||
b = "{}{}-up".format(get_panda_key_modifiers_prefix(evt), QMeta3D_Button_translation[button])
|
||||
if self.debug:
|
||||
print(b)
|
||||
messenger.send(b,[{"x":evt.x(),"y":evt.y()}])
|
||||
except:
|
||||
print("Unimplemented button. Please send an issue on github to fix this problem")
|
||||
|
||||
def wheelEvent(self, evt):
|
||||
delta = evt.angleDelta().y()
|
||||
try:
|
||||
if self.debug:
|
||||
print(f"wheel {delta}")
|
||||
messenger.send('wheel',[{"delta":delta}])
|
||||
except:
|
||||
print("Unimplemented button. Please send an issue on github to fix this problem")
|
||||
|
||||
def keyPressEvent(self, evt):
|
||||
key = evt.key()
|
||||
try:
|
||||
k = "{}{}".format(get_panda_key_modifiers_prefix(evt), QMeta3D_Key_translation[key])
|
||||
if self.debug:
|
||||
print(k)
|
||||
messenger.send(k)
|
||||
except:
|
||||
print("Unimplemented key. Please send an issue on github to fix this problem")
|
||||
|
||||
def keyReleaseEvent(self, evt):
|
||||
key = evt.key()
|
||||
try:
|
||||
k = "{}{}-up".format(get_panda_key_modifiers_prefix(evt), QMeta3D_Key_translation[key])
|
||||
if self.debug:
|
||||
print(k)
|
||||
messenger.send(k)
|
||||
except:
|
||||
print("Unimplemented key. Please send an issue on github to fix this problem")
|
||||
|
||||
def resizeEvent(self, evt):
|
||||
width = evt.size().width()
|
||||
height = evt.size().height()
|
||||
#print(f"width:{width}")
|
||||
#print(f"height:{height}")
|
||||
|
||||
from Meta3DWorld import resize_buffer
|
||||
|
||||
lens = self.Meta3DWorld.cam.node().get_lens()
|
||||
|
||||
def minimumSizeHint(self):
|
||||
return QSize(400, 300)
|
||||
|
||||
def paintEvent(self, event):
|
||||
# 正常窗口渲染模式下,Panda3D 会直接渲染到窗口
|
||||
# 不需要从纹理复制数据
|
||||
# 只需要确保渲染循环继续运行
|
||||
|
||||
# 触发一次渲染更新
|
||||
if hasattr(self.Meta3DWorld, 'win') and self.Meta3DWorld.win:
|
||||
# 确保窗口大小匹配
|
||||
width = self.width()
|
||||
height = self.height()
|
||||
|
||||
# 如果窗口大小不匹配,更新窗口属性
|
||||
if (self.Meta3DWorld.win.get_x_size() != width or
|
||||
self.Meta3DWorld.win.get_y_size() != height):
|
||||
from panda3d.core import WindowProperties
|
||||
props = WindowProperties()
|
||||
props.setSize(width, height)
|
||||
self.Meta3DWorld.win.request_properties(props)
|
||||
|
||||
# 继续下一次更新
|
||||
self.update()
|
||||
|
||||
def sync_Meta3d_window_size(self, width, height):
|
||||
try:
|
||||
from panda3d.core import WindowProperties
|
||||
|
||||
# 更新窗口属性
|
||||
props = WindowProperties()
|
||||
props.setSize(width, height)
|
||||
|
||||
# 对于正常窗口渲染,直接更新窗口属性
|
||||
if self.Meta3DWorld.win:
|
||||
self.Meta3DWorld.win.request_properties(props)
|
||||
|
||||
# 如果使用 RenderPipeline,更新相关设置
|
||||
if hasattr(self.Meta3DWorld, 'render_pipeline'):
|
||||
try:
|
||||
from RenderPipelineFile.rpcore.globals import Globals
|
||||
from panda3d.core import LVecBase2i
|
||||
|
||||
# 更新全局分辨率
|
||||
Globals.native_resolution = LVecBase2i(width, height)
|
||||
|
||||
# 重新计算渲染分辨率
|
||||
self.Meta3DWorld.render_pipeline._compute_render_resolution()
|
||||
|
||||
# 通知各个管理器处理尺寸变化
|
||||
self.Meta3DWorld.render_pipeline.light_mgr.compute_tile_size()
|
||||
self.Meta3DWorld.render_pipeline.stage_mgr.handle_window_resize()
|
||||
|
||||
if hasattr(self.Meta3DWorld.render_pipeline, 'debugger'):
|
||||
self.Meta3DWorld.render_pipeline.debugger.handle_window_resize()
|
||||
|
||||
# 触发插件的窗口尺寸变化钩子
|
||||
self.Meta3DWorld.render_pipeline.plugin_mgr.trigger_hook("window_resized")
|
||||
except Exception as rp_e:
|
||||
print(f"RenderPipeline 尺寸更新失败: {rp_e}")
|
||||
except Exception as e:
|
||||
print(f"同步 Meta3D 窗口尺寸失败: {str(e)}")
|
||||
@ -1,43 +0,0 @@
|
||||
from PyQt5.QtCore import *
|
||||
from PyQt5.QtGui import *
|
||||
from PyQt5.QtWidgets import *
|
||||
import sys
|
||||
__all__ = ["QMeta3D_Keys_Translation.py"]
|
||||
|
||||
QMeta3D_Button_translation ={
|
||||
Qt.NoButton:'',
|
||||
Qt.AllButtons:'unknown',
|
||||
Qt.LeftButton:'mouse1',
|
||||
Qt.RightButton:'mouse2',
|
||||
Qt.MidButton:'mouse3',
|
||||
Qt.MiddleButton:'mouse3',
|
||||
Qt.BackButton:'unknown',
|
||||
Qt.XButton1:'unknown',
|
||||
Qt.ExtraButton1:'unknown',
|
||||
Qt.ForwardButton:'unknown',
|
||||
Qt.XButton2:'unknown',
|
||||
Qt.ExtraButton2:'unknown',
|
||||
Qt.TaskButton:'unknown',
|
||||
Qt.ExtraButton3:'unknown',
|
||||
Qt.ExtraButton4:'unknown',
|
||||
Qt.ExtraButton5:'unknown',
|
||||
Qt.ExtraButton6:'unknown',
|
||||
Qt.ExtraButton7:'unknown',
|
||||
Qt.ExtraButton8:'unknown',
|
||||
Qt.ExtraButton9:'unknown',
|
||||
Qt.ExtraButton10:'unknown',
|
||||
Qt.ExtraButton11:'unknown',
|
||||
Qt.ExtraButton12:'unknown',
|
||||
Qt.ExtraButton13:'unknown',
|
||||
Qt.ExtraButton14:'unknown',
|
||||
Qt.ExtraButton15:'unknown',
|
||||
Qt.ExtraButton16:'unknown',
|
||||
Qt.ExtraButton17:'unknown',
|
||||
Qt.ExtraButton18:'unknown',
|
||||
Qt.ExtraButton19:'unknown',
|
||||
Qt.ExtraButton20:'unknown',
|
||||
Qt.ExtraButton21:'unknown',
|
||||
Qt.ExtraButton22:'unknown',
|
||||
Qt.ExtraButton23:'unknown',
|
||||
Qt.ExtraButton24:'unknown',
|
||||
}
|
||||
@ -1,477 +0,0 @@
|
||||
from PyQt5.QtCore import *
|
||||
from PyQt5.QtGui import *
|
||||
from PyQt5.QtWidgets import *
|
||||
import sys
|
||||
__all__ = ["QMeta3D_Keys_Translation.py"]
|
||||
|
||||
QMeta3D_Key_translation ={
|
||||
Qt.Key_0:'0',
|
||||
Qt.Key_1:'1',
|
||||
Qt.Key_2:'2',
|
||||
Qt.Key_3:'3',
|
||||
Qt.Key_4:'4',
|
||||
Qt.Key_5:'5',
|
||||
Qt.Key_6:'6',
|
||||
Qt.Key_7:'7',
|
||||
Qt.Key_8:'8',
|
||||
Qt.Key_9:'9',
|
||||
Qt.Key_A:'a',
|
||||
Qt.Key_AE:'ae',
|
||||
Qt.Key_Aacute:'unknown',
|
||||
Qt.Key_Acircumflex:'unknown',
|
||||
Qt.Key_AddFavorite:'unknown',
|
||||
Qt.Key_Adiaeresis:'unknown',
|
||||
Qt.Key_Agrave:'unknown',
|
||||
Qt.Key_Alt:'lalt',
|
||||
Qt.Key_AltGr:'unknown',
|
||||
Qt.Key_Ampersand:'unknown',
|
||||
Qt.Key_Any:'unknown',
|
||||
Qt.Key_Apostrophe:'unknown',
|
||||
Qt.Key_ApplicationLeft:'unknown',
|
||||
Qt.Key_ApplicationRight:'unknown',
|
||||
Qt.Key_Aring:'unknown',
|
||||
Qt.Key_AsciiCircum:'unknown',
|
||||
Qt.Key_AsciiTilde:'unknown',
|
||||
Qt.Key_Asterisk:'unknown',
|
||||
Qt.Key_At:'unknown',
|
||||
Qt.Key_Atilde:'unknown',
|
||||
Qt.Key_AudioCycleTrack:'unknown',
|
||||
Qt.Key_AudioForward:'unknown',
|
||||
Qt.Key_AudioRandomPlay:'unknown',
|
||||
Qt.Key_AudioRepeat:'unknown',
|
||||
Qt.Key_AudioRewind:'unknown',
|
||||
Qt.Key_Away:'unknown',
|
||||
Qt.Key_B:'b',
|
||||
Qt.Key_Back:'unknown',
|
||||
Qt.Key_BackForward:'unknown',
|
||||
Qt.Key_Backslash:'unknown',
|
||||
Qt.Key_Backspace:'unknown',
|
||||
Qt.Key_Backtab:'unknown',
|
||||
Qt.Key_Bar:'unknown',
|
||||
Qt.Key_BassBoost:'unknown',
|
||||
Qt.Key_BassDown:'unknown',
|
||||
Qt.Key_BassUp:'unknown',
|
||||
Qt.Key_Battery:'unknown',
|
||||
Qt.Key_Blue:'unknown',
|
||||
Qt.Key_Bluetooth:'unknown',
|
||||
Qt.Key_Book:'unknown',
|
||||
Qt.Key_BraceLeft:'unknown',
|
||||
Qt.Key_BraceRight:'unknown',
|
||||
Qt.Key_BracketLeft:'unknown',
|
||||
Qt.Key_BracketRight:'unknown',
|
||||
Qt.Key_BrightnessAdjust:'unknown',
|
||||
Qt.Key_C:'c',
|
||||
Qt.Key_CD:'unknown',
|
||||
Qt.Key_Calculator:'unknown',
|
||||
Qt.Key_Calendar:'unknown',
|
||||
Qt.Key_Call:'unknown',
|
||||
Qt.Key_Camera:'unknown',
|
||||
Qt.Key_CameraFocus:'unknown',
|
||||
Qt.Key_Cancel:'unknown',
|
||||
Qt.Key_CapsLock:'unknown',
|
||||
Qt.Key_Ccedilla:'unknown',
|
||||
Qt.Key_ChannelDown:'unknown',
|
||||
Qt.Key_ChannelUp:'unknown',
|
||||
Qt.Key_Clear:'unknown',
|
||||
Qt.Key_ClearGrab:'unknown',
|
||||
Qt.Key_Close:'unknown',
|
||||
Qt.Key_Codeinput:'unknown',
|
||||
Qt.Key_Colon:'unknown',
|
||||
Qt.Key_Comma:'unknown',
|
||||
Qt.Key_Community:'unknown',
|
||||
Qt.Key_Context1:'unknown',
|
||||
Qt.Key_Context2:'unknown',
|
||||
Qt.Key_Context3:'unknown',
|
||||
Qt.Key_Context4:'unknown',
|
||||
Qt.Key_ContrastAdjust:'unknown',
|
||||
Qt.Key_Control:'control',
|
||||
Qt.Key_Copy:'unknown',
|
||||
Qt.Key_Cut:'unknown',
|
||||
Qt.Key_D:'d',
|
||||
Qt.Key_DOS:'unknown',
|
||||
Qt.Key_Dead_A:'unknown',
|
||||
Qt.Key_Dead_Abovecomma:'unknown',
|
||||
Qt.Key_Dead_Abovedot:'unknown',
|
||||
Qt.Key_Dead_Abovereversedcomma:'unknown',
|
||||
Qt.Key_Dead_Abovering:'unknown',
|
||||
Qt.Key_Dead_Aboveverticalline:'unknown',
|
||||
Qt.Key_Dead_Acute:'unknown',
|
||||
Qt.Key_Dead_Belowbreve:'unknown',
|
||||
Qt.Key_Dead_Belowcircumflex:'unknown',
|
||||
Qt.Key_Dead_Belowcomma:'unknown',
|
||||
Qt.Key_Dead_Belowdiaeresis:'unknown',
|
||||
Qt.Key_Dead_Belowdot:'unknown',
|
||||
Qt.Key_Dead_Belowmacron:'unknown',
|
||||
Qt.Key_Dead_Belowring:'unknown',
|
||||
Qt.Key_Dead_Belowtilde:'unknown',
|
||||
Qt.Key_Dead_Belowverticalline:'unknown',
|
||||
Qt.Key_Dead_Breve:'unknown',
|
||||
Qt.Key_Dead_Capital_Schwa:'unknown',
|
||||
Qt.Key_Dead_Caron:'unknown',
|
||||
Qt.Key_Dead_Cedilla:'unknown',
|
||||
Qt.Key_Dead_Circumflex:'unknown',
|
||||
Qt.Key_Dead_Currency:'unknown',
|
||||
Qt.Key_Dead_Diaeresis:'unknown',
|
||||
Qt.Key_Dead_Doubleacute:'unknown',
|
||||
Qt.Key_Dead_Doublegrave:'unknown',
|
||||
Qt.Key_Dead_E:'unknown',
|
||||
Qt.Key_Dead_Grave:'unknown',
|
||||
Qt.Key_Dead_Greek:'unknown',
|
||||
Qt.Key_Dead_Hook:'unknown',
|
||||
Qt.Key_Dead_Horn:'unknown',
|
||||
Qt.Key_Dead_I:'unknown',
|
||||
Qt.Key_Dead_Invertedbreve:'unknown',
|
||||
Qt.Key_Dead_Iota:'unknown',
|
||||
Qt.Key_Dead_Longsolidusoverlay:'unknown',
|
||||
Qt.Key_Dead_Lowline:'unknown',
|
||||
Qt.Key_Dead_Macron:'unknown',
|
||||
Qt.Key_Dead_O:'unknown',
|
||||
Qt.Key_Dead_Ogonek:'unknown',
|
||||
Qt.Key_Dead_Semivoiced_Sound:'unknown',
|
||||
Qt.Key_Dead_Small_Schwa:'unknown',
|
||||
Qt.Key_Dead_Stroke:'unknown',
|
||||
Qt.Key_Dead_Tilde:'unknown',
|
||||
Qt.Key_Dead_U:'unknown',
|
||||
Qt.Key_Dead_Voiced_Sound:'unknown',
|
||||
Qt.Key_Dead_a:'unknown',
|
||||
Qt.Key_Dead_e:'unknown',
|
||||
Qt.Key_Dead_i:'unknown',
|
||||
Qt.Key_Dead_o:'unknown',
|
||||
Qt.Key_Dead_u:'unknown',
|
||||
Qt.Key_Delete:'delete',
|
||||
Qt.Key_Direction_L:'unknown',
|
||||
Qt.Key_Direction_R:'unknown',
|
||||
Qt.Key_Display:'unknown',
|
||||
Qt.Key_Documents:'unknown',
|
||||
Qt.Key_Dollar:'unknown',
|
||||
Qt.Key_Down:'arrow_down',
|
||||
Qt.Key_E:'e',
|
||||
Qt.Key_ETH:'unknown',
|
||||
Qt.Key_Eacute:'unknown',
|
||||
Qt.Key_Ecircumflex:'unknown',
|
||||
Qt.Key_Ediaeresis:'unknown',
|
||||
Qt.Key_Egrave:'unknown',
|
||||
Qt.Key_Eisu_Shift:'unknown',
|
||||
Qt.Key_Eisu_toggle:'unknown',
|
||||
Qt.Key_Eject:'unknown',
|
||||
Qt.Key_End:'unknown',
|
||||
Qt.Key_Enter:'unknown',
|
||||
Qt.Key_Equal:'unknown',
|
||||
Qt.Key_Escape:'escape',
|
||||
Qt.Key_Excel:'unknown',
|
||||
Qt.Key_Exclam:'unknown',
|
||||
Qt.Key_Execute:'unknown',
|
||||
Qt.Key_Exit:'unknown',
|
||||
Qt.Key_Explorer:'unknown',
|
||||
Qt.Key_F:'f',
|
||||
Qt.Key_F1:'f1',
|
||||
Qt.Key_F10:'f10',
|
||||
Qt.Key_F11:'f11',
|
||||
Qt.Key_F12:'f12',
|
||||
Qt.Key_F13:'f13',
|
||||
Qt.Key_F14:'f14',
|
||||
Qt.Key_F15:'f15',
|
||||
Qt.Key_F16:'f16',
|
||||
Qt.Key_F17:'f17',
|
||||
Qt.Key_F18:'f18',
|
||||
Qt.Key_F19:'unknown',
|
||||
Qt.Key_F2:'unknown',
|
||||
Qt.Key_F20:'unknown',
|
||||
Qt.Key_F21:'unknown',
|
||||
Qt.Key_F22:'unknown',
|
||||
Qt.Key_F23:'unknown',
|
||||
Qt.Key_F24:'unknown',
|
||||
Qt.Key_F25:'unknown',
|
||||
Qt.Key_F26:'unknown',
|
||||
Qt.Key_F27:'unknown',
|
||||
Qt.Key_F28:'unknown',
|
||||
Qt.Key_F29:'unknown',
|
||||
Qt.Key_F3:'f3',
|
||||
Qt.Key_F30:'unknown',
|
||||
Qt.Key_F31:'unknown',
|
||||
Qt.Key_F32:'unknown',
|
||||
Qt.Key_F33:'unknown',
|
||||
Qt.Key_F34:'unknown',
|
||||
Qt.Key_F35:'unknown',
|
||||
Qt.Key_F4:'f4',
|
||||
Qt.Key_F5:'f5',
|
||||
Qt.Key_F6:'f6',
|
||||
Qt.Key_F7:'f7',
|
||||
Qt.Key_F8:'f8',
|
||||
Qt.Key_F9:'f9',
|
||||
Qt.Key_Favorites:'unknown',
|
||||
Qt.Key_Finance:'unknown',
|
||||
Qt.Key_Find:'unknown',
|
||||
Qt.Key_Flip:'unknown',
|
||||
Qt.Key_Forward:'unknown',
|
||||
Qt.Key_G:'g',
|
||||
Qt.Key_Game:'unknown',
|
||||
Qt.Key_Go:'unknown',
|
||||
Qt.Key_Greater:'unknown',
|
||||
Qt.Key_Green:'unknown',
|
||||
Qt.Key_Guide:'unknown',
|
||||
Qt.Key_H:'h',
|
||||
Qt.Key_Hangul:'unknown',
|
||||
Qt.Key_Hangul_Banja:'unknown',
|
||||
Qt.Key_Hangul_End:'unknown',
|
||||
Qt.Key_Hangul_Hanja:'unknown',
|
||||
Qt.Key_Hangul_Jamo:'unknown',
|
||||
Qt.Key_Hangul_Jeonja:'unknown',
|
||||
Qt.Key_Hangul_PostHanja:'unknown',
|
||||
Qt.Key_Hangul_PreHanja:'unknown',
|
||||
Qt.Key_Hangul_Romaja:'unknown',
|
||||
Qt.Key_Hangul_Special:'unknown',
|
||||
Qt.Key_Hangul_Start:'unknown',
|
||||
Qt.Key_Hangup:'unknown',
|
||||
Qt.Key_Hankaku:'unknown',
|
||||
Qt.Key_Help:'unknown',
|
||||
Qt.Key_Henkan:'unknown',
|
||||
Qt.Key_Hibernate:'unknown',
|
||||
Qt.Key_Hiragana:'unknown',
|
||||
Qt.Key_Hiragana_Katakana:'unknown',
|
||||
Qt.Key_History:'unknown',
|
||||
Qt.Key_Home:'home',
|
||||
Qt.Key_HomePage:'unknown',
|
||||
Qt.Key_HotLinks:'unknown',
|
||||
Qt.Key_Hyper_L:'unknown',
|
||||
Qt.Key_Hyper_R:'unknown',
|
||||
Qt.Key_I:'i',
|
||||
Qt.Key_Iacute:'unknown',
|
||||
Qt.Key_Icircumflex:'unknown',
|
||||
Qt.Key_Idiaeresis:'unknown',
|
||||
Qt.Key_Igrave:'unknown',
|
||||
Qt.Key_Info:'unknown',
|
||||
Qt.Key_Insert:'unknown',
|
||||
Qt.Key_J:'j',
|
||||
Qt.Key_K:'k',
|
||||
Qt.Key_Kana_Lock:'unknown',
|
||||
Qt.Key_Kana_Shift:'unknown',
|
||||
Qt.Key_Kanji:'unknown',
|
||||
Qt.Key_Katakana:'unknown',
|
||||
Qt.Key_KeyboardBrightnessDown:'unknown',
|
||||
Qt.Key_KeyboardBrightnessUp:'unknown',
|
||||
Qt.Key_KeyboardLightOnOff:'unknown',
|
||||
Qt.Key_L:'l',
|
||||
Qt.Key_LastNumberRedial:'unknown',
|
||||
Qt.Key_Launch0:'unknown',
|
||||
Qt.Key_Launch1:'unknown',
|
||||
Qt.Key_Launch2:'unknown',
|
||||
Qt.Key_Launch3:'unknown',
|
||||
Qt.Key_Launch4:'unknown',
|
||||
Qt.Key_Launch5:'unknown',
|
||||
Qt.Key_Launch6:'unknown',
|
||||
Qt.Key_Launch7:'unknown',
|
||||
Qt.Key_Launch8:'unknown',
|
||||
Qt.Key_Launch9:'unknown',
|
||||
Qt.Key_LaunchA:'unknown',
|
||||
Qt.Key_LaunchB:'unknown',
|
||||
Qt.Key_LaunchC:'unknown',
|
||||
Qt.Key_LaunchD:'unknown',
|
||||
Qt.Key_LaunchE:'unknown',
|
||||
Qt.Key_LaunchF:'unknown',
|
||||
Qt.Key_LaunchG:'unknown',
|
||||
Qt.Key_LaunchH:'unknown',
|
||||
Qt.Key_LaunchMail:'unknown',
|
||||
Qt.Key_LaunchMedia:'unknown',
|
||||
Qt.Key_Left:'arrow_left',
|
||||
Qt.Key_Less:'unknown',
|
||||
Qt.Key_LightBulb:'unknown',
|
||||
Qt.Key_LogOff:'unknown',
|
||||
Qt.Key_M:'m',
|
||||
Qt.Key_MailForward:'unknown',
|
||||
Qt.Key_Market:'unknown',
|
||||
Qt.Key_Massyo:'unknown',
|
||||
Qt.Key_MediaLast:'unknown',
|
||||
Qt.Key_MediaNext:'unknown',
|
||||
Qt.Key_MediaPause:'unknown',
|
||||
Qt.Key_MediaPlay:'unknown',
|
||||
Qt.Key_MediaPrevious:'unknown',
|
||||
Qt.Key_MediaRecord:'unknown',
|
||||
Qt.Key_MediaStop:'unknown',
|
||||
Qt.Key_MediaTogglePlayPause:'unknown',
|
||||
Qt.Key_Meeting:'unknown',
|
||||
Qt.Key_Memo:'unknown',
|
||||
Qt.Key_Menu:'unknown',
|
||||
Qt.Key_MenuKB:'unknown',
|
||||
Qt.Key_MenuPB:'unknown',
|
||||
Qt.Key_Messenger:'unknown',
|
||||
Qt.Key_Meta:'unknown',
|
||||
Qt.Key_MicMute:'unknown',
|
||||
Qt.Key_MicVolumeDown:'unknown',
|
||||
Qt.Key_MicVolumeUp:'unknown',
|
||||
Qt.Key_Minus:'unknown',
|
||||
Qt.Key_Mode_switch:'unknown',
|
||||
Qt.Key_MonBrightnessDown:'unknown',
|
||||
Qt.Key_MonBrightnessUp:'unknown',
|
||||
Qt.Key_Muhenkan:'unknown',
|
||||
Qt.Key_Multi_key:'unknown',
|
||||
Qt.Key_MultipleCandidate:'unknown',
|
||||
Qt.Key_Music:'unknown',
|
||||
Qt.Key_MySites:'unknown',
|
||||
Qt.Key_N:'n',
|
||||
Qt.Key_New:'unknown',
|
||||
Qt.Key_News:'unknown',
|
||||
Qt.Key_No:'unknown',
|
||||
Qt.Key_Ntilde:'unknown',
|
||||
Qt.Key_NumLock:'unknown',
|
||||
Qt.Key_NumberSign:'unknown',
|
||||
Qt.Key_O:'o',
|
||||
Qt.Key_Oacute:'unknown',
|
||||
Qt.Key_Ocircumflex:'unknown',
|
||||
Qt.Key_Odiaeresis:'unknown',
|
||||
Qt.Key_OfficeHome:'unknown',
|
||||
Qt.Key_Ograve:'unknown',
|
||||
Qt.Key_Ooblique:'unknown',
|
||||
Qt.Key_Open:'unknown',
|
||||
Qt.Key_OpenUrl:'unknown',
|
||||
Qt.Key_Option:'unknown',
|
||||
Qt.Key_Otilde:'unknown',
|
||||
Qt.Key_P:'p',
|
||||
Qt.Key_PageDown:'unknown',
|
||||
Qt.Key_PageUp:'unknown',
|
||||
Qt.Key_ParenLeft:'unknown',
|
||||
Qt.Key_ParenRight:'unknown',
|
||||
Qt.Key_Paste:'unknown',
|
||||
Qt.Key_Pause:'unknown',
|
||||
Qt.Key_Percent:'unknown',
|
||||
Qt.Key_Period:'unknown',
|
||||
Qt.Key_Phone:'unknown',
|
||||
Qt.Key_Pictures:'unknown',
|
||||
Qt.Key_Play:'unknown',
|
||||
Qt.Key_Plus:'unknown',
|
||||
Qt.Key_PowerDown:'unknown',
|
||||
Qt.Key_PowerOff:'unknown',
|
||||
Qt.Key_PreviousCandidate:'unknown',
|
||||
Qt.Key_Print:'unknown',
|
||||
Qt.Key_Printer:'unknown',
|
||||
Qt.Key_Q:'q',
|
||||
Qt.Key_Question:'unknown',
|
||||
Qt.Key_QuoteDbl:'unknown',
|
||||
Qt.Key_QuoteLeft:'unknown',
|
||||
Qt.Key_R:'r',
|
||||
Qt.Key_Red:'unknown',
|
||||
Qt.Key_Redo:'unknown',
|
||||
Qt.Key_Refresh:'unknown',
|
||||
Qt.Key_Reload:'unknown',
|
||||
Qt.Key_Reply:'unknown',
|
||||
Qt.Key_Return:'unknown',
|
||||
Qt.Key_Right:'arrow_right',
|
||||
Qt.Key_Romaji:'unknown',
|
||||
Qt.Key_RotateWindows:'unknown',
|
||||
Qt.Key_RotationKB:'unknown',
|
||||
Qt.Key_RotationPB:'unknown',
|
||||
Qt.Key_S:'s',
|
||||
Qt.Key_Save:'unknown',
|
||||
Qt.Key_ScreenSaver:'unknown',
|
||||
Qt.Key_ScrollLock:'unknown',
|
||||
Qt.Key_Search:'unknown',
|
||||
Qt.Key_Select:'unknown',
|
||||
Qt.Key_Semicolon:'unknown',
|
||||
Qt.Key_Send:'unknown',
|
||||
Qt.Key_Settings:'unknown',
|
||||
Qt.Key_Shift:'unknown',
|
||||
Qt.Key_Shop:'unknown',
|
||||
Qt.Key_SingleCandidate:'unknown',
|
||||
Qt.Key_Slash:'unknown',
|
||||
Qt.Key_Sleep:'unknown',
|
||||
Qt.Key_Space:'space',
|
||||
Qt.Key_Spell:'unknown',
|
||||
Qt.Key_SplitScreen:'unknown',
|
||||
Qt.Key_Standby:'unknown',
|
||||
Qt.Key_Stop:'unknown',
|
||||
Qt.Key_Subtitle:'unknown',
|
||||
Qt.Key_Super_L:'unknown',
|
||||
Qt.Key_Super_R:'unknown',
|
||||
Qt.Key_Support:'unknown',
|
||||
Qt.Key_Suspend:'unknown',
|
||||
Qt.Key_SysReq:'unknown',
|
||||
Qt.Key_T:'t',
|
||||
Qt.Key_THORN:'unknown',
|
||||
Qt.Key_Tab:'unknown',
|
||||
Qt.Key_TaskPane:'unknown',
|
||||
Qt.Key_Terminal:'unknown',
|
||||
Qt.Key_Time:'unknown',
|
||||
Qt.Key_ToDoList:'unknown',
|
||||
Qt.Key_ToggleCallHangup:'unknown',
|
||||
Qt.Key_Tools:'unknown',
|
||||
Qt.Key_TopMenu:'unknown',
|
||||
Qt.Key_TouchpadOff:'unknown',
|
||||
Qt.Key_TouchpadOn:'unknown',
|
||||
Qt.Key_TouchpadToggle:'unknown',
|
||||
Qt.Key_Touroku:'unknown',
|
||||
Qt.Key_Travel:'unknown',
|
||||
Qt.Key_TrebleDown:'unknown',
|
||||
Qt.Key_TrebleUp:'unknown',
|
||||
Qt.Key_U:'u',
|
||||
Qt.Key_UWB:'unknown',
|
||||
Qt.Key_Uacute:'unknown',
|
||||
Qt.Key_Ucircumflex:'unknown',
|
||||
Qt.Key_Udiaeresis:'unknown',
|
||||
Qt.Key_Ugrave:'unknown',
|
||||
Qt.Key_Underscore:'unknown',
|
||||
Qt.Key_Undo:'unknown',
|
||||
Qt.Key_Up:'arrow_up',
|
||||
Qt.Key_V:'v',
|
||||
Qt.Key_Video:'unknown',
|
||||
Qt.Key_View:'unknown',
|
||||
Qt.Key_VoiceDial:'unknown',
|
||||
Qt.Key_VolumeDown:'unknown',
|
||||
Qt.Key_VolumeMute:'unknown',
|
||||
Qt.Key_VolumeUp:'unknown',
|
||||
Qt.Key_W:'w',
|
||||
Qt.Key_WLAN:'unknown',
|
||||
Qt.Key_WWW:'unknown',
|
||||
Qt.Key_WakeUp:'unknown',
|
||||
Qt.Key_WebCam:'unknown',
|
||||
Qt.Key_Word:'unknown',
|
||||
Qt.Key_X:'x',
|
||||
Qt.Key_Xfer:'unknown',
|
||||
Qt.Key_Y:'y',
|
||||
Qt.Key_Yacute:'unknown',
|
||||
Qt.Key_Yellow:'unknown',
|
||||
Qt.Key_Yes:'unknown',
|
||||
Qt.Key_Z:'z',
|
||||
Qt.Key_Zenkaku:'unknown',
|
||||
Qt.Key_Zenkaku_Hankaku:'unknown',
|
||||
Qt.Key_Zoom:'unknown',
|
||||
Qt.Key_ZoomIn:'unknown',
|
||||
Qt.Key_ZoomOut:'unknown',
|
||||
Qt.Key_acute:'unknown',
|
||||
Qt.Key_brokenbar:'unknown',
|
||||
Qt.Key_cedilla:'unknown',
|
||||
Qt.Key_cent:'unknown',
|
||||
Qt.Key_copyright:'unknown',
|
||||
Qt.Key_currency:'unknown',
|
||||
Qt.Key_degree:'unknown',
|
||||
Qt.Key_diaeresis:'unknown',
|
||||
Qt.Key_division:'unknown',
|
||||
Qt.Key_exclamdown:'unknown',
|
||||
Qt.Key_guillemotleft:'unknown',
|
||||
Qt.Key_guillemotright:'unknown',
|
||||
Qt.Key_hyphen:'unknown',
|
||||
Qt.Key_iTouch:'unknown',
|
||||
Qt.Key_macron:'unknown',
|
||||
Qt.Key_masculine:'unknown',
|
||||
Qt.Key_mu:'unknown',
|
||||
Qt.Key_multiply:'unknown',
|
||||
Qt.Key_nobreakspace:'unknown',
|
||||
Qt.Key_notsign:'unknown',
|
||||
Qt.Key_onehalf:'unknown',
|
||||
Qt.Key_onequarter:'unknown',
|
||||
Qt.Key_onesuperior:'unknown',
|
||||
Qt.Key_ordfeminine:'unknown',
|
||||
Qt.Key_paragraph:'unknown',
|
||||
Qt.Key_periodcentered:'unknown',
|
||||
Qt.Key_plusminus:'unknown',
|
||||
Qt.Key_questiondown:'unknown',
|
||||
Qt.Key_registered:'unknown',
|
||||
Qt.Key_section:'unknown',
|
||||
Qt.Key_ssharp:'unknown',
|
||||
Qt.Key_sterling:'unknown',
|
||||
Qt.Key_threequarters:'unknown',
|
||||
Qt.Key_threesuperior:'unknown',
|
||||
Qt.Key_twosuperior:'unknown',
|
||||
Qt.Key_unknown:'unknown',
|
||||
Qt.Key_ydiaeresis:'unknown',
|
||||
Qt.Key_yen:'unknown',
|
||||
}
|
||||
@ -1,15 +0,0 @@
|
||||
from PyQt5.QtCore import *
|
||||
from PyQt5.QtGui import *
|
||||
from PyQt5.QtWidgets import *
|
||||
import sys
|
||||
__all__ = ["QMeta3D_Modifiers_Translation.py"]
|
||||
|
||||
QMeta3D_Modifier_translation ={
|
||||
Qt.NoModifier:None,
|
||||
Qt.ShiftModifier:'shift',
|
||||
Qt.ControlModifier:'control',
|
||||
Qt.AltModifier:'alt',
|
||||
Qt.MetaModifier:'unknown',
|
||||
Qt.KeypadModifier:'unknown',
|
||||
Qt.GroupSwitchModifier:'unknown',
|
||||
}
|
||||
@ -1,27 +0,0 @@
|
||||
from PyQt5.QtCore import *
|
||||
from PyQt5.QtGui import *
|
||||
from PyQt5.QtWidgets import *
|
||||
|
||||
from panda3d.core import *
|
||||
|
||||
__all__ = ["QMouseWatcherNode"]
|
||||
|
||||
|
||||
class QMouseWatcherNode(MouseWatcher):
|
||||
def __init__(self, parent):
|
||||
super().__init__()
|
||||
|
||||
self.parent = parent
|
||||
|
||||
def getMouse(self, *args, **kwargs):
|
||||
pos = self.parent.mapFromGlobal(QCursor.pos())
|
||||
|
||||
rel_x = -1 + 2 * pos.x() / self.parent.width()
|
||||
rel_y = -1 + 2 * pos.y() / self.parent.height()
|
||||
|
||||
rel_y = -rel_y
|
||||
|
||||
return LPoint2(rel_x, rel_y)
|
||||
|
||||
def hasMouse(self):
|
||||
return isinstance(self.parent, QWidget)
|
||||
@ -1,2 +0,0 @@
|
||||
name="QMeta3D"
|
||||
__all__ = ["generate_qt_to_pd3d_translator"]
|
||||
@ -1,11 +0,0 @@
|
||||
from PyQt5.QtCore import *
|
||||
from PyQt5.QtGui import *
|
||||
from PyQt5.QtWidgets import *
|
||||
|
||||
H=Qt.__dict__
|
||||
lst = [a for a in H if a.startswith("Key_")]
|
||||
QMeta3D_Key_translation = "QMeta3D_Key_translation ={"
|
||||
for i in range(len(lst)):
|
||||
QMeta3D_Key_translation += "Qt.{}:'unknown',\n".format(lst[i])
|
||||
QMeta3D_Key_translation += "}"
|
||||
print(QMeta3D_Key_translation)
|
||||
@ -1,2 +0,0 @@
|
||||
name="QMeta3D"
|
||||
__all__ = ["QMeta3DWidget.py", "Meta3DWorld.py", "QMeta3D_Keys_Translation.py"]
|
||||
20
core/render_pipeline_utils.py
Normal file
20
core/render_pipeline_utils.py
Normal file
@ -0,0 +1,20 @@
|
||||
"""
|
||||
渲染管线工具模块
|
||||
提供全局渲染管线实例的访问功能
|
||||
"""
|
||||
|
||||
# 全局渲染管线实例
|
||||
_global_render_pipeline = None
|
||||
|
||||
def get_render_pipeline():
|
||||
"""获取全局 RenderPipeline 单例"""
|
||||
global _global_render_pipeline
|
||||
if _global_render_pipeline is None:
|
||||
raise RuntimeError(
|
||||
"RenderPipeline has not been initialized yet. Please create a CoreWorld instance first.")
|
||||
return _global_render_pipeline
|
||||
|
||||
def set_render_pipeline(pipeline):
|
||||
"""设置全局渲染管线实例"""
|
||||
global _global_render_pipeline
|
||||
_global_render_pipeline = pipeline
|
||||
2440
core/world.py
2440
core/world.py
File diff suppressed because it is too large
Load Diff
1192
core/world.py.backup
Normal file
1192
core/world.py.backup
Normal file
File diff suppressed because it is too large
Load Diff
@ -24,7 +24,7 @@ import inspect
|
||||
from pathlib import Path
|
||||
from panda3d.egg import EggData, EggVertexPool
|
||||
from direct.actor.Actor import Actor
|
||||
from QMeta3D.Meta3DWorld import get_render_pipeline
|
||||
from core.render_pipeline_utils import get_render_pipeline
|
||||
from RenderPipelineFile.rpplugins.smaa.jitters import halton_seq
|
||||
from scene import util
|
||||
|
||||
@ -2540,7 +2540,7 @@ class SceneManager:
|
||||
"""重新创建点光源"""
|
||||
try:
|
||||
from RenderPipelineFile.rpcore import PointLight
|
||||
from QMeta3D.Meta3DWorld import get_render_pipeline
|
||||
from core.render_pipeline_utils import get_render_pipeline
|
||||
|
||||
# 创建点光源对象
|
||||
light = PointLight()
|
||||
@ -2711,7 +2711,7 @@ class SceneManager:
|
||||
"""创建聚光灯 - 支持多选创建,优化版本"""
|
||||
try:
|
||||
from RenderPipelineFile.rpcore import SpotLight
|
||||
from QMeta3D.Meta3DWorld import get_render_pipeline
|
||||
from core.render_pipeline_utils import get_render_pipeline
|
||||
from panda3d.core import Vec3, NodePath
|
||||
from PyQt5.QtCore import Qt
|
||||
|
||||
@ -2820,7 +2820,7 @@ class SceneManager:
|
||||
"""创建点光源 - 支持多选创建,优化版本"""
|
||||
try:
|
||||
from RenderPipelineFile.rpcore import PointLight
|
||||
from QMeta3D.Meta3DWorld import get_render_pipeline
|
||||
from core.render_pipeline_utils import get_render_pipeline
|
||||
from panda3d.core import Vec3, NodePath
|
||||
from PyQt5.QtCore import Qt
|
||||
|
||||
@ -2975,7 +2975,7 @@ class SceneManager:
|
||||
return
|
||||
|
||||
# 获取RenderPipeline实例
|
||||
from QMeta3D.Meta3DWorld import get_render_pipeline
|
||||
from core.render_pipeline_utils import get_render_pipeline
|
||||
render_pipeline = get_render_pipeline()
|
||||
|
||||
if not render_pipeline:
|
||||
@ -4537,7 +4537,7 @@ except Exception as e:
|
||||
# 检查是否使用RenderPipeline
|
||||
if hasattr(self.world, 'render_pipeline') and self.world.render_pipeline:
|
||||
from RenderPipelineFile.rpcore import SpotLight
|
||||
from QMeta3D.Meta3DWorld import get_render_pipeline
|
||||
from core.render_pipeline_utils import get_render_pipeline
|
||||
|
||||
# 创建RenderPipeline聚光灯
|
||||
from panda3d.core import Vec3
|
||||
@ -4615,7 +4615,7 @@ except Exception as e:
|
||||
# 检查是否使用RenderPipeline
|
||||
if hasattr(self.world, 'render_pipeline') and self.world.render_pipeline:
|
||||
from RenderPipelineFile.rpcore import PointLight
|
||||
from QMeta3D.Meta3DWorld import get_render_pipeline
|
||||
from core.render_pipeline_utils import get_render_pipeline
|
||||
|
||||
# 创建RenderPipeline点光源
|
||||
pointlight = PointLight()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user