chiark / gitweb /
Add object duplication.
authordaid303 <daid303@gmail.com>
Fri, 12 Apr 2013 07:22:06 +0000 (09:22 +0200)
committerdaid303 <daid303@gmail.com>
Fri, 12 Apr 2013 07:22:06 +0000 (09:22 +0200)
Cura/gui/sceneView.py
Cura/gui/util/opengl.py
Cura/util/mesh.py

index 878e5ee33d5e910ff3b007e83ed7133600742ed2..3241fc0e3daf7b20f89db47ab68d6dedbe2a5a66 100644 (file)
@@ -209,6 +209,13 @@ class SceneView(openglGui.glGuiPanel):
                self.updateProfileToControls()
                self.sceneUpdated()
 
+       def OnDuplicateObject(self, e):
+               if self._selectedObj is None:
+                       return
+               self._scene.add(self._selectedObj.copy())
+               self._scene.centerAll()
+               self.sceneUpdated()
+
        def OnMergeObjects(self, e):
                if self._selectedObj is None or self._focusObj is None or self._selectedObj == self._focusObj:
                        return
@@ -247,7 +254,7 @@ class SceneView(openglGui.glGuiPanel):
                        self._focusObj = None
                self._scene.remove(obj)
                for m in obj._meshList:
-                       if m.vbo is not None:
+                       if m.vbo is not None and m.vbo.decRef():
                                self.glReleaseList.append(m.vbo)
                if self._isSimpleMode:
                        self._scene.arrangeAll()
@@ -339,11 +346,10 @@ class SceneView(openglGui.glGuiPanel):
                                        self.Refresh()
                        if e.GetButton() == 3:
                                if self._selectedObj == self._focusObj:
-                                       #menu = wx.Menu()
-                                       #menu.Append(-1, 'Test')
-                                       #self.PopupMenu(menu)
-                                       #menu.Destroy()
-                                       pass
+                                       menu = wx.Menu()
+                                       self.Bind(wx.EVT_MENU, self.OnDuplicateObject, menu.Append(-1, 'Duplicate'))
+                                       self.PopupMenu(menu)
+                                       menu.Destroy()
                                if self._selectedObj != self._focusObj and self._focusObj is not None:
                                        menu = wx.Menu()
                                        self.Bind(wx.EVT_MENU, self.OnMergeObjects, menu.Append(-1, 'Merge'))
index 6e7d30656dcf32919fe2660c40bc66645a62261e..e0f7879651eb1e626def004f6d768c06c91f849e 100644 (file)
@@ -22,8 +22,20 @@ glutInit()
 
 platformMesh = None
 
-class GLShader(object):
+class GLReferenceCounter(object):
+       def __init__(self):
+               self._refCounter = 1
+
+       def incRef(self):
+               self._refCounter += 1
+
+       def decRef(self):
+               self._refCounter -= 1
+               return self._refCounter <= 0
+
+class GLShader(GLReferenceCounter):
        def __init__(self, vertexProgram, fragmentProgram):
+               super(GLShader, self).__init__()
                self._vertexString = vertexProgram
                self._fragmentString = fragmentProgram
                try:
@@ -65,8 +77,9 @@ class GLShader(object):
                if self._program is not None and bool(glDeleteProgram):
                        print "Shader was not properly released!"
 
-class GLVBO(object):
+class GLVBO(GLReferenceCounter):
        def __init__(self, vertexArray, normalArray):
+               super(GLVBO, self).__init__()
                self._buffer = glGenBuffers(1)
                self._size = len(vertexArray)
                glBindBuffer(GL_ARRAY_BUFFER, self._buffer)
index f4d988d5190dd14bdb416b0c6aa248345cd0d28d..ce75c803a978964700cf53a8ca74006a53175593 100644 (file)
@@ -15,7 +15,23 @@ class printableObject(object):
                self._matrix = numpy.matrix([[1,0,0],[0,1,0],[0,0,1]], numpy.float64)
                self._transformedMin = None
                self._transformedMax = None
+               self._transformedSize = None
                self._boundaryCircleSize = None
+               self._drawOffset = None
+               self._loadAnim = None
+
+       def copy(self):
+               ret = printableObject()
+               ret._matrix = self._matrix.copy()
+               ret._meshList = self._meshList[:]
+               ret._transformedMin = self._transformedMin
+               ret._transformedMax = self._transformedMin
+               ret._transformedSize = self._transformedSize
+               ret._boundaryCircleSize = self._boundaryCircleSize
+               ret._drawOffset = self._drawOffset
+               for m in ret._meshList:
+                       m.vbo.incRef()
+               return ret
 
        def _addMesh(self):
                m = mesh()