chiark / gitweb /
Split the scene logic into another file, so we can add auto-placement there without...
authordaid303 <daid303@gmail.com>
Mon, 25 Mar 2013 09:21:12 +0000 (10:21 +0100)
committerdaid303 <daid303@gmail.com>
Mon, 25 Mar 2013 09:21:12 +0000 (10:21 +0100)
Cura/gui/sceneView.py
Cura/util/mesh.py
Cura/util/objectScene.py [new file with mode: 0644]

index 58cf98ca66b268e8925b6fa68655687ec6258443..22e14422804cc5535482ea3fefbc4d7085fb3acc 100644 (file)
@@ -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())
index d12497f83c26510f35c718ccbf80b4386001657c..0ed57db21fb055a2ed82cfebe66cce5f4c5980b7 100644 (file)
@@ -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 (file)
index 0000000..e84eedf
--- /dev/null
@@ -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