Init Repo

This commit is contained in:
indigo 2023-09-26 12:58:24 +08:00
commit 543f4944e4
14 changed files with 4196 additions and 0 deletions

83
license.txt Normal file
View File

@ -0,0 +1,83 @@
最終使用者授權協議/對收集和使用您個人資訊的同意
重要 :
在使用本軟體前,請先詳細閱讀本最終使用者授權協議 (以下簡稱「授權協議」)。您使用本軟體即表示您接受本授權協議之條款。如果您不接受本授權協議之條款,即不得使用本軟體。
本授權協議是您與Indigo Digital Studio公司 (以下簡稱「IDS」) 間的法律協議。本授權協議管轄您以下相關之權利和義務IDS和 (或) 其第三人授權人 (包括IDS之關係企業) 以及其各自之關係企業 (以下合稱「第三人供應商」) 之 SongPal 軟體連同IDS提供之任何更新 / 升級、該軟體之任何印刷、線上或其他電子文件,以及因該軟體之操作而創造之任何資料檔案 (以下合稱本「軟體」)。
儘管有前述約定,本軟體中如任何軟體有單獨之最終使用者授權協議 (包括但不限於GNU通用公共授權和較寬 / 圖書館通用公共授權),且如為該等適用之單獨最終使用者授權協議所規定時,則相關軟體即應受該等單獨最終使用者授權協議所管轄而取代本授權協議之條款 (以下簡稱「排除軟體」)。
軟體授權
本軟體係授權軟體,並非販售軟體。本軟體受著作權和其他智慧財產法律與國際條約保護。
著作權
本軟體 (包括但不限於納入本軟體中之任何影像、照片、動畫、影片、聲音、音樂、文字和「小應用程式」) 之一切權利和所有權均為IDS或某個或數個第三人供應商所有。
授權
IDS授予您使用本軟體之有限授權但僅限與您的相容裝置 (以下簡稱「裝置」) 相關且僅供您個人非商業使用。IDS和第三人供應商均明示保留本授權協議並未特別授予您之一切本軟體權利、所有權和利益 (包括但不限於全部智慧財產權)。
規定與限制
您不能複製、公開、調整、再散布、企圖推衍原始碼、修改、執行逆向工程、解編譯或拆解任何本軟體 (無論全部或部分)亦不得自本軟體創作任何衍生作品或創作本軟體之任何衍生作品除非該等衍生作品是本軟體所刻意促成之結果。您不得修改或破壞本軟體之任何數位權利管理功能。您不得略過、修改、阻撓或規避本軟體之任何功能或保護以及與本軟體相關而執行之任何機制。您不得將本軟體之任何個別元件分離開來在超過一部裝置上使用除非經IDS明示授權得有此等行為。您不得移除、改變、遮蔽或掩蓋本軟體上之任何商標或聲明。您不得分享、散布、不定期限租賃、定期限租賃、再授權、轉讓、移轉或銷售本軟體。本軟體性能有賴其方得發揮之軟體、網路服務或本軟體以外之其他產品可能會在供應商 (軟體供應商、服務供應商或IDS) 酌情下決定中斷或中止。IDS和該等供應商不保證本軟體、網路服務、內容或其他產品將可持續提供亦不保證其操作均不會中斷或修改。
排除軟體和開放來源碼元件
儘管有前述之有限授權,您仍確認本軟體得包括排除軟體。特定排除軟體可能受開放來源碼軟體授權所管轄 (以下簡稱「開放來源碼元件」),是指按開放來源碼促進組織授權或任何大致類似之授權許可為開放來源碼授權之任何軟體授權,包括但不限於作為按此授權約定而授權軟體得散布之前提條件而規定散布者必須以來源碼格式提供軟體之任何授權。如有必要揭露以及凡必須揭露時,請至網站 www.sony.net/Products/Linux 或其他IDS指定之網站查詢本軟體中不時包括之相關開放來源碼元件清單以及管轄其使用之適用條款和條件。該等條款和條件得由對您並無義務之相關第三人隨時變更。凡管轄排除軟體之授權規定所必須時該等授權之條款即應適用並取代本授權協議之條款。凡排除軟體適用之授權條款禁止本授權協議中有關該等排除軟體之任何限制約定時相關限制即不應適用該等排除軟體。凡開放來源碼元件適用之授權條款規定IDS必須表示願意提供與本軟體相關之來源碼時IDS即茲此表示願意如此。
與受著作權保護材料一併使用本軟體
本軟體可由您使用以檢視、儲存、處理和 (或) 使用由您和 (或) 第三人創造之內容。該等內容可能受到著作權、其他智慧財產法律和 (或) 協議所保護。您同意使用本軟體時絕對會遵守適用該等內容之一切相關法律與協議。您確認並同意IDS得採取適當措施以保護本軟體所儲存、處理或使用之內容之著作權。該等措施包括但不限於計算您透過本軟體特定功能備份和復原之頻率、拒絕接受您對啟動資料復原之要求以及當您不當使用本軟體時終止本授權協議。
內容服務
亦請您注意,本軟體得設計與透過一項或多項內容服務 (以下簡稱「內容服務」) 而提供之內容一併使用。服務與該內容之使用應遵守該內容服務之服務條款。如果您拒絕接受該等條款則您對本軟體之使用將受到限制。您確認並同意透過本軟體而提供之特定內容和服務得由IDS對其並無控制權之第三人提供。使用內容服務必須有網際網路連線。內容服務得隨時中斷。
網路連線和第三人服務
您確認並同意,存取本軟體特定功能可能需有網路連線,您應自行負責取得網路連線。此外,您應自行支付與您取得網路連線相關之任何第三人費用,包括但不限於網路服務供應商或上網費。本軟體之運作可能會視您取得的網路連線和服務之性能、頻寬或技術限制而有上限或受到限制。此等網路連線之提供、品質與安全性應由提供相關服務之第三人負全部責任。
出口與其他管制
您同意遵守您居住地區或國家一切適用之出口與再出口限制與規定,且不會將本軟體向禁止國家移轉或准許移轉,亦不會以其他方式違反任何相關限制或規定。
高風險活動
本軟體並非容錯軟體,且其設計、製造或使用或轉售目的並非能在危險環境中使用,需有自動故障排除性能之線上控制設備,例如操作核能設施、航空器導航或通訊系統、空中交通管制、直接生命維持機器,或武器系統,而一旦本軟體故障即可能導致死亡、人員受傷或嚴重的身體或環境損害 (以下簡稱「高風險活動」)。IDS、每一個第三人供應商以及其各自之各個關係企業均明確否認對高風險活動之任何明示或暗示可適性保證、義務或條件。
本軟體保證之排除
您確認並同意,本軟體之使用風險完全由您負擔,且您應對本軟體之使用負責。本軟體係按「現狀」提供,無任何類型之保證、義務或條件。
IDS和各個第三人供應商 (就本條而言IDS與各個第三人供應商應合稱為「IDS」) 明示否認一切明示或暗示之保證、義務或條件包括但不限於可銷性、無侵權或特定目的可適性之暗示保證。IDS不保證亦無設定任何件或做成任何聲明(A) 任何本軟體中包含的功能都會符合您的需求或將會更新;(B) 任何本軟體之操作均為正確或毫無錯誤或任何瑕疵均會加以修正;(C) 本軟體不會損壞任何其他軟體、硬體或資料;(D) 本軟體性能所賴之任何軟體、網路服務 (包括網際網路) 或產品 (除本軟體外) 均會持續提供、不會中斷或遭到修改;以及 (E) 有關使用本軟體或使用本軟體結果之正確性、精準度、可靠性或其他特性。
IDS或IDS之授權代表做成之任何口頭或書面資訊或建議均不應創造任何保證、義務或條件亦絕對不會擴大本項保證之範圍。若本軟體證實有瑕疵您承擔一切必要維修、修復或修正之全部費用。部分司法管轄區禁止排除暗示性保證因此以上排除約定可能並不適用於您。
責任限制
IDS和各個第三人供應商 (就本條而言IDS與各個第三人供應商應合稱為「IDS」) 對於有關本軟體而違反任何明示或暗示保證、違約、過失、無過失責任或基於任何其他法律理論均毋須對任何隨附或衍生性損害賠償負任何責任包括但不限於因失去利益、損失所得、遺失資料、無法使用本軟體或任何相關硬體、故障時間和使用者時間所引起之任何損失即使IDS之任何人已獲悉該等損害之可能性。於任何情況下其按本授權協議任何條款約定之全部責任均應限於實際為產品所支付金額。部分司法管轄區禁止排除或限制隨附或衍生性損害賠償因此以上排除或限制約定可能並不適用於您。
對收集和使用個人資訊、位置資料、資料安全性的同意
您確認並同意IDS和其關係企業、合作廠商和代理人均得閱讀、收集、傳送、處理與儲存自本軟體所收集之特定資訊包括但不限於與以下相關者(i) 本軟體;以及 (ii) 軟體應用程式、內容以及與您的裝置和本軟體互動之周邊裝置 (以下簡稱「相關資訊」)。相關資訊包括但不限於:(1) 與您的裝置及其元件相關之獨特辨識碼;(2) 裝置、本軟體及其元件之性能;(3) 您的裝置、本軟體和軟體應用程式之組態、內容及與裝置和本軟體互動之周邊裝置;(4) 使用 (x) 本軟體和 (y) 軟體應用程式、內容及與本軟體互動之周邊裝置之功能以及使用頻率;以及 (5) 位置資料如以下所示。IDS和其關係企業、合作廠商和代理人均得依適用法律使用和揭露相關資訊以改善其產品和服務或為您提供產品或服務。相關使用包括但不限於(a) 管理本軟體之功能;(b) 改進、維修、更新或升級本軟體;(c) 改進、開發並強化IDS和其他人目前和未來之產品與服務(d) 提供您與IDS和其他人所提供產品和服務相關之資訊(e) 遵守適用法律或法規;以及 (f) 凡表示可提供時向您提供IDS和其他人的位基服務如下文所述。此外IDS保留權利得使用相關資訊以保護其本身和第三人不受違法、犯罪或傷害行為之損害。
透過本軟體而提供之特定服務可能須依賴位置資訊包括但不限於裝置之地理位置。您確認就提供該等服務而言IDS、第三人供應商或其合作廠商均得收集、建立資料庫、處理並使用該等位置資料且該等服務應受IDS或相關第三人之隱私政策所管轄。您使用任何該等服務即表示您同意您已審閱過該等服務適用之隱私政策並同意前述活動。
IDS、其關係企業、合作廠商和代理人在您未知情況下或未經您同意前均不會蓄意使用相關資訊以辨識本軟體所有人或使用者之個人身分。任何對相關資訊之使用均應符合IDS或相關第三人之隱私政策。請與各地區或國家之適用聯絡地址聯繫索取IDS最新的隱私權政策。
請與相關第三人聯絡索取當您使用或存取第三人軟體或服務時所提供之個人可辨識資訊或其他資訊相關之隱私政策。
相關資訊得由IDS、其關係企業或位於您居住國家以外國家之代理人處理、儲存或向其移轉。部分國家的資料保護和資訊隱私法律規定的保護程度也許不如您的居住國而且您對於在這些國家處理和儲存或向其移轉之相關資訊擁有的法律權利可能較少。IDS會盡合理努力採取適當之技術或組織措施以防止未經授權即存取或揭露相關資訊但無法保證一定能消除該等相關資訊遭到濫用之一切風險。
自動更新功能
IDS或第三人供應商得不時於您與IDS之伺服器或第三人伺服器互動時或其他時候自動更新或以其他方式修訂本軟體包括但不限於基於增強安全功能、錯誤修正和改進功能之目的。您確認並同意該等活動得由IDS自行酌情決定而進行且IDS得以您完成安裝或接受相關更新或修訂為持續使用本軟體之前提。就本授權協議而言任何更新 / 修訂均應視為且應構成本軟體之部分。您接受本授權協議即表示您接受該等更新 / 修訂。
完整合意、拋棄、可分割性
本授權協議和IDS的隱私政策 (各自均得不時增補和修訂) 共同構成您與IDS間有關本軟體之完整合意。IDS未行使或強制執行本授權協議之任何權利或條款均不應構成拋棄該等權利或條款。若本授權協議有任何部分經認定為無效、違法或無法執行則該條款應於准許之最大範圍內加以執行以維持本授權協議之意旨而其他部分則均維持完整效力和有效性。
準據法與司法管轄
《聯合國國際貨物買賣合約公約》不應適用本授權協議。本授權協議應受日本法律管轄,不適用法律牴觸規定。因本授權協議所生之任何爭議均應交付日本東京地方法院之專屬地管轄,且當事人茲同意該等法院之地點與司法管轄權。
衡平救濟
儘管本授權協議中有任何相反約定然您均確認並同意一旦您有任何違反或不遵守本授權協議之情事均會對IDS造成無法補救之傷害而金錢損害賠償並不足以補償該等傷害且您同意IDS得取得該等情況下其認為必要或適當之任何禁制救濟或衡平救濟。IDS亦得採取任何法律和技術救濟以防止違反本授權協議和 (或) 強制執行本授權協議包括但不限於立即終止您對本軟體之使用只要是IDS自行酌情認定您已違反或意違反本授權協議即可。以上救濟均係外加於IDS依法、根據衡平原則或按合約得有之任何其他救濟。
終止
在不妨礙IDS任何其他權利之前提下IDS得於您未遵守本授權協議之任何條款時終止本授權協議。發生此等終止情況時您必須(i) 停止對本軟體之一切使用並將其全數銷毀;(ii) 遵守下文標題為「您的帳戶責任」一節所載規定。
修訂
IDS保留權利得依其自行酌情決定以於IDS指定網站刊登公告、寄送電郵通知至您所提供之電郵地址、於您取得升級 / 更新過程中提供通知或以其他法律承認之通知形式等方式修訂本授權協議之條款。如果您不同意該等修訂您應立即與IDS聯絡取得指示。您於任何該等通知生效日期後持續使用本軟體即應視為您同意受到該等修訂之約束。
第三方受益人
與相關當事人之本軟體相關時,各第三人供應商均係本授權協議各條款之明示預定第三人受益人且應有權得行使該等條款。
您的帳戶責任
若您將您的裝置退還至原購買地點、出售您的裝置或將其以其他方式移轉或若本授權協議終止時您均應負責且必須將本軟體自裝置解除安裝並刪除您於裝置上所建立或透過本軟體而存取之全部帳戶。您應完全負責維持您在IDS或第三人之任何帳戶以及與您使用裝置相關之任何使用者名稱和密碼之機密。
若您有關於本授權協議之任何疑問請透過各地區或國家適用之聯絡地址以書面方式和IDS聯絡。

