[Bf-extensions-cvs] [a776ac85] master: io_export/import unreal_psk_psa: moved to contrib: T63750

meta-androcto noreply at git.blender.org
Fri May 24 03:29:40 CEST 2019


Commit: a776ac851dd596aff4d31308e7875250df7d7443
Author: meta-androcto
Date:   Fri May 24 11:29:19 2019 +1000
Branches: master
https://developer.blender.org/rBACa776ac851dd596aff4d31308e7875250df7d7443

io_export/import unreal_psk_psa: moved to contrib: T63750

===================================================================

A	io_export_unreal_psk_psa.py
A	io_import_scene_unreal_psa_psk.py

===================================================================

diff --git a/io_export_unreal_psk_psa.py b/io_export_unreal_psk_psa.py
new file mode 100644
index 00000000..3008d6c8
--- /dev/null
+++ b/io_export_unreal_psk_psa.py
@@ -0,0 +1,3010 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software: you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation, either version 3 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#  All rights reserved.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+bl_info = {
+    "name": "Export Unreal Engine Format(.psk/.psa)",
+    "author": "Darknet/Optimus_P-Fat/Active_Trash/Sinsoft/VendorX/Spoof",
+    "version": (2, 7, 1),
+    "blender": (2, 65, 4),
+    "location": "File > Export > Skeletal Mesh/Animation Data (.psk/.psa)",
+    "description": "Export Skeleletal Mesh/Animation Data",
+    "warning": "",
+    "wiki_url": "https://wiki.blender.org/index.php/Extensions:2.6/Py/"
+                "Scripts/Import-Export/Unreal_psk_psa",
+    "category": "Import-Export",
+}
+
+"""
+-- Unreal Skeletal Mesh and Animation Export (.psk  and .psa) export script v0.0.1 --<br>
+
+- NOTES:
+- This script Exports To Unreal's PSK and PSA file formats for Skeletal Meshes and Animations. <br>
+- This script DOES NOT support vertex animation! These require completely different file formats. <br>
+
+- v0.0.1
+- Initial version
+
+- v0.0.2
+- This version adds support for more than one material index!
+
+[ - Edit by: Darknet
+- v0.0.3 - v0.0.12
+- This will work on UT3 and it is a stable version that work with vehicle for testing.
+- Main Bone fix no dummy needed to be there.
+- Just bone issues position, rotation, and offset for psk.
+- The armature bone position, rotation, and the offset of the bone is fix.
+  It was to deal with skeleton mesh export for psk.
+- Animation is fix for position, offset, rotation bone support one rotation direction when armature build.
+- It will convert your mesh into triangular when exporting to psk file.
+- Did not work with psa export yet.
+
+- v0.0.13
+- The animatoin will support different bone rotations when export the animation.
+
+- v0.0.14
+- Fixed Action set keys frames when there is no pose keys and it will ignore it.
+
+- v0.0.15
+- Fixed multiple objects when exporting to psk. Select one mesh to export to psk.
+- ]
+
+- v0.1.1
+- Blender 2.50 svn (Support)
+
+Credit to:
+- export_cal3d.py (Position of the Bones Format)
+- blender2md5.py (Animation Translation Format)
+- export_obj.py (Blender 2.5/Pyhton 3.x Format)
+
+- freenode #blendercoder -> user -> ideasman42
+
+- Give Credit to those who work on this script.
+
+- http://sinsoft.com
+"""
+
+
+# ===========================================================================
+"""
+NOTES for Jan 2012 refactor (Spoof)
+
+    * THIS IS A WORK IN PROGRESS. These modifications were originally
+    intended for internal use and are incomplete. Use at your own risk! *
+
+TODO
+
+- (Blender 2.62) changes to Matrix math
+- (Blender 2.62) check for long names
+- option to manually set the root bone for export
+
+CHANGES
+
+- new bone parsing to allow advanced rigging
+- identification of armature and mesh
+- removed the need to apply an action to the armature
+- fixed anim rate to work correctly in UDK (no more FPS fudging)
+- progress reporting while processing smooth groups
+- more informative logging
+- code refactor for clarity and modularity
+    - naming conventions unified to use lowercase_with_underscore
+    - C++ datatypes and PSK/PSA classes remain CamelCaseStyle for clarity
+    - names such as 'ut' and 'unreal' unified to 'udk'
+    - simplification of code structure
+    - removed legacy code paths
+
+USAGE
+
+This version of the exporter is more selective over which bones are considered
+part of the UDK skeletal mesh, and allows greater flexibility for adding
+control bones to aid in animation.
+
+Taking advantage of this script requires the following methodology:
+
+    * Place all exportable bones into a bone hierarchy extending from a single
+    root. This root bone must have use_deform enabled. All other root bones
+    in the armature must disable use_deform. *
+
+The script searches for a root bone with use_deform set true and considers all
+bones parented to it as part of the UDK skeletal mesh. Thus only these bones
+are exported and all other bones are ignored.
+
+This removes many restrictions on the rigger/animator, who can add control
+bone hierarchies to the rig, and keyframe any element into actions. With this
+approach you can build complex animation rigs in a similar vein to the Rigify
+add-on, by Nathan Vegdahl. However...
+
+    * Rigify is incompatible with this script *
+
+Rigify interlaces deformer bones within a single hierarchy making it difficult
+to deconstruct for export. It also splits some meta-rig bones into multiple
+deformer bones (bad for optimising a game character). I had partial success
+writing a parser for the structure, but it was taking too much time and,
+considering the other issues with Rigify, it was abandoned.
+"""
+# ===========================================================================
+
+import bmesh
+import os
+import time
+import bpy
+import mathutils
+import math
+import operator
+import sys
+from bpy.props import (
+        BoolProperty,
+        CollectionProperty,
+        EnumProperty,
+        FloatProperty,
+        IntProperty,
+        StringProperty,
+        )
+from bpy.types import (
+        Operator,
+        Panel,
+        UIList,
+        PropertyGroup,
+        AddonPreferences,
+        )
+from struct import pack
+
+
+# REFERENCE MATERIAL JUST IN CASE:
+#
+# U = x / sqrt(x^2 + y^2 + z^2)
+# V = y / sqrt(x^2 + y^2 + z^2)
+#
+# Triangles specified counter clockwise for front face
+#
+# defines for sizeofs
+SIZE_FQUAT = 16
+SIZE_FVECTOR = 12
+SIZE_VJOINTPOS = 44
+SIZE_ANIMINFOBINARY = 168
+SIZE_VCHUNKHEADER = 32
+SIZE_VMATERIAL = 88
+SIZE_VBONE = 120
+SIZE_FNAMEDBONEBINARY = 120
+SIZE_VRAWBONEINFLUENCE = 12
+SIZE_VQUATANIMKEY = 32
+SIZE_VVERTEX = 16
+SIZE_VPOINT = 12
+SIZE_VTRIANGLE = 12
+
+MaterialName = []
+
+
+# Python 3 doesn't have cmp anymore
+def cmp(a, b):
+    return (a > b) - (a < b)
+
+
+# ===========================================================================
+# Custom exception class
+# ===========================================================================
+class Error(Exception):
+
+    def __init__(self, message):
+        self.message = message
+
+
+# ===========================================================================
+# Verbose logging with loop truncation
+# ===========================================================================
+def verbose(msg, iteration=-1, max_iterations=4, msg_truncated="..."):
+
+    if bpy.context.scene.udk_option_verbose is True:
+        # limit the number of times a loop can output messages
+        if iteration > max_iterations:
+            return
+        elif iteration == max_iterations:
+            print(msg_truncated)
+            return
+
+        print(msg)
+
+
+# ===========================================================================
+# Log header/separator
+# ===========================================================================
+def header(msg, justify='LEFT', spacer='_', cols=78):
+
+    if justify == 'LEFT':
+        s = '{:{spacer}<{cols}}'.format(msg + " ", spacer=spacer, cols=cols)
+
+    elif justify == 'RIGHT':
+        s = '{:{spacer}>{cols}}'.format(" " + msg, spacer=spacer, cols=cols)
+
+    else:
+        s = '{:{spacer}^{cols}}'.format(" " + msg + " ", spacer=spacer, cols=cols)
+
+    return "\n" + s + "\n"
+
+
+# ===========================================================================
+# Generic Object->Integer mapping
+# the object must be usable as a dictionary key
+# ===========================================================================
+class ObjMap:
+
+    def __init__(self):
+        self.dict = {}
+        self.next = 0
+
+    def get(self, obj):
+        if obj in self.dict:
+            return self.dict[obj]
+        else:
+            id = self.next
+            self.next = self.next + 1
+            self.dict[obj] = id
+            return id
+
+    def items(self):
+        getval = operator.itemgetter(0)
+        getkey = operator.itemgetter(1)
+        return map(getval, sorted(self.dict.items(), key=getkey))
+
+
+# ===========================================================================
+# RG - UNREAL DATA STRUCTS - CONVERTED FROM C STRUCTS GIVEN ON UDN SITE
+# provided here: http://udn.epicgames.com/Two/BinaryFormatSpecifications.html
+# updated UDK (Unreal Engine 3): http://udn.epicgames.com/Three/BinaryFormatSpecifications.html
+# ===========================================================================
+class FQuat:
+
+    def __init__(self):
+        self.X = 0.0
+        self.Y = 0.0
+        self.Z = 0.0
+        self.W = 1.0
+
+    def dump(self):
+        return pack('ffff', self.X, self.Y, self.Z, self.W)
+
+    def __cmp__(self, other):
+        return cmp(self.X, other.X) or \
+               cmp(self.Y, other.Y) or \
+               cmp(self.Z, other.Z) or \
+               cmp(self.W, other.W)
+
+    def __hash__(self):
+        return hash(self.X) ^ hash(self.Y) ^ hash(self.Z) ^ hash(self.W)
+
+    def __str__(self):
+        return "[%f,%f,%f,%f](FQuat)" % (self.X, self.Y, self.Z, self.W)
+
+
+class FVector(object):
+
+    def __init__(self, X=0.0, Y=0.0, Z=0.0):
+        self.X = X
+        self.Y = Y
+        self.Z = Z
+
+    def dump(self):
+        return pack('fff', self.X, self.Y, self.Z)
+
+    def __cmp__(self, other):
+        return cmp(self.X, other.X) or \
+               cmp(self.Y, other.Y) or \
+               cmp(self.Z, other.Z)
+
+    def _key(self):
+       

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list