import wx
import numpy
+import time
import OpenGL
OpenGL.ERROR_CHECKING = False
from Cura.gui.util import opengl
from Cura.gui.util import openglGui
+class anim(object):
+ def __init__(self, start, end, runTime):
+ self._start = start.copy()
+ self._end = end.copy()
+ self._startTime = time.time()
+ self._runTime = runTime
+
+ def isDone(self):
+ return time.time() > self._startTime + self._runTime
+
+ def getPosition(self):
+ if self.isDone():
+ return self._end
+ f = (time.time() - self._startTime) / self._runTime
+ ts=f*f
+ tc=f*f*f
+ f = 6*tc*ts + -15*ts*ts + 10*tc
+ return self._start + (self._end - self._start) * f
+
class SceneView(openglGui.glGuiPanel):
def __init__(self, parent):
super(SceneView, self).__init__(parent)
self._objColors = [None,None,None,None]
self._mouseX = -1
self._mouseY = -1
+ self._viewTarget = numpy.array([0,0,0], numpy.float32);
+ self._animView = None
+ wx.EVT_IDLE(self, self.OnIdle)
self.updateProfileToControls()
+ def OnIdle(self, e):
+ if self._animView is not None:
+ self.Refresh()
+
def loadScene(self, fileList):
for filename in fileList:
for obj in meshLoader.loadMeshes(filename):
self.Refresh()
def OnMouseDown(self,e):
+ self._mouseX = e.GetX()
+ self._mouseY = e.GetY()
if self._focusObj is not None:
self._selectedObj = self._focusObj
+ newViewPos = (self._selectedObj.getMaximum() + self._selectedObj.getMinimum()) / 2
+ self._animView = anim(self._viewTarget, newViewPos, 0.5)
def OnMouseMotion(self,e):
if e.Dragging() and e.LeftIsDown():
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)
def OnPaint(self,e):
+ if self._animView is not None:
+ self._viewTarget = self._animView.getPosition()
+ if self._animView.isDone():
+ self._animView = None
if self._objectShader is None:
self._objectShader = opengl.GLShader("""
uniform float cameraDistance;
glTranslate(0,0,-self._zoom)
glRotate(-self._pitch, 1,0,0)
glRotate(self._yaw, 0,0,1)
- glTranslate(0,0,-15)
+ glTranslate(-self._viewTarget[0],-self._viewTarget[1],-self._viewTarget[2])
glClearColor(1,1,1,1)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)
glTranslate(0,0,-self._zoom)
glRotate(-self._pitch, 1,0,0)
glRotate(self._yaw, 0,0,1)
- glTranslate(0,0,-15)
+ glTranslate(-self._viewTarget[0],-self._viewTarget[1],-self._viewTarget[2])
self._objectShader.bind()
self._objectShader.setUniform('cameraDistance', self._zoom)
def _renderObject(self, obj):
glPushMatrix()
- offset = (obj.getMinimum() + obj.getMaximum()) / 2
- glTranslate(-offset[0], -offset[1], -obj.getMinimum()[2])
+ offset = obj.getDrawOffset()
+ glTranslate(-offset[0], -offset[1], -offset[2])
for m in obj._meshList:
if m.vbo is None:
m.vbo = opengl.GLVBO(m.vertexes, m.normal)
boundaryCircleSize = round(math.sqrt(numpy.max(((transformedVertexes[::,0] - center[0]) * (transformedVertexes[::,0] - center[0])) + ((transformedVertexes[::,1] - center[1]) * (transformedVertexes[::,1] - center[1])) + ((transformedVertexes[::,2] - center[2]) * (transformedVertexes[::,2] - center[2])))), 3)
self._boundaryCircleSize = max(self._boundaryCircleSize, boundaryCircleSize)
self._transformedSize = self._transformedMax - self._transformedMin
+ self._drawOffset = (self._transformedMax + self._transformedMin) / 2
+ self._drawOffset[2] = self._transformedMin[2]
+ self._transformedMax -= self._drawOffset
+ self._transformedMin -= self._drawOffset
def getMaximum(self):
return self._transformedMax
return self._transformedMin
def getSize(self):
return self._transformedSize
+ def getDrawOffset(self):
+ return self._drawOffset
def getBoundaryCircle(self):
return self._boundaryCircleSize