2
src/modules/pepper.mod Normal file
View File

@ -0,0 +1,2 @@
+ LOCALE:en_US pepper 1.0 %INSTALLDIR%
[r] scripts: scripts

View File

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,89 @@
import re
import maya.cmds as mc
import os
import sys
import logging
from mapping import item_map, unit_map
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
BASE_XML = os.path.join(os.path.dirname(__file__), 'behavior.xml')
def set_range(v_min, v_max, old_min, old_max, value):
""" Set range refer maya set range node
"""
return v_min + (((value - old_min) / (old_max - old_min)) * (v_max - v_min))
def xar_export(output_path):
""" Base <ActuatorList> anim block
"""
item_normalize = ['RHand.rotateX', 'LHand.rotateX']
key_data_buffer = ''
space = ' ' * 4
indent = 8
key_data_buffer += '%s<ActuatorList model="">\n' % (space * indent)
for ctrl_attr in sorted(item_map.keys()):
ctrl_unit = 0
if ctrl_attr in unit_map.keys():
ctrl_unit = unit_map[ctrl_attr]
key_data_buffer += '%s<ActuatorCurve name="value" actuator="%s" mute="0" unit=%s>\n' % (
space * (indent + 1), ctrl_attr, ctrl_unit)
key_attr = item_map[ctrl_attr]
key_times = mc.keyframe(key_attr, q=True)
logger.debug('Get %s %s keyframes' % (ctrl_attr, len(key_times)))
for kt in key_times:
if kt < 0:
continue
kv = mc.keyframe(key_attr, time=(kt, kt), q=True, eval=True)
value = kv[0]
if key_attr in item_normalize:
value = set_range(0.98, 0.02, 0.0, 90.0, kv[0])
key_data_buffer += '%s<Key frame="%s" value="%s"/>\n' % (space * (indent + 2), int(kt), value)
key_data_buffer += '%s</ActuatorCurve>\n' % (space * (indent + 1))
key_data_buffer += '%s</ActuatorList>\n' % (space * indent)
logger.info('Exporting file %s' % output_path)
with open(BASE_XML, 'r') as fd:
buff = fd.read()
# Export timeline setting match the maya
# ---------------------------------------
current_unit = mc.currentUnit(q=True, time=True)
anim_fps = '30'
if current_unit in unit_map.keys():
anim_fps = unit_map[current_unit]
else:
logger.warning('Current time unit not found, use default (30)')
anim_max = mc.playbackOptions(q=True, animationEndTime=True)
anim_len = anim_max - 1 + 1
regex = re.compile('(?:<Timeline enable="1" fps="(?:\d+)"(?:\s(?:\w+(?:[\=](?:["\w]+))))+>)', re.I)
timeline_data = '<Timeline enable="1" fps="%s" start_frame="1" end_frame="%s" size="%s">' % (anim_fps,
anim_max,
anim_len)
regex.sub(timeline_data, buff)
# Export anim keyframe to xml
# ---------------------------------------
regex = re.compile('(?:<ActuatorList(?:["<>/\w\d\.\n\t\=\-\s])+</ActuatorList>)', re.I)
buff = regex.sub(key_data_buffer, buff)
with open(output_path, 'w') as ofd:
ofd.write(buff)
logger.info('File exported %s' % output_path)

