from Nametag import *
import NametagGlobals
from NametagConstants import *
from pandac.PandaModules import *
import math

class Nametag3d(Nametag):
    WANT_DYNAMIC_SCALING = True
    MAX_SCALE = 2.5
    SCALING_FACTOR = 0.055
    SCALING_MINDIST = 1
    SCALING_MAXDIST = math.pow(MAX_SCALE / SCALING_FACTOR, 2)

    BILLBOARD_OFFSET = 3.0
    SHOULD_BILLBOARD = True

    IS_3D = True

    def __init__(self):
        Nametag.__init__(self)

        self.contents = self.CName|self.CSpeech|self.CThought

        self.bbOffset = self.BILLBOARD_OFFSET
        self._doBillboard()

    def _doBillboard(self):
        if self.SHOULD_BILLBOARD:
            self.innerNP.setEffect(BillboardEffect.make(
                Vec3(0,0,1),
                True,
                False,
                self.bbOffset,
                NodePath(), # Empty; look at scene camera
                Point3(0,0,0)))
        else:
            self.bbOffset = 0.0

    def setBillboardOffset(self, bbOffset):
        self.bbOffset = bbOffset
        self._doBillboard()

    def tick(self):
        if not self.WANT_DYNAMIC_SCALING:
            scale = self.SCALING_FACTOR
        else:
            # Attempt to maintain the same on-screen size.
            distance = self.innerNP.getPos(NametagGlobals.camera).length()
            distance = max(min(distance, self.SCALING_MAXDIST), self.SCALING_MINDIST)

            scale = math.sqrt(distance)*self.SCALING_FACTOR

        self.innerNP.setScale(scale)

        # As 3D nametags can move around on their own, we need to update the
        # click frame constantly:
        path = NodePath.anyPath(self)
        if path.isHidden() or (path.getTop() != NametagGlobals.camera.getTop() and
                               path.getTop() != render2d):
            self.stashClickRegion()
        else:
            left, right, bottom, top = self.frame
            self.updateClickRegion(left*scale, right*scale,
                                   bottom*scale, top*scale,
                                   self.bbOffset)

    def getSpeechBalloon(self):
        return NametagGlobals.speechBalloon3d

    def getThoughtBalloon(self):
        return NametagGlobals.thoughtBalloon3d
