From 4e7076802d1cf33c65abab380860bc8dcc58e3a8 Mon Sep 17 00:00:00 2001 From: Gyedo Jeon Date: Fri, 29 Jan 2010 02:44:40 +0000 Subject: [PATCH] Added UI for color scale property --- direct/src/leveleditor/ObjectMgr.py | 10 +++ direct/src/leveleditor/ObjectPropertyUI.py | 94 +++++++++++++++++++++- direct/src/leveleditor/testData.py | 14 ++++ 3 files changed, 114 insertions(+), 4 deletions(-) diff --git a/direct/src/leveleditor/ObjectMgr.py b/direct/src/leveleditor/ObjectMgr.py index e8967b1872..92c2dbf48e 100755 --- a/direct/src/leveleditor/ObjectMgr.py +++ b/direct/src/leveleditor/ObjectMgr.py @@ -167,6 +167,7 @@ class ObjectMgr: return self.currNodePath = obj[OG.OBJ_NP] + # [gjeon] to connect transform UI with nodepath's transform self.spawnUpdateObjectUITask() self.updateObjectPropertyUI(obj) @@ -263,6 +264,13 @@ class ObjectMgr: np.setSx(float(self.editor.ui.objectPropertyUI.propSX.getValue())) np.setSy(float(self.editor.ui.objectPropertyUI.propSY.getValue())) np.setSz(float(self.editor.ui.objectPropertyUI.propSZ.getValue())) + + def updateObjectColor(self, r, g, b, a): + if self.currNodePath is None: + return + + np = self.currNodePath + np.setColorScale(r, g, b, a) def updateObjectModel(self, model, obj, fSelectObject=True): """ replace object's model """ @@ -469,6 +477,8 @@ class ObjectMgr: self.saveData.append(" objects['%s'].setPos(%s)"%(uid, np.getPos())) self.saveData.append(" objects['%s'].setHpr(%s)"%(uid, np.getHpr())) self.saveData.append(" objects['%s'].setScale(%s)"%(uid, np.getScale())) + self.saveData.append(" objects['%s'].setTransparency(1)"%uid) + self.saveData.append(" objects['%s'].setColorScale(%s)"%(uid, np.getColorScale())) self.saveData.append(" objectMgr.updateObjectProperties(objects['%s'], %s)"%(uid,objProp)) self.traverse(child, uid) diff --git a/direct/src/leveleditor/ObjectPropertyUI.py b/direct/src/leveleditor/ObjectPropertyUI.py index e9a89f80e6..fdda057830 100755 --- a/direct/src/leveleditor/ObjectPropertyUI.py +++ b/direct/src/leveleditor/ObjectPropertyUI.py @@ -5,6 +5,7 @@ import wx import os from wx.lib.scrolledpanel import ScrolledPanel +from wx.lib.agw.cubecolourdialog import * from direct.wxwidgets.WxSlider import * from pandac.PandaModules import * import ObjectGlobals as OG @@ -141,10 +142,26 @@ class ObjectPropUICombo(ObjectPropUI): def getValue(self): return self.ui.GetStringSelection() +class ColorPicker(CubeColourDialog): + def __init__(self, parent, colourData=None, style=CCD_SHOW_ALPHA, alpha = 255, callback=None): + self.callback=callback + CubeColourDialog.__init__(self, parent, colourData, style) + self.okButton.Hide() + self.cancelButton.Hide() + self._colour.alpha = alpha + self.alphaSpin.SetValue(self._colour.alpha) + self.DrawAlpha() + + def SetPanelColours(self): + self.oldColourPanel.RefreshColour(self._oldColour) + self.newColourPanel.RefreshColour(self._colour) + if self.callback: + self.callback(self._colour.r, self._colour.g, self._colour.b, self._colour.alpha) class ObjectPropertyUI(ScrolledPanel): def __init__(self, parent, editor): self.editor = editor + self.colorPicker = None ScrolledPanel.__init__(self, parent) parentSizer = wx.BoxSizer(wx.VERTICAL) @@ -161,10 +178,57 @@ class ObjectPropertyUI(ScrolledPanel): self.SetSizer(None) self.Layout() self.SetupScrolling(self, scroll_y = True, rate_y = 20) + + def colorPickerCB(self, rr, gg, bb, aa): + r = rr / 255.0 + g = gg / 255.0 + b = bb / 255.0 + a = aa / 255.0 + self.propCR.setValue(r) + self.propCG.setValue(g) + self.propCB.setValue(b) + self.propCA.setValue(a) + + self.editor.objectMgr.updateObjectColor(r, g, b, a) + + def onColorSlider(self, evt): + r = float(self.editor.ui.objectPropertyUI.propCR.getValue()) + g = float(self.editor.ui.objectPropertyUI.propCG.getValue()) + b = float(self.editor.ui.objectPropertyUI.propCB.getValue()) + a = float(self.editor.ui.objectPropertyUI.propCA.getValue()) + + if self.colorPicker: + evtObj = evt.GetEventObject() + if evtObj == self.propCR.ui or\ + evtObj == self.propCR.ui.textValue: + self.colorPicker.redSpin.SetValue(r * 255) + self.colorPicker.AssignColourValue('r', r * 255, 255, 0) + elif evtObj == self.propCG.ui or\ + evtObj == self.propCG.ui.textValue: + self.colorPicker.greenSpin.SetValue(g * 255) + self.colorPicker.AssignColourValue('g', g * 255, 255, 0) + elif evtObj == self.propCB.ui or\ + evtObj == self.propCB.ui.textValue: + self.colorPicker.blueSpin.SetValue(b * 255) + self.colorPicker.AssignColourValue('b', b * 255, 255, 0) + else: + self.colorPicker._colour.alpha = a * 255 + self.colorPicker.alphaSpin.SetValue(self.colorPicker._colour.alpha) + self.colorPicker.DrawAlpha() + + self.editor.objectMgr.updateObjectColor(r, g, b, a) + + def openColorPicker(self, evt, colourData, alpha): + if self.colorPicker: + self.colorPicker.Destroy() + + self.colorPicker = ColorPicker(self, colourData, alpha=alpha, callback=self.colorPickerCB) + self.colorPicker.GetColourData().SetChooseFull(True) + self.colorPicker.Show() def updateProps(self, obj): self.clearPropUI() - + self.propPane = wx.Panel(self) mainSizer = wx.BoxSizer(wx.VERTICAL) mainSizer.Add(self.propPane, 1, wx.EXPAND, 0) @@ -186,14 +250,36 @@ class ObjectPropertyUI(ScrolledPanel): self.propSX, self.propSY, self.propSZ] sizer = wx.BoxSizer(wx.VERTICAL) - sizer.AddMany([self.propX, self.propY, self.propZ, self.propH, self.propP, self.propR, - self.propSX, self.propSY, self.propSZ]) + sizer.AddMany(transformProps) for transformProp in transformProps: transformProp.bindFunc(self.editor.objectMgr.onEnterObjectPropUI, self.editor.objectMgr.onLeaveObjectPropUI, self.editor.objectMgr.updateObjectTransform) - + + objNP = obj[OG.OBJ_NP] + objNP.setTransparency(1) + colorScale = objNP.getColorScale() + self.propCR = ObjectPropUISlider(self.propPane, 'CR', colorScale.getX(), 0, 1) + self.propCG = ObjectPropUISlider(self.propPane, 'CG', colorScale.getY(), 0, 1) + self.propCB = ObjectPropUISlider(self.propPane, 'CB', colorScale.getZ(), 0, 1) + self.propCA = ObjectPropUISlider(self.propPane, 'CA', colorScale.getW(), 0, 1) + colorProps = [self.propCR, self.propCG, self.propCB, self.propCA] + + for colorProp in colorProps: + colorProp.ui.bindFunc(self.onColorSlider) + + sizer.AddMany(colorProps) + button = wx.Button(self.propPane, -1, 'Color Picker', (0,0), (140, 20)) + _colourData = wx.ColourData() + _colourData.SetColour(wx.Colour(colorScale.getX() * 255, colorScale.getY() * 255, colorScale.getZ() * 255)) + button.Bind(wx.EVT_BUTTON, lambda p0=None, p1=_colourData, p2=colorScale.getW() * 255: self.openColorPicker(p0, p1, p2)) + + sizer.Add(button) + + if self.colorPicker: + self.openColorPicker(None, _colourData, colorScale.getW() * 255) + objDef = obj[OG.OBJ_DEF] if objDef.model is not None: diff --git a/direct/src/leveleditor/testData.py b/direct/src/leveleditor/testData.py index d6ff6394a8..0ca57ca461 100755 --- a/direct/src/leveleditor/testData.py +++ b/direct/src/leveleditor/testData.py @@ -15,6 +15,8 @@ if objects['1252538687.73gjeon']: objects['1252538687.73gjeon'].setPos(Point3(8.66381, 0, 7.13246)) objects['1252538687.73gjeon'].setHpr(VBase3(-180, 0, 0)) objects['1252538687.73gjeon'].setScale(VBase3(1, 1, 1)) + objects['1252538687.73gjeon'].setTransparency(1) + objects['1252538687.73gjeon'].setColorScale(VBase4(1, 1, 1, 1)) objectMgr.updateObjectProperties(objects['1252538687.73gjeon'], {'123': 1, 'Abc': 'a', 'Number': 1, 'Happy': True}) objects['1252538690.2gjeon'] = objectMgr.addNewObject('H Double Smiley', '1252538690.2gjeon', None, objects['1252538687.73gjeon']) @@ -22,6 +24,8 @@ if objects['1252538690.2gjeon']: objects['1252538690.2gjeon'].setPos(Point3(0, 0, 2.12046)) objects['1252538690.2gjeon'].setHpr(VBase3(0, 0, 0)) objects['1252538690.2gjeon'].setScale(VBase3(1, 1, 1)) + objects['1252538690.2gjeon'].setTransparency(1) + objects['1252538690.2gjeon'].setColorScale(VBase4(1, 1, 1, 1)) objectMgr.updateObjectProperties(objects['1252538690.2gjeon'], {'Distance': 2.0, 'Abc': 'a'}) objects['1252539696.69gjeon'] = objectMgr.addNewObject('H Double Smiley', '1252539696.69gjeon', None, objects['1252538687.73gjeon']) @@ -29,6 +33,8 @@ if objects['1252539696.69gjeon']: objects['1252539696.69gjeon'].setPos(Point3(-9.53674e-006, 0, 0)) objects['1252539696.69gjeon'].setHpr(VBase3(0, 0, 0)) objects['1252539696.69gjeon'].setScale(VBase3(1, 1, 1)) + objects['1252539696.69gjeon'].setTransparency(1) + objects['1252539696.69gjeon'].setColorScale(VBase4(1, 1, 1, 1)) objectMgr.updateObjectProperties(objects['1252539696.69gjeon'], {'Distance': 2.0, 'Abc': 'a'}) objects['1252539897.22gjeon'] = objectMgr.addNewObject('H Double Smiley', '1252539897.22gjeon', None, objects['1252538687.73gjeon']) @@ -36,6 +42,8 @@ if objects['1252539897.22gjeon']: objects['1252539897.22gjeon'].setPos(Point3(0.06987, 0, -2.12046)) objects['1252539897.22gjeon'].setHpr(VBase3(0, 0, 0)) objects['1252539897.22gjeon'].setScale(VBase3(1, 1, 1)) + objects['1252539897.22gjeon'].setTransparency(1) + objects['1252539897.22gjeon'].setColorScale(VBase4(1, 1, 1, 1)) objectMgr.updateObjectProperties(objects['1252539897.22gjeon'], {'Distance': 2.0, 'Abc': 'a'}) objects['1252538689.13gjeon'] = objectMgr.addNewObject('V Double Smiley', '1252538689.13gjeon', None, objects['1252538687.73gjeon']) @@ -43,6 +51,8 @@ if objects['1252538689.13gjeon']: objects['1252538689.13gjeon'].setPos(Point3(6.07152, 0, -0.863791)) objects['1252538689.13gjeon'].setHpr(VBase3(0, 0, 0)) objects['1252538689.13gjeon'].setScale(VBase3(1, 1, 1)) + objects['1252538689.13gjeon'].setTransparency(1) + objects['1252538689.13gjeon'].setColorScale(VBase4(1, 1, 1, 1)) objectMgr.updateObjectProperties(objects['1252538689.13gjeon'], {'Distance': 1.0, 'Abc': 'a'}) objects['1252539974.19gjeon'] = objectMgr.addNewObject('Smiley', '1252539974.19gjeon', 'models/frowney.egg', objects['1252538689.13gjeon']) @@ -50,6 +60,8 @@ if objects['1252539974.19gjeon']: objects['1252539974.19gjeon'].setPos(Point3(0.06987, 0, 3.09209)) objects['1252539974.19gjeon'].setHpr(VBase3(0, 0, 0)) objects['1252539974.19gjeon'].setScale(VBase3(1, 1, 1)) + objects['1252539974.19gjeon'].setTransparency(1) + objects['1252539974.19gjeon'].setColorScale(VBase4(1, 1, 1, 1)) objectMgr.updateObjectProperties(objects['1252539974.19gjeon'], {'123': 1, 'Abc': 'a', 'Number': 1, 'Happy': True}) objects['1252623762.9gjeon'] = objectMgr.addNewObject('Panda', '1252623762.9gjeon', None, None) @@ -57,6 +69,8 @@ if objects['1252623762.9gjeon']: objects['1252623762.9gjeon'].setPos(Point3(0, 0, 0)) objects['1252623762.9gjeon'].setHpr(VBase3(172.8, 0, 0)) objects['1252623762.9gjeon'].setScale(VBase3(0.005, 0.005, 0.005)) + objects['1252623762.9gjeon'].setTransparency(1) + objects['1252623762.9gjeon'].setColorScale(VBase4(1, 0, 0, 0.57)) objectMgr.updateObjectProperties(objects['1252623762.9gjeon'], {}) if hasattr(base, 'le'):