Binary file not shown.

View File

@ -0,0 +1,47 @@
import os
import maya.cmds as mc
import maya.mel as mm
from mapping import item_map, item_normalize, time_units
import logging
import re
import xml.etree.ElementTree as ET
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
def set_range(v_min, v_max, old_min, old_max, value):
return v_min + (((value - old_min) / (old_max - old_min)) * (v_max - v_min))
def xar_import(input_path):
logger.debug('Import %s' % input_path)
if not os.path.exists(input_path):
logger.warning('File not exists...')
return
with open(input_path, 'r') as fd:
buff = fd.read()
regex = re.compile('(?:<ActuatorList(?:["<>/\w\d\.\n\t\=\-\s])+</ActuatorList>)', re.I)
match = regex.search(buff)
if not match:
logger.warning('ActuatorList not exists...')
return
root = ET.fromstring(match.group())
for actuator_curve in root:
actuator = actuator_curve.get('actuator')
logger.debug('Import keyframe %s' % actuator)
name = actuator_curve.get('name')
ctrl_attr = item_map[actuator]
key_times = mc.keyframe(ctrl_attr, q=True)
for kt in key_times:
mc.cutKey(ctrl_attr, t=(kt, kt), clear=True)
for key in actuator_curve:
frame = int(key.get('frame'))
value = float(key.get('value'))
if ctrl_attr in item_normalize:
value = set_range(0, 90, 0.98, 0.02, value)
mc.setKeyframe(ctrl_attr, t=frame, value=value)

