329 lines
11 KiB
Python
329 lines
11 KiB
Python
import math
|
|
|
|
from panda3d.core import *
|
|
|
|
from . import NametagGlobals
|
|
from .MarginPopup import MarginPopup
|
|
from .Nametag import Nametag
|
|
from ._constants import *
|
|
|
|
|
|
class Nametag2d(Nametag, MarginPopup):
|
|
def __init__(self):
|
|
Nametag.__init__(self, 8.075)
|
|
MarginPopup.__init__(self)
|
|
|
|
self.m_copied_np = None
|
|
self.m_attached_np = None
|
|
self.m_arrow = None
|
|
self.m_unknown_np = None
|
|
|
|
# self.setCullCallback()
|
|
self.cbNode = CallbackNode(self.getName() + '-cbNode')
|
|
self.cbNode.setCullCallback(PythonCallbackObject(self.cullCallback))
|
|
self.addChild(self.cbNode)
|
|
|
|
self.setName('unnamed')
|
|
|
|
self.m_contents = 3
|
|
self.m_chat_contents = 0
|
|
self.updateContents()
|
|
self.m_on = NametagGlobals._master_arrows_on
|
|
self.m_seq2d = 0
|
|
|
|
self.m_trans_vec = Vec3(0, 0, 0)
|
|
|
|
def setVisible(self, value):
|
|
self.m_visible = value
|
|
self.updateContents()
|
|
|
|
def manage(self, manager):
|
|
self.updateContents()
|
|
manager.managePopup(self)
|
|
|
|
def unmanage(self, manager):
|
|
Nametag.unmanage(self, manager)
|
|
manager.unmanagePopup(self)
|
|
|
|
def setObjectCode(self, objcode):
|
|
if self.m_group:
|
|
self.m_group.setObjectCode(objcode)
|
|
|
|
def getObjectCode(self):
|
|
if self.m_group:
|
|
return self.m_group.getObjectCode()
|
|
|
|
return 0
|
|
|
|
def getScore(self):
|
|
if self.m_group:
|
|
return 1000 - self.getDistance2()
|
|
|
|
return 0
|
|
|
|
def getDistance2(self):
|
|
if self.m_avatar:
|
|
np = self.m_avatar
|
|
|
|
else:
|
|
np = self.m_group.getAvatar()
|
|
|
|
if np.isEmpty():
|
|
return 0
|
|
|
|
return np.getPos(NametagGlobals._toon).lengthSquared()
|
|
|
|
def considerVisible(self):
|
|
from .NametagGroup import NametagGroup
|
|
|
|
v2 = 0
|
|
do_update = True
|
|
if self.m_on != NametagGlobals._master_arrows_on:
|
|
self.m_on = NametagGlobals._master_arrows_on
|
|
v2 = 1
|
|
|
|
if self.m_seq2d == NametagGlobals._margin_prop_seq:
|
|
if not v2:
|
|
do_update = False
|
|
|
|
else:
|
|
self.m_seq2d = NametagGlobals._margin_prop_seq
|
|
|
|
if do_update:
|
|
self.updateContents()
|
|
|
|
if not self.m_chat_contents:
|
|
return 0
|
|
|
|
result = self.m_group.m_nametag3d_flag != 2
|
|
if NametagGlobals._onscreen_chat_forced and self.m_chat_contents & (Nametag.CSpeech | Nametag.CThought):
|
|
result = 1
|
|
|
|
self.m_group.setNametag3dFlag(0)
|
|
if result and self.m_group.getColorCode() in (NametagGroup.CCToonBuilding,
|
|
NametagGroup.CCSuitBuilding,
|
|
NametagGroup.CCHouseBuilding):
|
|
return self.getDistance2() < 1600
|
|
|
|
return result
|
|
|
|
def updateContents(self):
|
|
self.stopFlash()
|
|
if self.m_group:
|
|
self.setName(self.m_group.getName())
|
|
|
|
else:
|
|
self.setName('unnamed')
|
|
|
|
if self.m_copied_np:
|
|
self.m_copied_np.removeNode()
|
|
|
|
if self.m_attached_np:
|
|
self.m_attached_np.removeNode()
|
|
|
|
if self.m_arrow:
|
|
self.m_arrow.removeNode()
|
|
|
|
if self.m_unknown_np:
|
|
self.m_unknown_np.removeNode()
|
|
|
|
self.m_chat_contents = self.determineContents()
|
|
if not NametagGlobals._master_arrows_on:
|
|
self.m_chat_contents = self.m_chat_contents & ~1
|
|
|
|
if self.m_visible and self.isGroupManaged():
|
|
v10 = self.m_chat_contents
|
|
if v10 & Nametag.CSpeech:
|
|
self.generateChat(NametagGlobals._speech_balloon_2d)
|
|
|
|
elif v10 & Nametag.CThought:
|
|
self.generateChat(NametagGlobals._thought_balloon_2d)
|
|
|
|
elif v10 & Nametag.CName:
|
|
self.generateName()
|
|
|
|
def frameCallback(self):
|
|
if self.m_visible and self.m_popup_region:
|
|
self.m_seq = self.m_group.m_region_seq
|
|
|
|
if self.m_group:
|
|
self.m_group.updateRegions()
|
|
|
|
def rotateArrow(self):
|
|
if not self.m_arrow:
|
|
return
|
|
|
|
if self.m_avatar:
|
|
np = self.m_avatar
|
|
|
|
else:
|
|
np = self.m_group.getAvatar()
|
|
|
|
if not np:
|
|
return
|
|
|
|
relpos = np.getPos(NametagGlobals._camera) - NametagGlobals._toon.getPos(NametagGlobals._camera)
|
|
hpr = Vec3(0, 0, -math.atan2(relpos[1], relpos[0]) * 180 / math.pi)
|
|
scale = Vec3(0.5, 0.5, 0.5)
|
|
shear = Vec3(0, 0, 0)
|
|
|
|
temp_mat_3 = Mat3()
|
|
composeMatrix(temp_mat_3, scale, shear, hpr)
|
|
arrow_mat = Mat4(temp_mat_3, self.m_trans_vec)
|
|
self.m_arrow.setMat(arrow_mat)
|
|
|
|
def generateName(self):
|
|
v4 = self.getState()
|
|
v84 = Vec4(NametagGlobals.getNameFg(self.m_group.getColorCode(), v4))
|
|
v75 = Vec4(NametagGlobals.getNameBg(self.m_group.getColorCode(), v4))
|
|
v75[3] = max(v75[3], NametagGlobals._min_2d_alpha)
|
|
v75[3] = min(v75[3], NametagGlobals._max_2d_alpha)
|
|
|
|
v67 = NametagGlobals._card_pad[3] + self.m_group.m_name_frame[3]
|
|
v68 = self.m_group.m_name_frame[2] - NametagGlobals._card_pad[2]
|
|
|
|
wordwrap = self.m_group.getNameWordwrap()
|
|
v17 = self.m_cell_width / wordwrap * 2.0
|
|
v66 = 0.333 * (1.0 / v17) - (v68 + v67) * 0.5
|
|
v18 = min(1.0 / v17 - v67, v66)
|
|
|
|
v69 = Mat4(v17, 0, 0, 0,
|
|
0, v17, 0, 0,
|
|
0, 0, v17, 0,
|
|
0, 0, v18 * v17, 1.0)
|
|
a3 = v69
|
|
|
|
if v75[3] != 0.0:
|
|
card = CardMaker('nametag')
|
|
card.setFrame(self.m_group.m_name_frame[0] - NametagGlobals._card_pad[0],
|
|
self.m_group.m_name_frame[1] + NametagGlobals._card_pad[1],
|
|
v68, v67)
|
|
card.setColor(v75)
|
|
if NametagGlobals._nametag_card:
|
|
card.setSourceGeometry(NametagGlobals._nametag_card.node(),
|
|
NametagGlobals._nametag_card_frame)
|
|
|
|
self.m_attached_np = self.m_np.attachNewNode(card.generate())
|
|
self.m_attached_np.setMat(v69)
|
|
if v75[3] != 1.0:
|
|
self.m_attached_np.setTransparency(1)
|
|
|
|
if self.m_has_draw_order:
|
|
bin = config.GetString('nametag-fixed-bin', 'fixed')
|
|
self.m_attached_np.setBin(bin, self.m_draw_order)
|
|
|
|
self.m_copied_np = self.m_group.copyNameTo(self.m_np)
|
|
self.m_copied_np.setMat(a3)
|
|
if self.m_has_draw_order:
|
|
bin = config.GetString('nametag-fixed-bin', 'fixed')
|
|
self.m_copied_np.setBin(bin, self.m_draw_order)
|
|
|
|
self.m_copied_np.setColor(v84)
|
|
if v84[3] != 1.0:
|
|
self.m_copied_np.setTransparency(1)
|
|
|
|
reducer = SceneGraphReducer()
|
|
reducer.applyAttribs(self.m_copied_np.node())
|
|
reducer.applyAttribs(self.m_attached_np.node())
|
|
|
|
if NametagGlobals._arrow_model:
|
|
self.m_arrow = NametagGlobals._arrow_model.copyTo(self.m_np)
|
|
if self.m_has_draw_order:
|
|
bin = config.GetString('nametag-fixed-bin', 'fixed')
|
|
self.m_arrow.setBin(bin, self.m_draw_order)
|
|
|
|
self.m_trans_vec = a3.xformPoint(Point3(0, 0, v68 - 1.0))
|
|
|
|
color = Vec4(NametagGlobals.getArrowColor(self.m_group.getColorCode()))
|
|
self.m_arrow.setColor(color)
|
|
if color[3] != 1.0:
|
|
self.m_arrow.setTransparency(1)
|
|
|
|
self.rotateArrow()
|
|
|
|
elif self.m_arrow:
|
|
self.m_arrow.removeNode()
|
|
|
|
v69 = self.m_np.getNetTransform().getMat()
|
|
v69 = a3 * v69
|
|
|
|
v77 = v69.xformPoint(Point3(self.m_group.m_name_frame[0] - NametagGlobals._card_pad[0], 0, v68))
|
|
v80 = v69.xformPoint(Point3(self.m_group.m_name_frame[1] + NametagGlobals._card_pad[1], 0, v67))
|
|
|
|
frame = Vec4(v77[0], v80[0], v77[2], v80[2])
|
|
self.setRegion(frame, 0)
|
|
|
|
def generateChat(self, balloon):
|
|
v5 = self.getState()
|
|
text_color = Vec4(NametagGlobals.getChatFg(self.m_group.getColorCode(), v5))
|
|
balloon_color = Vec4(NametagGlobals.getChatBg(self.m_group.getColorCode(), v5))
|
|
|
|
if self.m_group.m_chat_flags & CFQuicktalker:
|
|
balloon_color = Vec4(self.m_group.getQtColor())
|
|
|
|
balloon_color[3] = max(balloon_color[3], NametagGlobals._min_2d_alpha)
|
|
balloon_color[3] = min(balloon_color[3], NametagGlobals._max_2d_alpha)
|
|
|
|
text = self.m_group.getChat()
|
|
if self.m_group.m_name:
|
|
text = '%s: %s' % (self.m_group.m_name, text)
|
|
|
|
has_page_button = False
|
|
has_quit_button = False
|
|
if not self.m_group.m_has_timeout:
|
|
has_page_button = self.m_group.m_chat_flags & CFPageButton
|
|
if self.m_group.getPageNumber() >= self.m_group.getNumChatPages() - 1:
|
|
if self.m_group.m_chat_flags & CFQuitButton:
|
|
has_page_button = False
|
|
has_quit_button = True
|
|
|
|
page_button = None
|
|
if has_page_button:
|
|
page_button = NametagGlobals.getPageButton(v5)
|
|
|
|
elif has_quit_button:
|
|
page_button = NametagGlobals.getQuitButton(v5)
|
|
|
|
reversed = self.m_group.m_chat_flags & CFReversed
|
|
new_button = [None]
|
|
balloon_result = balloon.generate(text, self.m_group.getChatFont(), self.m_wordwrap,
|
|
text_color, balloon_color, False,
|
|
self.m_has_draw_order, self.m_draw_order,
|
|
page_button, self.m_group.willHaveButton(),
|
|
reversed, new_button)
|
|
|
|
self.m_unknown_np = self.m_np.attachNewNode(balloon_result)
|
|
|
|
v88 = 8.0 # XXX THIS IS A GUESS
|
|
v49 = 2 * self.m_cell_width
|
|
a6 = v49 / (v88 + 1.0)
|
|
v50 = balloon.m_text_height * balloon.m_hscale
|
|
v85 = balloon.m_hscale * 5.0
|
|
v88 = v50 * 0.5
|
|
v113 = -(balloon.m_hscale * 0.5 + v85)
|
|
v51 = -(NametagGlobals._balloon_text_origin[2] + v88)
|
|
v118 = Mat4(a6, 0, 0, 0,
|
|
0, a6, 0, 0,
|
|
0, 0, a6, 0,
|
|
v113 * a6, 0, v51 * a6, 1.0)
|
|
|
|
self.m_unknown_np.setMat(v118)
|
|
|
|
reducer = SceneGraphReducer()
|
|
reducer.applyAttribs(self.m_unknown_np.node())
|
|
|
|
v66 = self.m_np.getNetTransform().getMat()
|
|
|
|
# XXX THE LINES BELOW ARE A GUESS
|
|
v67 = v113 * a6
|
|
v68 = v51 * a6
|
|
v94 = v66.xformPoint(Point3(v67, 0.0, v68))
|
|
v97 = v66.xformPoint(Point3(-v67, 0.0, -v68))
|
|
|
|
frame = Vec4(v94[0], v97[0], v94[2], v97[2])
|
|
self.setRegion(frame, 0)
|
|
|
|
def cullCallback(self, *args):
|
|
self.rotateArrow()
|
|
if self.m_visible and self.m_popup_region:
|
|
self.m_seq = self.m_group.getRegionSeq()
|