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
self._yaw = 30
self._pitch = 60
self._zoom = 300
- self._objectList = []
+ self._scene = objectScene.Scene()
self._objectShader = None
self._focusObj = None
self._selectedObj = None
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
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)
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
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)
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]
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())
--- /dev/null
+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