Binary file not shown.

View File

@ -0,0 +1,24 @@
item_map = dict()
item_map['HipPitch'] = 'HipPitch.rotateZ'
item_map['HipRoll'] = 'HipRoll.rotateY'
item_map['HeadYaw'] = 'HeadYawPitch.rotateX'
item_map['HeadPitch'] = ' HeadYawPitch.rotateZ'
item_map['LShoulderPitch'] = 'LShoulderPitchRoll.rotateZ'
item_map['LShoulderRoll'] = 'LShoulderPitchRoll.rotateY'
item_map['LElbowYaw'] = 'LElbowYawRoll.rotateX'
item_map['LElbowRoll'] = 'LElbowYawRoll.rotateY'
item_map['LWristYaw'] = 'LWristYaw.rotateX'
item_map['LHand'] = 'LHand.rotateX'
item_map['RShoulderPitch'] = 'RShoulderPitchRoll.rotateZ'
item_map['RShoulderRoll'] = 'RShoulderPitchRoll.rotateY'
item_map['RElbowYaw'] = 'RElbowYawRoll.rotateX'
item_map['RElbowRoll'] = 'RElbowYawRoll.rotateY'
item_map['RWristYaw'] = 'RWristYaw.rotateX'
item_map['RHand'] = 'RHand.rotateX'
item_map['KneePitch'] = 'KneePitch.rotateZ'
item_normalize = ['RHand.rotateX', 'LHand.rotateX']
unit_map = {'LHand': 1, 'RHand': 1}
time_units = {'game': 15, 'film': 24, 'pal': 25, 'ntsc': 30, 'show': 48, 'palf': 50, 'ntscf': 60}

