chiark / gitweb /
bunch of small things.
authordaid303 <daid303@gmail.com>
Fri, 5 Apr 2013 15:24:51 +0000 (17:24 +0200)
committerdaid303 <daid303@gmail.com>
Fri, 5 Apr 2013 15:24:51 +0000 (17:24 +0200)
Cura/gui/sceneView.py
Cura/util/mesh.py
Cura/util/objectScene.py
Cura/util/sliceEngine.py

index d57e2257559ec8f2b55c9acc4d28abe89d5ae674..313c3b0c0c231c06b92fb6bcd1934ac167874bdb 100644 (file)
@@ -63,7 +63,7 @@ class SceneView(openglGui.glGuiPanel):
                self._animView = None
                self._animZoom = None
                self._platformMesh = meshLoader.loadMeshes(resources.getPathForMesh('ultimaker_platform.stl'))[0]
-               self._platformMesh._drawOffset = numpy.array([0,0,0.5], numpy.float32)
+               self._platformMesh._drawOffset = numpy.array([0,0,1.5], numpy.float32)
                self._isSimpleMode = True
 
                self._viewport = None
@@ -255,6 +255,14 @@ class SceneView(openglGui.glGuiPanel):
        def _selectObject(self, obj, zoom = True):
                if obj != self._selectedObj:
                        self._selectedObj = obj
+                       scale = self._selectedObj.getScale()
+                       size = self._selectedObj.getSize()
+                       self.scaleXctrl.setValue(round(scale[0], 2))
+                       self.scaleYctrl.setValue(round(scale[1], 2))
+                       self.scaleZctrl.setValue(round(scale[2], 2))
+                       self.scaleXmmctrl.setValue(round(size[0], 2))
+                       self.scaleYmmctrl.setValue(round(size[1], 2))
+                       self.scaleZmmctrl.setValue(round(size[2], 2))
                if zoom:
                        newViewPos = numpy.array([obj.getPosition()[0], obj.getPosition()[1], obj.getMaximum()[2] / 2])
                        self._animView = anim(self._viewTarget.copy(), newViewPos, 0.5)
