toontown-just-works/toontown/estate/FlowerPhoto.py
2024-07-07 18:08:39 -05:00

202 lines
6.9 KiB
Python

from direct.directnotify import DirectNotifyGlobal
from panda3d.core import *
from direct.interval.IntervalGlobal import *
from toontown.fishing import FishGlobals
import GardenGlobals
from direct.actor import Actor
class DirectRegion(NodePath):
notify = DirectNotifyGlobal.directNotify.newCategory('DirectRegion')
def __init__(self, parent = aspect2d):
NodePath.__init__(self)
self.assign(parent.attachNewNode('DirectRegion'))
def destroy(self):
self.unload()
self.parent = None
return
def setBounds(self, *bounds):
self.bounds = bounds
def setColor(self, *colors):
self.color = colors
def show(self):
pass
def hide(self):
pass
def load(self):
if not hasattr(self, 'cRender'):
self.cRender = NodePath('fishSwimRender')
self.fishSwimCamera = self.cRender.attachNewNode('fishSwimCamera')
self.cCamNode = Camera('fishSwimCam')
self.cLens = PerspectiveLens()
self.cLens.setFov(40, 40)
self.cLens.setNear(0.1)
self.cLens.setFar(100.0)
self.cCamNode.setLens(self.cLens)
self.cCamNode.setScene(self.cRender)
self.fishSwimCam = self.fishSwimCamera.attachNewNode(self.cCamNode)
cm = CardMaker('displayRegionCard')
apply(cm.setFrame, self.bounds)
self.card = card = self.attachNewNode(cm.generate())
apply(card.setColor, self.color)
newBounds = card.getTightBounds()
ll = render2d.getRelativePoint(card, newBounds[0])
ur = render2d.getRelativePoint(card, newBounds[1])
newBounds = [ll.getX(),
ur.getX(),
ll.getZ(),
ur.getZ()]
newBounds = map(lambda x: max(0.0, min(1.0, (x + 1.0) / 2.0)), newBounds)
self.cDr = base.win.makeDisplayRegion(*newBounds)
self.cDr.setSort(10)
self.cDr.setClearColor(card.getColor())
self.cDr.setClearDepthActive(1)
self.cDr.setClearColorActive(1)
self.cDr.setCamera(self.fishSwimCam)
return self.cRender
def unload(self):
if hasattr(self, 'cRender'):
base.win.removeDisplayRegion(self.cDr)
del self.cRender
del self.fishSwimCamera
del self.cCamNode
del self.cLens
del self.fishSwimCam
del self.cDr
class FlowerPhoto(NodePath):
notify = DirectNotifyGlobal.directNotify.newCategory('FlowerPhoto')
def __init__(self, species = None, variety = None, parent = aspect2d):
NodePath.__init__(self)
self.assign(parent.attachNewNode('FlowerPhoto'))
self.species = species
self.variety = variety
self.actor = None
self.sound = None
self.soundTrack = None
self.track = None
self.flowerFrame = None
return
def destroy(self):
self.hide()
if hasattr(self, 'background'):
del self.background
self.fish = None
del self.soundTrack
del self.track
self.parent = None
return
def update(self, species, variety):
self.species = species
self.variety = variety
def setSwimBounds(self, *bounds):
self.swimBounds = bounds
def setSwimColor(self, *colors):
self.swimColor = colors
def load(self):
pass
def makeFlowerFrame(self, actor):
actor.setDepthTest(1)
actor.setDepthWrite(1)
if not hasattr(self, 'flowerDisplayRegion'):
self.flowerDisplayRegion = DirectRegion(parent=self)
apply(self.flowerDisplayRegion.setBounds, self.swimBounds)
apply(self.flowerDisplayRegion.setColor, self.swimColor)
frame = self.flowerDisplayRegion.load()
pitch = frame.attachNewNode('pitch')
rotate = pitch.attachNewNode('rotate')
scale = rotate.attachNewNode('scale')
actor.reparentTo(scale)
bMin, bMax = actor.getTightBounds()
center = (bMin + bMax) / 2.0
actor.setPos(-center[0], -center[1], -center[2])
attrib = GardenGlobals.PlantAttributes[self.species]
if 'photoPos' in attrib:
self.notify.debug('oldPos = %s' % actor.getPos())
photoPos = attrib['photoPos']
self.notify.debug('newPos = %s' % str(photoPos))
actor.setPos(photoPos[0], photoPos[1], photoPos[2])
scale.setScale(attrib['photoScale'])
rotate.setH(attrib['photoHeading'])
pitch.setP(attrib['photoPitch'])
pitch.setY(1.75)
return frame
def loadModel(self, species, variety):
modelName = GardenGlobals.PlantAttributes[species]['fullGrownModel']
nodePath = loader.loadModel(modelName)
desat = None
flowerColorIndex = GardenGlobals.PlantAttributes[species]['varieties'][variety][1]
colorTuple = GardenGlobals.FlowerColors[flowerColorIndex]
useWilted = 0
wilt = nodePath.find('**/*wilt*')
bloom = nodePath.find('**/*bloom*')
if useWilted:
wilt.show()
desat = wilt.find('**/*desat*')
bloom.hide()
else:
bloom.show()
desat = bloom.find('**/*desat*')
wilt.hide()
if desat and not desat.isEmpty():
desat.setColorScale(colorTuple[0], colorTuple[1], colorTuple[2], 1.0)
else:
nodePath.setColorScale(colorTuple[0], colorTuple[1], colorTuple[2], 1.0)
return nodePath
def show(self, showBackground = 0):
self.notify.debug('show')
messenger.send('wakeup')
if self.flowerFrame:
if hasattr(self.actor, 'cleanup'):
self.actor.cleanup()
if hasattr(self, 'flowerDisplayRegion'):
self.flowerDisplayRegion.unload()
self.hide()
self.actor = self.loadModel(self.species, self.variety)
self.flowerFrame = self.makeFlowerFrame(self.actor)
if showBackground:
if not hasattr(self, 'background'):
background = loader.loadModel('phase_3.5/models/gui/stickerbook_gui')
background = background.find('**/Fish_BG')
self.background = background
self.background.setPos(0, 15, 0)
self.background.setScale(11)
self.background.reparentTo(self.flowerFrame)
def hide(self):
if hasattr(self, 'flowerDisplayRegion'):
self.flowerDisplayRegion.unload()
if self.actor:
if hasattr(self.actor, 'stop'):
self.actor.stop()
self.actor.hide()
if self.sound:
self.sound.stop()
self.sound = None
if self.soundTrack:
self.soundTrack.pause()
self.soundTrack = None
if self.track:
self.track.pause()
self.track = None
return
def changeVariety(self, variety):
self.variety = variety