Binary file not shown.

View File

View File

@ -0,0 +1,9 @@
import re
path = r'\\data-server\project_j2\PEPPER\pepperExport\plug-ins\pepper\behavior.xml'
fd = open(path, 'r')
buff = fd.read()
regex = re.compile('(?:<Timeline enable="1" fps="(?:\d+)"(?:\s(?:\w+(?:[\=](?:["\w]+))))+>)', re.I)
print(regex.findall(buff))

View File

@ -0,0 +1,66 @@
import sys
import maya.OpenMayaMPx as OpenMayaMPx
import pepper.exporter as exporter
import pepper.importer as importer
reload(exporter)
reload(importer)
kPluginTranslatorTypeName = "pepperExport"
class PepperTranslater(OpenMayaMPx.MPxFileTranslator):
def __init__(self):
OpenMayaMPx.MPxFileTranslator.__init__(self)
def haveReadMethod(self):
return True
def haveWriteMethod(self):
return True
def filter(self):
return "*.xar"
def defaultExtension(self):
return "xar"
def writer(self, fileObject, optionString, accessMode):
try:
fullName = fileObject.fullName()
exporter.xar_export(fullName)
except:
sys.stderr.write("Failed to write file information\n")
raise
def reader(self, fileObject, optionString, accessMode):
try:
fullName = fileObject.fullName()
importer.xar_import(fullName)
except:
sys.stderr.write("Failed to write file information\n")
raise
def translatorCreator():
return OpenMayaMPx.asMPxPtr(PepperTranslater())
# initialize the script plug-in
def initializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject, 'Indigo', '1.0', 'Any')
try:
mplugin.registerFileTranslator(kPluginTranslatorTypeName, None, translatorCreator)
except:
sys.stderr.write("Failed to register translator: %s" % kPluginTranslatorTypeName)
raise
# uninitialize the script plug-in
def uninitializePlugin(mobject):
mplugin = OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.deregisterFileTranslator(kPluginTranslatorTypeName)
except:
sys.stderr.write("Failed to deregister translator: %s" % kPluginTranslatorTypeName)
raise