@@ -448,7 +456,6 @@ class SceneView(openglGui.glGuiPanel):
                                self._animZoom = None
                if self._objectShader is None:
                        self._objectShader = opengl.GLShader("""
-uniform float cameraDistance;
 varying float light_amount;
 
 void main(void)
@@ -457,11 +464,9 @@ void main(void)
     gl_FrontColor = gl_Color;
 
        light_amount = abs(dot(normalize(gl_NormalMatrix * gl_Normal), normalize(gl_LightSource[0].position.xyz)));
-       light_amount *= 1.0 - (length(gl_Position.xyz - vec3(0.0,0.0,cameraDistance)) / 1.5 / cameraDistance);
        light_amount += 0.2;
 }
                        ""","""
-uniform float cameraDistance;
 varying float light_amount;
 
 void main(void)
@@ -470,7 +475,6 @@ void main(void)
 }
                        """)
                        self._objectLoadShader = opengl.GLShader("""
-uniform float cameraDistance;
 uniform float intensity;
 uniform float scale;
 varying float light_amount;
@@ -484,11 +488,9 @@ void main(void)
     gl_FrontColor = gl_Color;
 
        light_amount = abs(dot(normalize(gl_NormalMatrix * gl_Normal), normalize(gl_LightSource[0].position.xyz)));
-       light_amount *= 1.0 - (length(gl_Position.xyz - vec3(0.0,0.0,cameraDistance)) / 1.5 / cameraDistance);
        light_amount += 0.2;
 }
                        ""","""
-uniform float cameraDistance;
 uniform float intensity;
 varying float light_amount;
 
@@ -534,7 +536,6 @@ void main(void)
                glStencilFunc(GL_ALWAYS, 1, 1)
                glStencilOp(GL_INCR, GL_INCR, GL_INCR)
                self._objectShader.bind()
-               self._objectShader.setUniform('cameraDistance', self._zoom)
                for obj in self._scene.objects():
                        if obj._loadAnim is not None:
                                if obj._loadAnim.isDone():
@@ -558,7 +559,6 @@ void main(void)
                glDisable(GL_STENCIL_TEST)
                glEnable(GL_BLEND)
                self._objectLoadShader.bind()
-               self._objectLoadShader.setUniform('cameraDistance', self._zoom)
                glColor4f(0.2, 0.6, 1.0, 1.0)
                for obj in self._scene.objects():
                        if obj._loadAnim is None:
@@ -571,6 +571,23 @@ void main(void)
 
                self._drawMachine()
 
+               #Draw the object box-shadow, so you can see where it will collide with other objects.
+               if self._selectedObj is not None and len(self._scene.objects()) > 1:
+                       size = self._selectedObj.getSize()[0:2] / 2 + self._scene.getObjectExtend()
+                       glPushMatrix()
+                       glTranslatef(self._selectedObj.getPosition()[0], self._selectedObj.getPosition()[1], 0.0)
+                       glEnable(GL_BLEND)
+                       glEnable(GL_CULL_FACE)
+                       glColor4f(0,0,0,0.12)
+                       glBegin(GL_QUADS)
+                       glVertex3f(-size[0],  size[1], 0)
+                       glVertex3f(-size[0], -size[1], 0)
+                       glVertex3f( size[0], -size[1], 0)
+                       glVertex3f( size[0],  size[1], 0)
+                       glEnd()
+                       glDisable(GL_CULL_FACE)
+                       glPopMatrix()
+
                #Draw the outline of the selected object, on top of everything else except the GUI.
                if self._selectedObj is not None and self._selectedObj._loadAnim is None:
                        glDisable(GL_DEPTH_TEST)
@@ -620,7 +637,6 @@ void main(void)
                if profile.getPreference('machine_type') == 'ultimaker':
                        glColor4f(1,1,1,0.5)
                        self._objectShader.bind()
-                       self._objectShader.setUniform('cameraDistance', self._zoom)
                        self._renderObject(self._platformMesh)
                        self._objectShader.unbind()
 
index a4922869675913960a7f5a08a513814866bf8442..9fe24c85701342abbd42acbed69afecf85612e7c 100644 (file)
@@ -78,6 +78,12 @@ class printableObject(object):
                matrix[axis][axis] = -1
                self.applyMatrix(numpy.matrix(matrix, numpy.float64))
 
+       def getScale(self):
+               return numpy.array([
+                       numpy.linalg.norm(self._matrix[::,0].getA().flatten()),
+                       numpy.linalg.norm(self._matrix[::,1].getA().flatten()),
+                       numpy.linalg.norm(self._matrix[::,2].getA().flatten())], numpy.float64);
+
 class mesh(object):
        def __init__(self):
                self.vertexes = None
index b469c0714ec9d7032478a474640e88f06829371d..2684bd5baaeb706b96b38e090c1db4691df94f09 100644 (file)
@@ -17,6 +17,9 @@ class _objectOrderFinder(object):
                for n in xrange(0, len(self._objs)):
                        if scene.checkPlatform(self._objs[n]):
                                initialList.append(n)
+               if len(initialList) == 0:
+                       self.order = []
+                       return
                self._todo = [_objectOrder([], initialList)]
                while len(self._todo) > 0:
                        current = self._todo.pop()
@@ -26,6 +29,7 @@ class _objectOrderFinder(object):
                                        todoList.remove(addIdx)
                                        order = current.order[:] + [addIdx]
                                        if len(todoList) == 0:
+                                               self._todo = None
                                                self.order = order
                                                return
                                        self._todo.append(_objectOrder(order, todoList))
@@ -72,6 +76,9 @@ class Scene(object):
        def setSizeOffsets(self, sizeOffsets):
                self._sizeOffsets = sizeOffsets
 
+       def getObjectExtend(self):
+               return self._sizeOffsets + self._headOffsets
+
        def objects(self):
                return self._objectList
 
@@ -112,7 +119,10 @@ class Scene(object):
                        obj.setPosition(obj.getPosition() + offset)
 
        def printOrder(self):
-               return _objectOrderFinder(self, self._headOffsets + self._sizeOffsets).order
+               order = _objectOrderFinder(self, self._headOffsets + self._sizeOffsets).order
+               if order is None:
+                       print "ODD! Cannot find out proper printing order!!!"
+               return order
 
        def _pushFree(self):
                for a in self._objectList:
index c128d6842488b776d6ae62927c6f143a7d10e255..2589ff2abd766e2933abadf3aa5628e28fe1bb85 100644 (file)
@@ -30,6 +30,7 @@ class Slicer(object):
                self._binaryStorageFilename = getTempFilename()
                self._exportFilename = getTempFilename()
                self._progressSteps = ['inset', 'skin', 'export']
+               self._objCount = 0
 
        def abortSlicer(self):
                if self._process is not None:
@@ -74,14 +75,21 @@ class Slicer(object):
        def _watchProcess(self):
                self._callback(0.0, False)
                line = self._process.stdout.readline()
+               objectNr = 0
                while len(line):
                        line = line.strip()
                        if line.startswith('Progress:'):
                                line = line.split(':')
-                               progressValue = float(line[2]) / float(line[3])
-                               progressValue /= len(self._progressSteps)
-                               progressValue += 1.0 / len(self._progressSteps) * self._progressSteps.index(line[1])
-                               self._callback(progressValue, False)
+                               if line[1] == 'process':
+                                       objectNr += 1
+                               else:
+                                       progressValue = float(line[2]) / float(line[3])
+                                       progressValue /= len(self._progressSteps)
+                                       progressValue += 1.0 / len(self._progressSteps) * self._progressSteps.index(line[1])
+
+                                       progressValue /= self._objCount
+                                       progressValue += 1.0 / self._objCount * objectNr
+                                       self._callback(progressValue, False)
                        else:
                                print '#', line.strip()
                        line = self._process.stdout.readline()