Newer
Older
"""Common functions for the Blender nif import and export scripts."""
__requiredpyffiversion__ = "2.0.2"
__requiredblenderversion__ = "245"
# ***** BEGIN LICENSE BLOCK *****
#
# BSD License
#
# Copyright (c) 2005-2009, NIF File Format Library and Tools
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# 3. The name of the NIF File Format Library and Tools project may not be
# used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# ***** END LICENCE BLOCK *****
# utility functions
def cmp_versions(version1, version2):
"""Compare version strings."""
def version_intlist(version):
"""Convert version string to list of integers."""
return [int(x) for x in version.__str__().split(".")]
return cmp(version_intlist(version1), version_intlist(version2))
# things to do on import and export
# check Blender version
__blenderversion__ = Blender.Get('version')
if cmp_versions(__blenderversion__, __requiredblenderversion__) == -1:
print("""--------------------------
ERROR\nThis script requires Blender %s or higher.
It seems that you have an older version installed (%s).
Get a newer version at http://www.blender.org/
--------------------------"""%(__requiredblenderversion__, __blenderversion__))
Blender.Draw.PupMenu("ERROR%t|Blender outdated, check console for details")
raise ImportError
# check if PyFFI is installed and import NifFormat
try:
from pyffi import __version__ as __pyffiversion__
from pyffi.formats.nif import NifFormat
print("""--------------------------
ERROR\nThis script requires the Python File Format Interface (PyFFI).
Make sure that PyFFI resides in your Python path or in your Blender scripts folder.
If you do not have it: http://pyffi.sourceforge.net/
Blender.Draw.PupMenu("ERROR%t|PyFFI not found, check console for details")
raise
# check PyFFI version
if cmp_versions(__pyffiversion__, __requiredpyffiversion__) == -1:
print("""--------------------------
ERROR\nThis script requires Python File Format Interface %s or higher.
It seems that you have an older version installed (%s).
Get a newer version at http://pyffi.sourceforge.net/
--------------------------"""%(__requiredpyffiversion__, __pyffiversion__))
Blender.Draw.PupMenu("ERROR%t|PyFFI outdated, check console for details")
raise ImportError
import logging
import sys
import os
def initLoggers():
"""Set up loggers."""
niftoolslogger = logging.getLogger("niftools")
niftoolslogger.setLevel(logging.WARNING)
pyffilogger = logging.getLogger("pyffi")
pyffilogger.setLevel(logging.WARNING)
loghandler = logging.StreamHandler()
loghandler.setLevel(logging.DEBUG)
logformatter = logging.Formatter("%(name)s:%(levelname)s:%(message)s")
loghandler.setFormatter(logformatter)
niftoolslogger.addHandler(loghandler)
pyffilogger.addHandler(loghandler)
# set up the loggers: call it as a function to avoid polluting namespace
initLoggers()
class NifImportExport:
"""Abstract base class for import and export. Contains utility functions
that are commonly used in both import and export."""
EXTRA_SHADER_TEXTURES = [
"EnvironmentMapIndex",
"NormalMapIndex",
"SpecularIntensityIndex",
"EnvironmentIntensityIndex",
"LightCubeMapIndex",
"ShadowTextureIndex"]
"""Names (ordered by default index) of shader texture slots for
Sid Meier's Railroads and similar games.
USED_EXTRA_SHADER_TEXTURES = {
"Sid Meier's Railroads": (3, 0, 4, 1, 5, 2),
"Civilization IV": (3, 0, 1, 2)}
"""The default ordering of the extra data blocks for different games."""
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
def getBoneNameForBlender(self, name):
"""Convert a bone name to a name that can be used by Blender: turns
'Bip01 R xxx' into 'Bip01 xxx.R', and similar for L.
@param name: The bone name as in the nif file.
@type name: C{str}
@return: Bone name in Blender convention.
@rtype: C{str}
"""
if name.startswith("Bip01 L "):
return "Bip01 " + name[8:] + ".L"
elif name.startswith("Bip01 R "):
return "Bip01 " + name[8:] + ".R"
return name
def getBoneNameForNif(self, name):
"""Convert a bone name to a name that can be used by the nif file:
turns 'Bip01 xxx.R' into 'Bip01 R xxx', and similar for L.
@param name: The bone name as in Blender.
@type name: C{str}
@return: Bone name in nif convention.
@rtype: C{str}
"""
if name.startswith("Bip01 "):
if name.endswith(".L"):
return "Bip01 L " + name[6:-2]
elif name.endswith(".R"):
return "Bip01 R " + name[6:-2]
return name
def get_extend_from_flags(self, flags):
if flags & 6 == 4: # 0b100
return Blender.IpoCurve.ExtendTypes.CONST
elif flags & 6 == 0: # 0b000
return Blender.IpoCurve.ExtendTypes.CYCLIC
self.logger.warning(
"Unsupported cycle mode in nif, using clamped.")
return Blender.IpoCurve.ExtendTypes.CONST
def get_flags_from_extend(self, extend):
if extend == Blender.IpoCurve.ExtendTypes.CONST:
return 4 # 0b100
elif extend == Blender.IpoCurve.ExtendTypes.CYCLIC:
return 0
self.logger.warning(
"Unsupported extend type in blend, using clamped.")
return 4
"""Class which handles configuration of nif import and export in Blender.
Important: keep every instance of this class in a global variable
(otherwise gui elements might go out of skope which will crash
Blender)."""
WELCOME_MESSAGE = 'Blender NIF Scripts %s (running on Blender %s, PyFFI %s)'%(__version__, __blenderversion__, __pyffiversion__)
TARGET_IMPORT = 0 # config target value when importing
TARGET_EXPORT = 1 # config target value when exporting
# GUI stuff
XORIGIN = 50 # x coordinate of origin
XCOLUMNSKIP = 390 # width of a column
XCOLUMNSEP = 10 # width of the column separator
YORIGIN = -40 # y coordinate of origin relative to Blender.Window.GetAreaSize()[1]
YLINESKIP = 20 # height of a line
YLINESEP = 10 # height of a line separator
# the DEFAULTS dict defines the valid config variables, default values,
# and their type
Loading
Loading full blame...