slightly buggy but does what I want!
only problem is updating the “animation” can be erratic just occasionally it will jump twice for one key press…
#!/usr/bin/python
import direct.directbase.DirectStart
from panda3d.core import Filename,Texture
from panda3d.core import AmbientLight,DirectionalLight
from panda3d.core import NodePath,TextNode
from panda3d.core import Point3,Vec3,Vec4,BillboardEffect
from direct.task.Task import Task
from direct.actor.Actor import Actor
from direct.gui.OnscreenText import OnscreenText
from direct.showbase.DirectObject import DirectObject
from panda3d.core import GraphicsOutput
from direct.gui.DirectGui import *
import sys,os,random
class MyDemo(DirectObject):
def __init__(self):
self.texOsb = Texture()
self.OsBuffer=base.win.makeTextureBuffer("offscreen buffer", 128, 128)
self.OsBuffer.addRenderTexture(self.texOsb, GraphicsOutput.RTMTriggeredCopyTexture)
self.OsRender=NodePath("offscreen renderer")
base.setBackgroundColor(0,0,0,1)
self.OsCam=base.makeCamera(self.OsBuffer)
self.OsCam.reparentTo(self.OsRender)
self.OsCam.setPos(0,-10,0)
self.teapot=loader.loadModel('models/teapot')
self.teapot.reparentTo(self.OsRender)
self.teapot.setPos(0,0,-2)
#self.teapot.hprInterval(1,Point3(360,360,360)).loop()
dlight = DirectionalLight('dlight')
alight = AmbientLight('alight')
dlnp = self.OsRender.attachNewNode(dlight)
alnp = self.OsRender.attachNewNode(alight)
dlight.setColor(Vec4(0.8, 0.2, 0.2, 1))
alight.setColor(Vec4(0.2, 0.2, 0.2, 1))
dlnp.setHpr(0, -60, 0) #!!! todo
self.OsRender.setLight(dlnp)
self.OsRender.setLight(alnp)
self.accept("v", base.bufferViewer.toggleEnable)
self.accept("V", base.bufferViewer.toggleEnable)
base.bufferViewer.setPosition("llcorner")
base.bufferViewer.setCardSize(1.0, 0.0)
self.accept("escape", sys.exit, [0])
self.accept("g", self.grab)
self.accept("G", self.grab)
self.txtPlane = loader.loadModel('samples/Texture-Swapping/models/plane')
self.txtPlane.setPos(0, 8, 1.5) #set its position
self.txtPlane.reparentTo(render) #reparent to render
self.txtPlane.setTexture(self.texOsb)
self.OsBuffer.setActive(True)
self.sleepNextFrame=True
taskMgr.add(self.sleeperTask,"sleeper task")
def grab(self):
self.OsBuffer.triggerCopy()
self.OsBuffer.setActive(True)
def sleeperTask(self,task):
# we have to do "animations" manually as no longer "realtime"
# need to find a better place for this......
# camera move in response to UI etc....
self.teapot.setH(self.teapot.getH()+0.017453293*36)
if (self.sleepNextFrame==False and self.OsBuffer.isActive()):
self.sleepNextFrame=True
return task.cont
if (self.sleepNextFrame==True):
self.sleepNextFrame=False
self.OsBuffer.setActive(False)
return task.cont
return task.cont
md=MyDemo()
run()