I wrote this awhile ago to test models under different lighting conditions.
import direct.directbase.DirectStart
import sys, math
from direct.showbase.DirectObject import DirectObject
from direct.gui.DirectGui import *
from pandac.PandaModules import *
from direct.task.Task import Task
class World (DirectObject):
def __init__(self):
#set initial RGBA values
self.R=0.00
self.G=0.00
self.B=0.00
self.A=0.00
#set values for camera movement
self.angledegrees = 0
self.angleradians = 0
self.camDist = 10
self.D2M = 1
#0 or 1, change the attribute's values or not
self.setColor = 0
self.setColorScale = 0
self.setBackgroundColor = 0
self.setAmbientLightColor = 0
self.setSpotLightColor = 0
#set up a dummy object
self.object2NP = render.attachNewNode("Dummy Node Name")
self.object2NP.setPos(0,0,0)
self.object2NP.setColor (1,1,0,1)
self.object2NP.setTransparency(TransparencyAttrib.MAlpha)
#set the camera
#base.oobe()
base.disableMouse()
base.camera.reparentTo(render)
base.camera.setPos(0,-10,1)
#set up lights
self.alight = AmbientLight('alight')
self.alight.setColor(VBase4(1, 1, 1, 1))
self.alnp = render.attachNewNode(self.alight)
render.setLight(self.alnp)
self.slight = Spotlight('sparky')
self.slight.setColor(Vec4(1,1,1,1))
lens = PerspectiveLens()
self.slight.setLens(lens)
self.slightNP = render.attachNewNode(self.slight)
self.slightNP.setPos(0,-10,0)
self.slightNP.setHpr(0,0,0)
render.setLight(self.slightNP)
self.accept("escape", sys.exit)
self.accept("arrow_up", self.zoomIn)
self.accept("arrow_down", self.zoomOut)
self.accept("arrow_left", self.orbitL)
self.accept("arrow_left-up", self.orbitoff)
self.accept("arrow_right", self.orbitR)
self.accept("arrow_right-up", self.orbitoff)
self.accept("p", self.getWidgetTransformsF)
#input box , what model is loaded
self.fileLoaderButton = DirectEntry(pad =(0.05,0.05), pos=(0.3, 0, 0.5), text = "" ,scale=.07,command=self.setFileNameF, initialText="Enter file name of the model.egg", numLines = 1,focus=0, focusInCommand=self.clearText)
#checkboxes to determine what attributes are affected
self.setColorButton = DirectCheckButton(pos=(-1.14333, 0, 0.64),
text = "setColor " ,scale=.06,command=self.setColorF)
self.setColorScaleButton = DirectCheckButton(pos=(-1.08333, 0, 0.56),
text = "setColorScale " ,scale=.06,command=self.setColorScaleF)
self.setBackgroundColorButton = DirectCheckButton(pos=Point3(-1.01333, 0, 0.483333),
text = "setBackgroundColor " ,scale=.06,command=self.setBackgroundColorF)
self.setAmbientLightColorButton= DirectCheckButton(pos=Point3(-1, 0, 0.396667),
text = "setAmbientLightColor" ,scale=.06,command=self.setAmbientLightColorF)
self.setSpotLightColorButton= DirectCheckButton(pos=Point3(-1, 0, 0.306667),
text = "setSpotLightColor" ,scale=.06,command=self.setSpotLightColorF)
#label for sliders
self.rLabel = DirectLabel(text = "r", pos = Point3(0.0533333, 0, -0.54), scale = 0.09, text_bg = (1,1,1,1), text_fg=(1,0,0,1))
self.gLabel = DirectLabel(text = "g", pos = Point3(-0.233333, 0, -0.63), scale = 0.09, text_bg = (1,1,1,1), text_fg=(0,1.0,0,1))
self.bLabel = DirectLabel(text = "b", pos = Point3(0.0866667, 0, -0.74), scale = 0.09, text_bg = (1,1,1,1), text_fg=(0,0,1,1))
self.aLabel = DirectLabel(text = "a", pos = Point3(0.0933333, 0, -0.89), scale = 0.09, text_bg = (1,1,1,1), text_fg=(0,0,0,1))
#set up sliders
self.Rslider=DirectSlider(range=(0,1), value=1, pageSize=0.05, command=self.setRF, scale = 0.55, pos=Point3(0.683333, 0, -0.54))
self.Gslider=DirectSlider(range=(0,1), value=1, pageSize=0.05, command=self.setGF, scale = 0.55, pos=Point3(0.363333, 0, -0.623333))
self.Bslider=DirectSlider(range=(0,1), value=1, pageSize=0.02, command=self.setBF, scale = 0.55, pos=Point3(0.693333, 0, -0.706667))
self.Aslider=DirectSlider(range=(0,1), value=1, pageSize=0.02, command=self.setAF, scale = 0.55, pos=Point3(0.69, 0, -0.876667))
#setup output box
self.rgbaValuesLabel = DirectLabel(text = " ", pos = (-1, 0, -0.73), scale = 0.07, text_fg=(1,0.0,0.0,1))
#add print button to output RBGA value
self.printButton = DirectButton(pad=(0.04,0.04), text = ("Print the values", "PRINTING", "Print the values", "disabled"),pos=Point3(-1, 0, -0.85), scale=.09,command=self.printF)
def getWidgetTransformsF(self):
for child in aspect2d.getChildrenAsList():
print child, " position = ", child.getPos()
print child, " scale = ", child.getScale()
def setColorF (self, status):
if(status):
self.setColor = 1
else:
self.setColor = 0
def setColorScaleF (self, status):
if(status):
self.setColorScale = 1
else:
self.setColorScale = 0
def setBackgroundColorF (self, status):
if(status):
self.setBackgroundColor = 1
else:
self.setBackgroundColor = 0
def setAmbientLightColorF (self, status):
if(status):
self.setAmbientLightColor = 1
else:
self.setAmbientLightColor = 0
def setSpotLightColorF (self, status):
if(status):
self.setSpotLightColor = 1
else:
self.setSpotLightColor = 0
def clearText(self):
self.fileLoaderButton.enterText('')
def setFileNameF(self, textEntered):
try:
self.object2NP = loader.loadModel(textEntered)
self.object2NP.reparentTo(render)
self.object2NP.setPos(0,0,0)
self.object2NP.setColor (1,1,0,1)
self.object2NP.setTransparency(TransparencyAttrib.MAlpha)
except AttributeError:
self.fileLoaderButton.enterText('model not found')
def orbitR(self):
taskMgr.add(self.SpinCameraRTask, "SpinTask")
def orbitL(self):
taskMgr.add(self.SpinCameraLTask, "SpinTask")
def orbitoff(self):
taskMgr.remove("SpinTask")
def SpinCameraLTask(self, task):
base.camera.setHpr(base.camera.getH()-1, 0, 0)
self.angleradians = base.camera.getH() * (math.pi / 180.0)
base.camera.setPos(self.camDist*math.sin(self.angleradians),-self.camDist*math.cos(self.angleradians),1)
return Task.cont
def SpinCameraRTask(self, task):
base.camera.setHpr(base.camera.getH()+1, 0, 0)
self.angleradians = base.camera.getH() * (math.pi / 180.0)
base.camera.setPos(self.camDist*math.sin(self.angleradians),-self.camDist*math.cos(self.angleradians),1)
return Task.cont
def zoomIn(self):
radian = base.camera.getH()*math.pi/180.0
dx = self.D2M*-math.sin(radian)
dy = self.D2M*+math.cos(radian)
base.camera.setPos(Vec3(base.camera.getX()+dx,base.camera.getY()+dy,1))
self.camDist = self.camDist -1
def zoomOut(self):
radian = base.camera.getH()*math.pi/180.0
dx = self.D2M*+math.sin(radian)
dy = self.D2M*-math.cos(radian)
base.camera.setPos(Vec3(base.camera.getX()+dx,base.camera.getY()+dy,1))
self.camDist = self.camDist +1
def setRF(self):
self.R = self.Rslider['value']
self.update()
def setGF(self):
self.G = self.Gslider['value']
self.update ()
def setBF(self):
self.B = self.Bslider['value']
self.update ()
def setAF(self):
self.A = self.Aslider['value']
self.update ()
def printF(self):
#print "setColor(%.2f, %.2f, %.2f, %.2f)" % (self.R, self.G, self.B, self.A)
print "setColor(%s)" % (self.object2NP.getColor())
print "setColorScale(%s)" % (self.object2NP.getColorScale())
print "setBackgroundColor(%s)" % (base.getBackgroundColor())
print "ambientlight setColor(%s)" % (self.alight.getColor())
print "spotlight setColor(%s)" % (self.slight.getColor())
def update(self):
self.rgbaValuesLabel ['text'] = "(%.2f, %.2f, %.2f, %.2f)" % (self.R, self.G, self.B, self.A)
if self.setColor == 1 :
self.object2NP.setColor(self.R, self.G, self.B, self.A)
if self.setColorScale == 1 :
self.object2NP.setColorScale(self.R, self.G, self.B, self.A)
if self.setBackgroundColor == 1 :
base.setBackgroundColor(self.R, self.G, self.B, self.A)
if self.setAmbientLightColor == 1 :
self.alight.setColor(VBase4(self.R, self.G, self.B, self.A))
if self.setSpotLightColor == 1 :
self.slight.setColor(VBase4(self.R, self.G, self.B, self.A))
w = World()
run()