223 lines
8.1 KiB
Python
223 lines
8.1 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
|
|
import random
|
|
|
|
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):
|
|
NodePath.hide(self)
|
|
|
|
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 SpecialsPhoto(NodePath):
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('SpecialsPhoto')
|
|
|
|
def __init__(self, type = None, parent = aspect2d):
|
|
NodePath.__init__(self)
|
|
self.assign(parent.attachNewNode('SpecialsPhoto'))
|
|
self.type = type
|
|
self.actor = None
|
|
self.sound = None
|
|
self.soundTrack = None
|
|
self.track = None
|
|
self.specialsFrame = None
|
|
return
|
|
|
|
def destroy(self):
|
|
self.hide()
|
|
if hasattr(self, 'background'):
|
|
self.background.destroy()
|
|
del self.background
|
|
if hasattr(self, 'specialsFrame') and hasattr(self.specialsFrame, 'destroy'):
|
|
self.specialsFrame.destroy()
|
|
if hasattr(self, 'toonStatuary'):
|
|
if self.toonStatuary.toon:
|
|
self.toonStatuary.deleteToon()
|
|
self.type = None
|
|
del self.soundTrack
|
|
del self.track
|
|
self.parent = None
|
|
return
|
|
|
|
def update(self, type):
|
|
self.type = type
|
|
|
|
def setBackBounds(self, *bounds):
|
|
self.backBounds = bounds
|
|
|
|
def setBackColor(self, *colors):
|
|
self.backColor = colors
|
|
|
|
def load(self):
|
|
pass
|
|
|
|
def makeSpecialsFrame(self, actor):
|
|
actor.setDepthTest(1)
|
|
actor.setDepthWrite(1)
|
|
if not hasattr(self, 'specialsDisplayRegion'):
|
|
self.specialsDisplayRegion = DirectRegion(parent=self)
|
|
apply(self.specialsDisplayRegion.setBounds, self.backBounds)
|
|
apply(self.specialsDisplayRegion.setColor, self.backColor)
|
|
frame = self.specialsDisplayRegion.load()
|
|
pitch = frame.attachNewNode('pitch')
|
|
rotate = pitch.attachNewNode('rotate')
|
|
scale = rotate.attachNewNode('scale')
|
|
actor.reparentTo(scale)
|
|
if actor.getTightBounds():
|
|
bMin, bMax = actor.getTightBounds()
|
|
center = (bMin + bMax) / 2.0
|
|
actor.setPos(-center[0], -center[1], -center[2])
|
|
else:
|
|
actor.setPos(0, 0, 0)
|
|
pitch.setY(2.5)
|
|
return frame
|
|
|
|
def loadModel(self, specialsIndex):
|
|
if specialsIndex == -1:
|
|
nodePath = self.attachNewNode('blank')
|
|
return nodePath
|
|
if specialsIndex >= 105 and specialsIndex <= 108:
|
|
from toontown.estate import DistributedToonStatuary
|
|
self.toonStatuary = DistributedToonStatuary.DistributedToonStatuary(None)
|
|
self.toonStatuary.setupStoneToon(base.localAvatar.style)
|
|
self.toonStatuary.poseToonFromSpecialsIndex(specialsIndex)
|
|
self.toonStatuary.toon.setH(180)
|
|
pedestalModelPath = GardenGlobals.Specials[specialsIndex]['photoModel']
|
|
pedestal = loader.loadModel(pedestalModelPath)
|
|
self.toonStatuary.toon.reparentTo(pedestal)
|
|
pedestal.setScale(GardenGlobals.Specials[specialsIndex]['photoScale'] * 0.5)
|
|
return pedestal
|
|
elif specialsIndex == 135:
|
|
model = Actor.Actor()
|
|
modelPath = GardenGlobals.Specials[specialsIndex]['photoModel']
|
|
anims = GardenGlobals.Specials[specialsIndex]['photoAnimation']
|
|
animPath = modelPath + anims[1]
|
|
model.loadModel(modelPath + anims[0])
|
|
model.loadAnims(dict([[anims[1], animPath]]))
|
|
frameNo = random.randint(1, 2)
|
|
model.pose(anims[1], 1)
|
|
model.setScale(GardenGlobals.Specials[specialsIndex]['photoScale'] * 0.1)
|
|
return model
|
|
else:
|
|
modelName = GardenGlobals.Specials[specialsIndex]['photoModel']
|
|
nodePath = loader.loadModel(modelName)
|
|
desat = None
|
|
colorTuple = (1, 1, 1)
|
|
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)
|
|
nodePath.setScale(GardenGlobals.Specials[specialsIndex]['photoScale'] * 0.5)
|
|
return nodePath
|
|
return
|
|
|
|
def show(self, showBackground = 0):
|
|
self.notify.debug('show')
|
|
messenger.send('wakeup')
|
|
if self.specialsFrame:
|
|
if hasattr(self.actor, 'cleanup'):
|
|
self.actor.cleanup()
|
|
if hasattr(self, 'specialsDisplayRegion'):
|
|
self.specialsDisplayRegion.unload()
|
|
self.hide()
|
|
self.actor = self.loadModel(self.type)
|
|
self.specialsFrame = self.makeSpecialsFrame(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.specialsFrame)
|
|
|
|
def hide(self):
|
|
NodePath.hide(self)
|
|
if hasattr(self, 'specialsDisplayRegion'):
|
|
self.specialsDisplayRegion.unload()
|
|
if hasattr(self, 'background'):
|
|
self.background.hide()
|
|
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
|
|
if hasattr(self, 'toonStatuary'):
|
|
if self.toonStatuary.toon:
|
|
self.toonStatuary.deleteToon()
|
|
return
|
|
|
|
def changeVariety(self, variety):
|
|
self.variety = variety
|