From: daid303 Date: Mon, 25 Mar 2013 09:21:12 +0000 (+0100) Subject: Split the scene logic into another file, so we can add auto-placement there without... X-Git-Tag: 13.05~159 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=9acc85aad30c9b9ec041e6300050dd13be61881d;p=cura.git Split the scene logic into another file, so we can add auto-placement there without making a huge mess of the gui code. --- diff --git a/Cura/gui/sceneView.py b/Cura/gui/sceneView.py index 58cf98ca..22e14422 100644 --- a/Cura/gui/sceneView.py +++ b/Cura/gui/sceneView.py @@ -11,6 +11,7 @@ from OpenGL.GL import * from Cura.util import profile from Cura.util import meshLoader +from Cura.util import objectScene from Cura.gui.util import opengl from Cura.gui.util import openglGui @@ -41,7 +42,7 @@ class SceneView(openglGui.glGuiPanel): self._yaw = 30 self._pitch = 60 self._zoom = 300 - self._objectList = [] + self._scene = objectScene.Scene() self._objectShader = None self._focusObj = None self._selectedObj = None @@ -59,7 +60,7 @@ class SceneView(openglGui.glGuiPanel): if self._animView is not None or self._animZoom is not None: self.Refresh() return - for obj in self._objectList: + for obj in self._scene.objects(): if obj._loadAnim is not None: self.Refresh() return @@ -68,14 +69,14 @@ class SceneView(openglGui.glGuiPanel): for filename in fileList: for obj in meshLoader.loadMeshes(filename): obj._loadAnim = anim(1, 0, 2) - self._objectList.append(obj) + self._scene.add(obj) def _deleteObject(self, obj): if obj == self._selectedObj: self._selectedObj = None if obj == self._focusObj: self._focusObj = None - self._objectList.remove(obj) + self._scene.remove(obj) for m in obj._meshList: if m.vbo is not None: self.glReleaseList.append(m.vbo) @@ -118,7 +119,7 @@ class SceneView(openglGui.glGuiPanel): self._selectedObj = self._focusObj newViewPos = numpy.array([self._selectedObj.getPosition()[0], self._selectedObj.getPosition()[1], self._selectedObj.getMaximum()[2] / 2]) self._animView = anim(self._viewTarget.copy(), newViewPos, 0.5) - newZoom = self._selectedObj.getBoundaryCircle() * 4 + newZoom = self._selectedObj.getBoundaryCircle() * 6 self._animZoom = anim(self._zoom, newZoom, 0.5) else: self._selectedObj = None @@ -238,21 +239,29 @@ void main(void) glRotate(-self._pitch, 1,0,0) glRotate(self._yaw, 0,0,1) glTranslate(-self._viewTarget[0],-self._viewTarget[1],-self._viewTarget[2]) + + self.viewport = glGetIntegerv(GL_VIEWPORT) + self.modelMatrix = glGetDoublev(GL_MODELVIEW_MATRIX) + self.projMatrix = glGetDoublev(GL_PROJECTION_MATRIX) + glClearColor(1,1,1,1) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) - for n in xrange(0, len(self._objectList)): - obj = self._objectList[n] + for n in xrange(0, len(self._scene.objects())): + obj = self._scene.objects()[n] glColor4ub((n >> 24) & 0xFF, (n >> 16) & 0xFF, (n >> 8) & 0xFF, n & 0xFF) self._renderObject(obj) if self._mouseX > -1: n = glReadPixels(self._mouseX, self.GetSize().GetHeight() - 1 - self._mouseY, 1, 1, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8)[0][0] - if n < len(self._objectList): - self._focusObj = self._objectList[n] + if n < len(self._scene.objects()): + self._focusObj = self._scene.objects()[n] else: self._focusObj = None + #f = glReadPixels(self._mouseX, self.GetSize().GetHeight() - 1 - self._mouseY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT)[0][0] + #mouse3Dpos = opengl.unproject(self._mouseX, self.viewport[1] + self.viewport[3] - self._mouseY, f, self.modelMatrix, self.projMatrix, self.viewport) + return self._init3DView() glTranslate(0,0,-self._zoom) glRotate(-self._pitch, 1,0,0) @@ -261,7 +270,7 @@ void main(void) self._objectShader.bind() self._objectShader.setUniform('cameraDistance', self._zoom) - for obj in self._objectList: + for obj in self._scene.objects(): if obj._loadAnim is not None: continue col = self._objColors[0] @@ -279,7 +288,7 @@ void main(void) self._objectLoadShader.bind() self._objectLoadShader.setUniform('cameraDistance', self._zoom) glColor4f(0.2, 0.6, 1.0, 1.0) - for obj in self._objectList: + for obj in self._scene.objects(): if obj._loadAnim is None: continue self._objectLoadShader.setUniform('intensity', obj._loadAnim.getPosition()) diff --git a/Cura/util/mesh.py b/Cura/util/mesh.py index d12497f8..0ed57db2 100644 --- a/Cura/util/mesh.py +++ b/Cura/util/mesh.py @@ -11,7 +11,7 @@ from Cura.util import util3d class printableObject(object): def __init__(self): self._meshList = [] - self._position = [0.0, 0.0] + self._position = numpy.array([0.0, 0.0]) self._matrix = numpy.matrix([[1,0,0],[0,1,0],[0,0,1]], numpy.float64) self._transformedMin = None self._transformedMax = None @@ -53,6 +53,8 @@ class printableObject(object): def getPosition(self): return self._position + def setPosition(self, newPos): + self._position = newPos def getMaximum(self): return self._transformedMax diff --git a/Cura/util/objectScene.py b/Cura/util/objectScene.py new file mode 100644 index 00000000..e84eedf6 --- /dev/null +++ b/Cura/util/objectScene.py @@ -0,0 +1,53 @@ +import random +import numpy + +class Scene(): + def __init__(self): + self._objectList = [] + + def objects(self): + return self._objectList + + def add(self, obj): + self._objectList.append(obj) + self.pushFree() + + def remove(self, obj): + self._objectList.remove(obj) + + def pushFree(self): + while self._pushFree(): + pass + + def _pushFree(self): + for a in self._objectList: + for b in self._objectList: + if not self._checkHit(a, b): + continue + posDiff = a.getPosition() - b.getPosition() + if posDiff[0] == 0.0 and posDiff[1] == 0.0: + posDiff[1] = 1.0 + if abs(posDiff[0]) > abs(posDiff[1]): + axis = 0 + else: + axis = 1 + aPos = a.getPosition() + bPos = b.getPosition() + center = (aPos[axis] + bPos[axis]) / 2 + distance = (a.getSize()[axis] + b.getSize()[axis]) / 2 + 0.1 + if posDiff[axis] < 0: + distance = -distance + aPos[axis] = center + distance / 2 + bPos[axis] = center - distance / 2 + a.setPosition(aPos) + b.setPosition(bPos) + return True + return False + + def _checkHit(self, a, b): + if a == b: + return False + posDiff = a.getPosition() - b.getPosition() + if abs(posDiff[0]) < (a.getSize()[0] + b.getSize()[0]) / 2 and abs(posDiff[1]) < (a.getSize()[1] + b.getSize()[1]) / 2: + return True + return False