Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'release/scripts/textplugin_convert_ge.py')
-rw-r--r--release/scripts/textplugin_convert_ge.py863
1 files changed, 0 insertions, 863 deletions
diff --git a/release/scripts/textplugin_convert_ge.py b/release/scripts/textplugin_convert_ge.py
deleted file mode 100644
index fb17367d622..00000000000
--- a/release/scripts/textplugin_convert_ge.py
+++ /dev/null
@@ -1,863 +0,0 @@
-#!BPY
-"""
-Name: 'Convert BGE 2.49'
-Blender: 246
-Group: 'TextPlugin'
-Shortcut: ''
-Tooltip: 'Attemps to update deprecated usage of game engine API.'
-"""
-
-#
-# Copyright 2009 Alex Fraser <alex@phatcore.com>
-#
-# 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/>.
-#
-
-#
-# This script updates game engine scripts that were designed for pre-2.49
-# versions of Blender to run with the new API. Deprecated function calls are
-# listed in attributeRenameDict. This script searches for instances of the keys
-# in a target script and re-writes them.
-#
-# Some deprecated functions are complicated to re-write. The most common
-# conversions have been implemented, but some have not. Running this will reduce
-# the number of deprecation warnings in your scripts, but may not eliminate them
-# entirely.
-#
-# NOTE: The conversion is not guaranteed to be perfect. It is strongly
-# recommended that you review all changes after running this script.
-#
-# TODO: The following attributes are either ambiguous or need special processing
-# to handle parameters. Deprecated attributes that map to multiple target
-# attributes will require a refactor of the main conversion loop in the
-# convert248to249 function: currently, it doesn't allow any conversion to
-# advance the row index by more than one.
-#
-# getLinearVelocity (KX_SCA_AddObjectActuator, KX_ObjectActuator)
-# Conflicts with KX_GameObject.
-# Maps to multiple attributes.
-# setLinearVelocity (KX_SCA_AddObjectActuator, KX_ObjectActuator)
-# Conflicts with KX_GameObject.
-# Maps to multiple attributes.
-# getAngularVelocity (KX_SCA_AddObjectActuator, KX_ObjectActuator)
-# Conflicts with KX_GameObject.
-# Maps to multiple attributes.
-# setAngularVelocity (KX_SCA_AddObjectActuator, KX_ObjectActuator)
-# Conflicts with KX_GameObject.
-# Maps to multiple attributes.
-# setAction (BL_ShapeActionActuator, BL_ActionActuator)
-# `reset' argument has no conversion target.
-# set (KX_VisibilityActuator, KX_IpoActuator)
-# Different numbers of arguments.
-# Arguments map to multiple attributes.
-# getIndex (SCA_JoystickSensor)
-# Incompatible values: Old = 1-based index; new = 0-based.
-# getMesh (KX_SCA_ReplaceMeshActuator)
-# Return types differ. Need to call object.name.
-# getObject (KX_SCA_AddObjectActuator, KX_CameraActuator,
-# KX_TrackToActuator, KX_ParentActuator)
-# Default return type differs between classes.
-# setIndex (SCA_JoystickSensor)
-# Incompatible values: Old = 1-based index; new = 0-based.
-# setObject (KX_SCA_AddObjectActuator, KX_CameraActuator,
-# KX_TrackToActuator, KX_ParentActuator)
-# Incompatible types: Old = KX_GameObject or String; new =
-# KX_GameObject.
-# setOperation (KX_SCA_DynamicActuator, KX_StateActuator)
-# Ambiguous: different target names.
-# getDRot (KX_ObjectActuator)
-# Maps to multiple attributes.
-# setDRot (KX_ObjectActuator)
-# Arguments map to multiple attributes.
-# getDLoc (KX_ObjectActuator)
-# Maps to multiple attributes.
-# setDLoc (KX_ObjectActuator)
-# Arguments map to multiple attributes.
-# getTorque (KX_ObjectActuator)
-# Maps to multiple attributes.
-# setTorque (KX_ObjectActuator)
-# Arguments map to multiple attributes.
-# getForce (KX_ObjectActuator)
-# Maps to multiple attributes.
-# setForce (KX_ObjectActuator)
-# Arguments map to multiple attributes.
-# position (KX_GameObject)
-# Conflicts with KX_SoundActuator.
-# orientation (KX_GameObject)
-# Conflicts with KX_SoundActuator.
-#
-
-import string
-import re
-
-COMMENTCHAR = '#'
-
-class ParseError(Exception): pass
-class ConversionError(Exception): pass
-
-def findBalancedParens(lines, row, col, openChar = '(', closeChar = ')'):
- """Finds a balanced pair of parentheses, searching from lines[row][col].
- The opening parenthesis must be on the starting line.
-
- Returns two tuples containing the row and column of the opening paren, and
- the row and column of the matching paren.
-
- Throws a ParseError if the first character is not openChar, or if a matching
- paren cannot be found."""
-
- #
- # Find the opening coordinates.
- #
- oRow = row
- oCol = col
- line = lines[oRow]
- while oCol < len(line):
- if line[oCol] == openChar:
- break
- elif line[oCol] == COMMENTCHAR:
- break
- oCol = oCol + 1
-
- if oCol >= len(line) or line[oCol] != openChar or not re.match(r'^\s*$', line[col:oCol]):
- raise ParseError, "Can't find opening parenthesis. '%s'" % openChar
-
- #
- # Find the closing coordinates.
- #
- eRow = oRow
- eCol = oCol + 1
- level = 1
- while eRow < len(lines) and level > 0:
- line = lines[eRow]
- while eCol < len(line) and level > 0:
- c = line[eCol]
- if c == openChar:
- # Found a nested paren.
- level = level + 1
- elif c == closeChar:
- # Exiting one level of nesting.
- level = level - 1
- if level == 0:
- # Back to top level!
- return (oRow, oCol), (eRow, eCol)
- elif c == COMMENTCHAR:
- # Comment. Skip the rest of the line.
- break
- eCol = eCol + 1
- eRow = eRow + 1
- eCol = 0
- raise ParseError, "Couldn't find closing parenthesis."
-
-def findLastAssignment(lines, row, attrName):
- """Finds the most recent assignment of `attrName' before `row'. Returns
- everything after the '=' sign or None, if there was no match."""
- contRegex = re.compile(r'[^#]*?' + # Don't search in comments.
- attrName +
- r'\s*=\s*(.*)') # Assignment
-
- cRow = row - 1
- while cRow >= 0:
- match = contRegex.search(lines[cRow])
- if match:
- return match.group(1)
- cRow = cRow - 1
- return None
-
-def replaceSubstr(s, start, end, newSubStr):
- """Replace the contents of `s' between `start' and `end' with
- `newSubStr'."""
- return s[:start] + newSubStr + s[end:]
-
-def replaceNextParens(lines, row, colStart, newOpenChar, newCloseChar,
- oldOpenChar = '(', oldCloseChar = ')'):
- """Replace the next set of parentheses with different characters. The
- opening parenthesis must be located on line `row', and on or after
- `colStart'. The closing parenthesis may be on the same line or any following
- line. The strings are edited in-place.
-
- Throws a ParseError if the set of parentheses can't be found. In this case,
- the strings in `lines' will be untouched."""
- try:
- pOpen, pClose = findBalancedParens(lines, row, colStart, oldOpenChar,
- oldCloseChar)
- except ParseError:
- raise
-
- # Replacement may change string length. Replace closing paren first.
- r, c = pClose
- lines[r] = replaceSubstr(lines[r], c, c + 1, newCloseChar)
- # Replace opening paren.
- r, c = pOpen
- lines[r] = replaceSubstr(lines[r], c, c + 1, newOpenChar)
-
-def replaceSimpleGetter(lines, row, colStart, colEnd, newName):
- """Replace a call to a simple getter function with a reference to a
- property, e.g. foo.getBar() -> foo.bar
-
- The function identifier being replaced must be on line `row' and
- between `colStart' and `colEnd'. The opening parenthesis must follow
- immediately (whitespace is allowed). The closing parenthesis may be on the
- same or following lines.
-
- Throws a ConversionError if the parentheses can't be found. In this case
- the content of `lines' will be untouched."""
- try:
- replaceNextParens(lines, row, colEnd, newOpenChar = '', newCloseChar = '')
- except ParseError:
- raise ConversionError, ("Deprecated function reference.")
-
- lines[row] = replaceSubstr(lines[row], colStart, colEnd, newName)
-
-def replaceSimpleSetter(lines, row, colStart, colEnd, newName):
- """Replace a call to a simple setter function with a reference to a
- property, e.g. foo.setBar(baz) -> foo.bar = baz
-
- The function identifier being replaced must be on line `row' and
- between `colStart' and `colEnd'. The opening parenthesis must follow
- immediately (whitespace is allowed). The closing parenthesis may be on the
- same or following lines.
-
- Throws a ConversionError if the parentheses can't be found. In this case
- the content of `lines' will be untouched."""
- try:
- replaceNextParens(lines, row, colEnd, newOpenChar = '', newCloseChar = '')
- except ParseError:
- raise ConversionError, ("Deprecated function reference.")
-
- lines[row] = replaceSubstr(lines[row], colStart, colEnd, newName + ' = ')
-
-def replaceArgsWithListSetter(lines, row, colStart, colEnd, newName):
- """Replace a call to a multi-agument setter function with a reference to a
- list property, e.g. foo.setBar(baz, bazZ) -> foo.bar = [baz, bazZ]
-
- The function identifier being replaced must be on line `row' and
- between `colStart' and `colEnd'. The opening parenthesis must follow
- immediately (whitespace is allowed). The closing parenthesis may be on the
- same or following lines.
-
- Throws a ConversionError if the parentheses can't be found. In this case
- the content of `lines' will be untouched."""
- try:
- replaceNextParens(lines, row, colEnd, newOpenChar = '[', newCloseChar = ']')
- except ParseError:
- raise ConversionError, ("Deprecated function reference.")
-
- lines[row] = replaceSubstr(lines[row], colStart, colEnd, newName + ' = ')
-
-
-def replaceKeyedGetter(lines, row, colStart, colEnd, newName):
- """Replace a call to a keyed getter function with a reference to a
- property, e.g. foo.getBar(baz) -> foo.bar[baz]
-
- The function identifier being replaced must be on line `row' and
- between `colStart' and `colEnd'. The opening parenthesis must follow
- immediately (whitespace is allowed). The closing parenthesis may be on the
- same or following lines.
-
- Throws a ConversionError if the parentheses can't be found. In this case
- the content of `lines' will be untouched."""
- try:
- replaceNextParens(lines, row, colEnd, newOpenChar = '[', newCloseChar = ']')
- except ParseError:
- raise ConversionError, ("Deprecated function reference.")
-
- lines[row] = replaceSubstr(lines[row], colStart, colEnd, newName)
-
-def replaceGetXYPosition(lines, row, colStart, colEnd, axis):
- '''SCA_MouseSensor.getXPosition; SCA_MouseSensor.getYPosition.
- This is like a keyed getter, but the key is embedded in the attribute
- name.
-
- Throws a ConversionError if the parentheses can't be found. In this case
- the content of `lines' will be untouched.'''
- try:
- (openRow, openCol), (closeRow, closeCol) = findBalancedParens(lines,
- row, colEnd)
- except ParseError:
- raise ConversionError, "Deprecated function reference."
- if closeRow != row:
- raise ConversionError, "Can't modify multiple lines."
-
- lines[row] = replaceSubstr(lines[row], openCol, closeCol + 1,
- "[%s]" % axis)
-
- lines[row] = replaceSubstr(lines[row], colStart, colEnd, 'position')
-
-def replaceRename(lines, row, colStart, colEnd, newName):
- """Replace an identifier with another, e.g.
- foo.getBar() -> foo.getBaz()
- foo.bar -> foo.baz
-
- The identifier being replaced must be on line `row' and between `colStart'
- and `colEnd'."""
- lines[row] = replaceSubstr(lines[row], colStart, colEnd, newName)
-
-def replaceAddActiveActuator(lines, row, colStart, colEnd, closure):
- '''Extra work needs to be done here to find out the name of the controller,
- and whether the actuator should be activated or deactivated.
-
- Throws a ConversionError if the actuator, controller or condition can't be
- found. In this case the content of `lines' will be untouched.'''
- try:
- (openRow, openCol), (closeRow, closeCol) = findBalancedParens(lines, row, colEnd)
- except ParseError:
- ConversionError, "Can't find arguments."
-
- if closeRow != openRow:
- raise ConversionError, ("Can't perform conversion: arguments span multiple lines.")
-
- args = lines[row][openCol + 1:closeCol]
- match = re.search(r'([a-zA-Z_]\w*)' # Actuator identifier
- r',\s*'
- r'([0-9a-zA-Z_]\w*)', # Condition (boolean)
- args)
- if not match:
- raise ConversionError, "Can't find arguments."
-
- actuator = match.group(1)
- condition = match.group(2)
- controller = None
-
- assn = findLastAssignment(lines, row, actuator)
- if assn:
- match = re.search(r'([a-zA-Z_]\w*)' # Controller identifier
- r'\s*\.\s*' # Dot
- r'(actuators\s*\[|getActuator\s*\()', # Dictionary/getter identifier
- assn)
- if match:
- controller = match.group(1)
-
- if not controller:
- raise ConversionError, "Can't find actuator's controller."
-
- gameLogicStart = lines[row].rfind("GameLogic", 0, colStart)
- if gameLogicStart < 0:
- raise ConversionError, "Can't find GameLogic identifier."
-
- newExpr = None
- if condition in ['1', 'True']:
- newExpr = "%s.activate(%s)" % (controller, actuator)
- elif condition in ['0', 'False']:
- newExpr = "%s.deactivate(%s)" % (controller, actuator)
- else:
- newExpr = "(lambda: %s and (%s.activate(%s) or True) or %s.deactivate(%s))()" % (
- condition, controller, actuator, controller, actuator)
- lines[row] = replaceSubstr(lines[row], gameLogicStart, closeCol + 1, newExpr)
-
-def getObject(line, attributeStart):
- '''Get the object that an attribute belongs to. `attributeStart' is the
- index of the first character of the attribute name in the string `line'.
- Returns: the identifier preceding `attributeStart', or None if one can't be
- found.'''
- match = re.search(r'([a-zA-Z_]\w*)\s*\.\s*$', line[0:attributeStart])
- if not match:
- return None
- return match.group(1)
-
-def replaceGetActuator(lines, row, colStart, colEnd, closure):
- '''getActuator is ambiguous: it could belong to SCA_IController or
- SCA_ActuatorSensor. Try to resolve and then convert.
-
- Raises a ConversionError if the parentheses can't be found, or if the
- ambiguity can't be resolved.'''
- # Get the name of the object this attribute is attached to.
- obName = getObject(lines[row], colStart)
- if obName:
- # Try to find out whether the object is a controller.
- assn = findLastAssignment(lines, row, obName)
- if assn and re.search(r'GameLogic\s*\.\s*getCurrentController', assn):
- # It is (probably) a controller!
- replaceKeyedGetter(lines, row, colStart, colEnd, 'actuators')
- return
-
- raise ConversionError, "Ambiguous: addActiveActuator -> actuators[key] (SCA_IController) or actuator (SCA_ActuatorSensor)."
-
-def replaceSetOrientation(lines, row, colStart, colEnd, closure):
- '''setOrientation is ambiguous: it could belong to KX_SoundActuator or
- KX_GameObject. Try to resolve and then convert. If the type can't be
- determined, it is assumed to be a KX_GameObject. Currently, only the
- conversion for KX_GameObject is implemented.
-
- Raises a ConversionError if the parentheses can't be found, or if the
- object is found to be a KX_SoundActuator.'''
- # Get the name of the object this attribute is attached to.
- obName = getObject(lines[row], colStart)
- if obName:
- # Try to find out whether the object is an actuator.
- assn = findLastAssignment(lines, row, obName)
- if assn:
- match = re.search(r'([a-zA-Z_]\w*)' # Controller identifier
- r'\s*\.\s*' # Dot
- r'(actuators\s*\[|getActuator\s*\()', # Dictionary/getter identifier
- assn)
- if match:
- # It's probably a KX_SoundActuator.
- raise ConversionError, "Not implemented: Can't convert arguments to matrix."
-
- # It's probably a KX_GameObject.
- replaceSimpleSetter(lines, row, colStart, colEnd, 'localOrientation')
-
-def replaceSetPosition(lines, row, colStart, colEnd, closure):
- '''setPosition is ambiguous: it could belong to KX_SoundActuator or
- KX_GameObject. Try to resolve and then convert. If the type can't be
- determined, it is assumed to be a KX_GameObject.
-
- Raises a ConversionError if the parentheses can't be found.'''
- # Get the name of the object this attribute is attached to.
- obName = getObject(lines[row], colStart)
- if obName:
- # Try to find out whether the object is an actuator.
- assn = findLastAssignment(lines, row, obName)
- if assn:
- match = re.search(r'([a-zA-Z_]\w*)' # Controller identifier
- r'\s*\.\s*' # Dot
- r'(actuators\s*\[|getActuator\s*\()', # Dictionary/getter identifier
- assn)
- if match:
- # It's probably a KX_SoundActuator.
- replaceSimpleSetter(lines, row, colStart, colEnd, 'position')
-
- # It's probably a KX_GameObject.
- replaceSimpleSetter(lines, row, colStart, colEnd, 'localPosition')
-
-def replaceSplitProperty(lines, row, colStart, colEnd, (newGetter, newSetter)):
- '''Some property attributes behave differently when being written to or read
- from. Try to determine the operation, and replace accordingly. E.G.
- o.position = foo -> o.localPosition = foo # set
- foo = o.position -> foo = o.worldPosition # get
-
- This implementation can not handle cases where the object is returned from
- a function, e.g.
- foo = bar.getObject().position # Error!
-
- Raises a ConversionError if the operation can't be determined, or if the
- object is returned from a function.'''
- assnRegex = re.compile(r'(=\s*)?' # Getter
- r'[a-zA-Z_]\w*' # Object identifier
- r'\.([a-zA-Z_][a-zA-Z0-9_.]*)+' # Trailing attributes
- r'(\s*=)?') # Setter
- match = assnRegex.search(lines[row])
-
- if not match:
- raise ConversionError, "Can't determine operation (getting or setting)."
-
- setting = False
- getting = False
- if match.group(1):
- getting = True
- if match.group(3):
- setting = True
- if (getting and setting) or ((not getting) and (not setting)):
- raise ConversionError, "Can't determine operation (getting or setting)."
-
- if getting:
- replaceRename(lines, row, colStart, colEnd, newGetter)
- else:
- replaceRename(lines, row, colStart, colEnd, newSetter)
-
-def notImplemented(lines, row, colStart, colEnd, classNames):
- message = "Conversion not implemented. See documentation for " +\
- string.join(classNames, ', ')
- raise ConversionError, message
-
-#
-# Deprecated attribute information. The format is:
-# deprecatedAttributeName: (conversionFunction, closure)
-# Usually the closure will be the name of the superceding attribute.
-#
-# Since each deprecated attribute can appear in this dictionary only once, it is
-# the conversion function's responsibility to resolve ambiguity.
-#
-attributeRenameDict = {
- # Special cases
- 'addActiveActuator': (replaceAddActiveActuator, None), #
- 'getActuator': (replaceGetActuator, None), # SCA_IController, SCA_ActuatorSensor
- 'getXPosition': (replaceGetXYPosition, '0'), # SCA_MouseSensor
- 'getYPosition': (replaceGetXYPosition, '1'), # SCA_MouseSensor
- 'setOrientation': (replaceSetOrientation, None), # KX_GameObject, KX_SoundActuator
- 'setPosition': (replaceSetPosition, None), # KX_GameObject, KX_SoundActuator
-
- # Keyed getters/setters
- 'getSensor': (replaceKeyedGetter, 'sensors'), # SCA_IController
-
- # Multi-arg -> List setter
- 'setAxis': (replaceArgsWithListSetter, 'axis'), # SCA_JoystickSensor
- 'setForceLimitX': (replaceArgsWithListSetter, 'forceLimitX'), # KX_ObjectActuator
- 'setForceLimitY': (replaceArgsWithListSetter, 'forceLimitY'), # KX_ObjectActuator
- 'setForceLimitZ': (replaceArgsWithListSetter, 'forceLimitZ'), # KX_ObjectActuator
- 'setHat': (replaceArgsWithListSetter, 'hat'), # SCA_JoystickSensor
- 'setPID': (replaceArgsWithListSetter, 'pid'), # KX_ObjectActuator
- 'setVelocity': (replaceArgsWithListSetter, 'velocity'), # KX_SoundActuator
-
- # Straight rename
- 'getButtonValue': (replaceRename, 'getButtonActiveList'), # SCA_JoystickSensor
-
- # Split properties
- 'scaling': (replaceSplitProperty, ('worldScaling', 'localScaling')), # KX_GameObject
-
- # Simple getters/setters
- 'getSensors': (replaceSimpleGetter, 'sensors'), # SCA_IController
- 'getActuators': (replaceSimpleGetter, 'actuators'), # SCA_IController
- 'enableViewport': (replaceSimpleSetter, 'useViewport'), # KX_Camera
- 'getAction': (replaceSimpleGetter, 'action'), # BL_ShapeActionActuator, BL_ActionActuator
- 'getAxis': (replaceSimpleGetter, 'axis'), # SCA_JoystickSensor
- 'getAxisValue': (replaceSimpleGetter, 'axisValues'), # SCA_JoystickSensor
- 'getBlendin': (replaceSimpleGetter, 'blendIn'), # BL_ShapeActionActuator, BL_ActionActuator
- 'getBodies': (replaceSimpleGetter, 'bodies'), # KX_NetworkMessageSensor
- 'getButton': (replaceSimpleGetter, 'button'), # SCA_JoystickSensor
- 'getCamera': (replaceSimpleGetter, 'camera'), # KX_SceneActuator
- 'getConeOrigin': (replaceSimpleGetter, 'coneOrigin'), # KX_RadarSensor
- 'getConeTarget': (replaceSimpleGetter, 'coneTarget'), # KX_RadarSensor
- 'getContinue': (replaceSimpleGetter, 'useContinue'), # BL_ActionActuator
- 'getCurrentlyPressedKeys': (replaceSimpleGetter, 'events'), # SCA_KeyboardSensor
- 'getDamping': (replaceSimpleGetter, 'damping'), # KX_ObjectActuator
- 'getDelay': (replaceSimpleGetter, 'delay'), # SCA_DelaySensor
- 'getDistribution': (replaceSimpleGetter, 'distribution'), # SCA_RandomActuator
- 'getDuration': (replaceSimpleGetter, 'duration'), # SCA_DelaySensor
- 'getEnd': (replaceSimpleGetter, 'frameEnd'), # BL_ShapeActionActuator, KX_IpoActuator, BL_ActionActuator
- 'getExecutePriority': (replaceSimpleGetter, 'executePriority'), # SCA_ILogicBrick
- 'getFile': (replaceSimpleGetter, 'fileName'), # KX_GameActuator
- 'getFilename': (replaceSimpleGetter, 'fileName'), # KX_SoundActuator
- 'getForceIpoActsLocal': (replaceSimpleGetter, 'useIpoLocal'), # KX_IpoActuator
- 'getForceLimitX': (replaceSimpleGetter, 'forceLimitX'), # KX_ObjectActuator
- 'getForceLimitY': (replaceSimpleGetter, 'forceLimitY'), # KX_ObjectActuator
- 'getForceLimitZ': (replaceSimpleGetter, 'forceLimitZ'), # KX_ObjectActuator
- 'getFrame': (replaceSimpleGetter, 'frame'), # BL_ShapeActionActuator, BL_ActionActuator
- 'getFrameMessageCount': (replaceSimpleGetter, 'frameMessageCount'), # KX_NetworkMessageSensor
- 'getFrameProperty': (replaceSimpleGetter, 'framePropName'), # BL_ShapeActionActuator, BL_ActionActuator
- 'getFrequency': (replaceSimpleGetter, 'frequency'), # SCA_ISensor
- 'getGain': (replaceSimpleGetter, 'volume'), # KX_SoundActuator
- 'getHat': (replaceSimpleGetter, 'hat'), # SCA_JoystickSensor
- 'getHeight': (replaceSimpleGetter, 'height'), # KX_CameraActuator
- 'getHitNormal': (replaceSimpleGetter, 'hitNormal'), # KX_MouseFocusSensor, KX_RaySensor
- 'getHitObject': (replaceSimpleGetter, 'hitObject'), # KX_MouseFocusSensor, KX_RaySensor, KX_TouchSensor
- 'getHitObjectList': (replaceSimpleGetter, 'hitObjectList'), # KX_TouchSensor
- 'getHitPosition': (replaceSimpleGetter, 'hitPosition'), # KX_MouseFocusSensor, KX_RaySensor
- 'getHold1': (replaceSimpleGetter, 'hold1'), # SCA_KeyboardSensor
- 'getHold2': (replaceSimpleGetter, 'hold2'), # SCA_KeyboardSensor
- 'getInvert': (replaceSimpleGetter, 'invert'), # SCA_ISensor
- 'getIpoAdd': (replaceSimpleGetter, 'useIpoAdd'), # KX_IpoActuator
- 'getIpoAsForce': (replaceSimpleGetter, 'useIpoAsForce'), # KX_IpoActuator
- 'getKey': (replaceSimpleGetter, 'key'), # SCA_KeyboardSensor
- 'getLastCreatedObject': (replaceSimpleGetter, 'objectLastCreated'), # KX_SCA_AddObjectActuator
- 'getLevel': (replaceSimpleGetter, 'level'), # SCA_ISensor
- 'getLightList': (replaceSimpleGetter, 'lights'), # KX_Scene
- 'getLooping': (replaceSimpleGetter, 'looping'), # KX_SoundActuator
- 'getMass': (replaceSimpleGetter, 'mass'), # KX_GameObject
- 'getMax': (replaceSimpleGetter, 'max'), # KX_CameraActuator
- 'getMin': (replaceSimpleGetter, 'min'), # KX_CameraActuator
- 'getName': (replaceSimpleGetter, 'name'), # KX_Scene
- 'getNumAxes': (replaceSimpleGetter, 'numAxis'), # SCA_JoystickSensor
- 'getNumButtons': (replaceSimpleGetter, 'numButtons'), # SCA_JoystickSensor
- 'getNumHats': (replaceSimpleGetter, 'numHats'), # SCA_JoystickSensor
- 'getObjectList': (replaceSimpleGetter, 'objects'), # KX_Scene
- 'getOperation': (replaceSimpleGetter, 'mode'), # KX_SCA_DynamicActuator
- 'getOrientation': (replaceSimpleGetter, 'worldOrientation'), # KX_GameObject
- 'getOwner': (replaceSimpleGetter, 'owner'), # SCA_ILogicBrick
- 'getPara1': (replaceSimpleGetter, 'para1'), # SCA_RandomActuator
- 'getPara2': (replaceSimpleGetter, 'para2'), # SCA_RandomActuator
- 'getParent': (replaceSimpleGetter, 'parent'), # KX_GameObject
- 'getPID': (replaceSimpleGetter, 'pid'), # KX_ObjectActuator
- 'getPitch': (replaceSimpleGetter, 'pitch'), # KX_SoundActuator
- 'getPosition': (replaceSimpleGetter, 'worldPosition'), # KX_GameObject
- 'getPressedKeys': (replaceSimpleGetter, 'events'), # SCA_KeyboardSensor
- 'getPriority': (replaceSimpleGetter, 'priority'), # BL_ShapeActionActuator, BL_ActionActuator
- 'getProjectionMatrix': (replaceSimpleGetter, 'projection_matrix'), # KX_Camera
- 'getProperty': (replaceSimpleGetter, 'propName'), # SCA_PropertySensor, SCA_RandomActuator, SCA_PropertyActuator
- 'getRayDirection': (replaceSimpleGetter, 'rayDirection'), # KX_MouseFocusSensor, KX_RaySensor
- 'getRaySource': (replaceSimpleGetter, 'raySource'), # KX_MouseFocusSensor
- 'getRayTarget': (replaceSimpleGetter, 'rayTarget'), # KX_MouseFocusSensor
- 'getRepeat': (replaceSimpleGetter, 'repeat'), # SCA_DelaySensor
- 'getRollOffFactor': (replaceSimpleGetter, 'rollOffFactor'), # KX_SoundActuator
- 'getScene': (replaceSimpleGetter, 'scene'), # KX_SceneActuator
- 'getScript': (replaceSimpleGetter, 'script'), # SCA_PythonController
- 'getSeed': (replaceSimpleGetter, 'seed'), # SCA_RandomActuator
- 'getStart': (replaceSimpleGetter, 'frameStart'), # BL_ShapeActionActuator, KX_IpoActuator, BL_ActionActuator
- 'getState': (replaceSimpleGetter, 'state'), # SCA_IController, KX_GameObject
- 'getSubject': (replaceSimpleGetter, 'subject'), # KX_NetworkMessageSensor
- 'getSubjects': (replaceSimpleGetter, 'subjects'), # KX_NetworkMessageSensor
- 'getThreshold': (replaceSimpleGetter, 'threshold'), # SCA_JoystickSensor
- 'getTime': (replaceSimpleGetter, 'time'), # KX_SCA_AddObjectActuator, KX_TrackToActuator
- 'getTouchMaterial': (replaceSimpleGetter, 'useMaterial'), # KX_TouchSensor
- 'getType': (replaceSimpleGetter, 'mode'), # SCA_PropertySensor
- 'getUse3D': (replaceSimpleGetter, 'use3D'), # KX_TrackToActuator
- 'getUseNegPulseMode': (replaceSimpleGetter, 'useNegPulseMode'), # SCA_ISensor
- 'getUsePosPulseMode': (replaceSimpleGetter, 'usePosPulseMode'), # SCA_ISensor
- 'getUseRestart': (replaceSimpleGetter, 'useRestart'), # KX_SceneActuator
- 'getValue': (replaceSimpleGetter, 'value'), # SCA_PropertySensor, SCA_PropertyActuator
- 'getVisible': (replaceSimpleGetter, 'visible'), # KX_GameObject
- 'getXY': (replaceSimpleGetter, 'useXY'), # KX_CameraActuator
- 'isConnected': (replaceSimpleGetter, 'connected'), # SCA_JoystickSensor
- 'isPositive': (replaceSimpleGetter, 'positive'), # SCA_ISensor
- 'isTriggered': (replaceSimpleGetter, 'triggered'), # SCA_ISensor
- 'setActuator': (replaceSimpleSetter, 'actuator'), # SCA_ActuatorSensor
- 'setBlendin': (replaceSimpleSetter, 'blendIn'), # BL_ShapeActionActuator, BL_ActionActuator
- 'setBlendtime': (replaceSimpleSetter, 'blendTime'), # BL_ShapeActionActuator, BL_ActionActuator
- 'setBodyType': (replaceSimpleSetter, 'usePropBody'), # KX_NetworkMessageActuator
- 'setBody': (replaceSimpleSetter, 'body'), # KX_NetworkMessageActuator
- 'setButton': (replaceSimpleSetter, 'button'), # SCA_JoystickSensor
- 'setCamera': (replaceSimpleSetter, 'camera'), # KX_SceneActuator
- 'setContinue': (replaceSimpleSetter, 'useContinue'), # BL_ActionActuator
- 'setDamping': (replaceSimpleSetter, 'damping'), # KX_ObjectActuator
- 'setDelay': (replaceSimpleSetter, 'delay'), # SCA_DelaySensor
- 'setDuration': (replaceSimpleSetter, 'duration'), # SCA_DelaySensor
- 'setEnd': (replaceSimpleSetter, 'frameEnd'), # BL_ShapeActionActuator, KX_IpoActuator, BL_ActionActuator
- 'setExecutePriority': (replaceSimpleSetter, 'executePriority'), # SCA_ILogicBrick
- 'setFile': (replaceSimpleSetter, 'fileName'), # KX_GameActuator
- 'setFilename': (replaceSimpleSetter, 'fileName'), # KX_SoundActuator
- 'setForceIpoActsLocal': (replaceSimpleSetter, 'useIpoLocal'), # KX_IpoActuator
- 'setFrame': (replaceSimpleSetter, 'frame'), # BL_ShapeActionActuator, BL_ActionActuator
- 'setFrameProperty': (replaceSimpleSetter, 'framePropName'), # BL_ShapeActionActuator, BL_ActionActuator
- 'setFrequency': (replaceSimpleSetter, 'frequency'), # SCA_ISensor
- 'setGain': (replaceSimpleSetter, 'volume'), # KX_SoundActuator
- 'setHeight': (replaceSimpleSetter, 'height'), # KX_CameraActuator
- 'setHold1': (replaceSimpleSetter, 'hold1'), # SCA_KeyboardSensor
- 'setHold2': (replaceSimpleSetter, 'hold2'), # SCA_KeyboardSensor
- 'setInvert': (replaceSimpleSetter, 'invert'), # SCA_ISensor
- 'setIpoAdd': (replaceSimpleSetter, 'useIpoAdd'), # KX_IpoActuator
- 'setIpoAsForce': (replaceSimpleSetter, 'useIpoAsForce'), # KX_IpoActuator
- 'setKey': (replaceSimpleSetter, 'key'), # SCA_KeyboardSensor
- 'setLevel': (replaceSimpleSetter, 'level'), # SCA_ISensor
- 'setLooping': (replaceSimpleSetter, 'looping'), # KX_SoundActuator
- 'setMask': (replaceSimpleSetter, 'mask'), # KX_StateActuator
- 'setMax': (replaceSimpleSetter, 'max'), # KX_CameraActuator
- 'setMesh': (replaceSimpleSetter, 'mesh'), # KX_SCA_ReplaceMeshActuator
- 'setMin': (replaceSimpleSetter, 'min'), # KX_CameraActuator
- 'setPitch': (replaceSimpleSetter, 'pitch'), # KX_SoundActuator
- 'setPriority': (replaceSimpleSetter, 'priority'), # BL_ShapeActionActuator, BL_ActionActuator
- 'setProjectionMatrix': (replaceSimpleSetter, 'projection_matrix'), # KX_Camera
- 'setProperty': (replaceSimpleSetter, 'propName'), # KX_IpoActuator, SCA_PropertySensor, SCA_RandomActuator, SCA_PropertyActuator
- 'setRepeat': (replaceSimpleSetter, 'repeat'), # SCA_DelaySensor
- 'setRollOffFactor': (replaceSimpleSetter, 'rollOffFactor'), # KX_SoundActuator
- 'setScene': (replaceSimpleSetter, 'scene'), # KX_SceneActuator
- 'setScript': (replaceSimpleSetter, 'script'), # SCA_PythonController
- 'setSeed': (replaceSimpleSetter, 'seed'), # SCA_RandomActuator
- 'setStart': (replaceSimpleSetter, 'frameStart'), # BL_ShapeActionActuator, KX_IpoActuator, BL_ActionActuator
- 'setState': (replaceSimpleSetter, 'state'), # KX_GameObject
- 'setSubject': (replaceSimpleSetter, 'subject'), # KX_NetworkMessageActuator
- 'setSubjectFilterText': (replaceSimpleSetter, 'subject'), # KX_NetworkMessageSensor
- 'setThreshold': (replaceSimpleSetter, 'threshold'), # SCA_JoystickSensor
- 'setTime': (replaceSimpleSetter, 'time'), # KX_SCA_AddObjectActuator, KX_TrackToActuator
- 'setToPropName': (replaceSimpleSetter, 'propName'), # KX_NetworkMessageActuator
- 'setType': (replaceSimpleSetter, 'mode'), # SCA_PropertySensor
- 'setUse3D': (replaceSimpleSetter, 'use3D'), # KX_TrackToActuator
- 'setUseNegPulseMode': (replaceSimpleSetter, 'useNegPulseMode'), # SCA_ISensor
- 'setUsePosPulseMode': (replaceSimpleSetter, 'usePosPulseMode'), # SCA_ISensor
- 'setUseRestart': (replaceSimpleSetter, 'useRestart'), # KX_SceneActuator
- 'setValue': (replaceSimpleSetter, 'value'), # SCA_PropertySensor, SCA_PropertyActuator
- 'setXY': (replaceSimpleSetter, 'useXY'), # KX_CameraActuator
-
- # Unimplemented!
- 'getLinearVelocity': (notImplemented, ['KX_SCA_AddObjectActuator', 'KX_GameObject']),
- 'setLinearVelocity': (notImplemented, ['KX_SCA_AddObjectActuator', 'KX_GameObject']),
- 'getAngularVelocity': (notImplemented, ['KX_SCA_AddObjectActuator', 'KX_GameObject']),
- 'setAngularVelocity': (notImplemented, ['KX_SCA_AddObjectActuator', 'KX_GameObject']),
- 'setAction': (notImplemented, ['BL_ShapeActionActuator', 'BL_ActionActuator']),
- 'set': (notImplemented, ['KX_VisibilityActuator', 'KX_IpoActuator']),
- 'getIndex': (notImplemented, ['SCA_JoystickSensor']),
- 'getMesh': (notImplemented, ['KX_SCA_ReplaceMeshActuator']),
- 'getObject': (notImplemented, ['KX_SCA_AddObjectActuator', 'KX_CameraActuator', 'KX_TrackToActuator', 'KX_ParentActuator']),
- 'setIndex': (notImplemented, ['SCA_JoystickSensor']),
- 'setObject': (notImplemented, ['KX_SCA_AddObjectActuator', 'KX_CameraActuator', 'KX_TrackToActuator', 'KX_ParentActuator']),
- 'setOperation': (notImplemented, ['KX_SCA_DynamicActuator', 'KX_StateActuator']),
- 'position': (notImplemented, ['KX_GameObject', 'KX_SoundActuator']),
- 'orientation': (notImplemented, ['KX_GameObject', 'KX_SoundActuator']),
- 'getDRot': (notImplemented, ['KX_ObjectActuator']),
- 'setDRot': (notImplemented, ['KX_ObjectActuator']),
- 'getDLoc': (notImplemented, ['KX_ObjectActuator']),
- 'setDLoc': (notImplemented, ['KX_ObjectActuator']),
- 'getTorque': (notImplemented, ['KX_ObjectActuator']),
- 'getTorque': (notImplemented, ['KX_ObjectActuator']),
- 'getForce': (notImplemented, ['KX_ObjectActuator']),
- 'setForce': (notImplemented, ['KX_ObjectActuator']),
-}
-
-def convert248to249(lines, log = True, logErrors = True, fileName = None):
- # Regular expression for finding attributes. For the string 'a.b', this
- # returns three groups: ['a.b', 'a.', 'b']. The last is the attribute name.
- attrRegex = re.compile(r'\.\s*' # Dot
- r'([a-zA-Z_]\w*)') # Identifier
-
- fileIdStr = ""
- if fileName:
- fileIdStr = fileName + ": "
- row = 0
- col = 0
- nconverted = 0
- nerrors = 0
- while row < len(lines):
- originalLine = lines[row]
- changed = False
- while col < len(lines[row]):
- # Don't search past comment. We have to check each iteration
- # because the line contents may have changed.
- commentStart = lines[row].find('#', col)
- if commentStart < 0:
- commentStart = len(lines[row])
-
- # Search for an attribute identifier.
- match = attrRegex.search(lines[row], col, commentStart)
- if not match:
- break
-
- attrName = match.group(1)
- if attributeRenameDict.has_key(attrName):
- # name is deprecated.
- func, closure = attributeRenameDict[attrName]
- try:
- # Convert!
- func(lines, row, match.start(1), match.end(1), closure)
- except ConversionError, e:
- # Insert a comment saying the conversion failed.
- print "ERROR: %sline %d, %s: %s\n" % (
- fileIdStr, row + 1, attrName, e)
- if logErrors:
- lines.insert(row,
- "##248## ERROR: %s: %s\n" %
- (attrName, e))
- row = row + 1
- nerrors = nerrors + 1
- else:
- changed = True
- nconverted = nconverted + 1
- # Search the rest of this line.
- col = match.start(1)
-
- if changed and log:
- # Insert a comment to showing difference in lines.
- if originalLine[-1] != '\n':
- originalLine = originalLine + '\n'
- lines.insert(row, "##248##%s" % originalLine)
- row = row + 1
-
- row = row + 1
- col = 0
- return nconverted, nerrors
-
-def usage():
- print "Usage: blender248to249.py [options] <infile> [outfile]"
- print "Options:"
- print "\t--nolog Don't include old lines as comments."
- print "\t--quieterrors Don't insert errors as comments."
-
-def runAsConsoleScript():
- '''Called when being run as a console script.'''
- try:
- opts, args = getopt.getopt(sys.argv[1:], "", ["nolog", "quieterrors"])
- except getopt.GetoptError, err:
- # print help information and exit:
- print str(err)
- usage()
- sys.exit(2)
-
- log = True
- logErrors = True
- for o, a in opts:
- if o == "--nolog":
- log = False
- elif o == "--quieterrors":
- logErrors = False
-
- try:
- inpath = args.pop(0)
- except IndexError:
- usage()
- sys.exit(2)
- try:
- outpath = args.pop(0)
- except IndexError:
- outpath = inpath
-
- infile = io.FileIO(inpath, 'r')
- # arbitrary file size of around 100kB
- lines = infile.readlines(100000)
- infile.close()
-
- nconverted, nerrors = convert248to249(lines, log, logErrors)
-
- outfile = io.FileIO(outpath, 'w')
- outfile.writelines(lines)
- outfile.close()
- print "Conversion finished. Modified %d attributes." % nconverted
- print "There were %d errors." % nerrors
- print "Please review all the changes."
-
-def runAsTextPlugin():
- '''Called when run as a text plugin.'''
-
- import Blender
- from Blender import Window, sys, Draw
- import BPyTextPlugin, bpy
-
- message = ("Convert Game Engine script from 4.48 API to 2.49 API%t|"
- "Run on active script only%x1|"
- "Run on ALL text buffers%x2")
- convertAllBuffers = Draw.PupMenu(message) == 2
-
- Window.WaitCursor(1)
- try:
- nconverted = 0
- nerrors = 0
-
- if convertAllBuffers:
- texts = bpy.data.texts
- else:
- if not bpy.data.texts.active:
- Draw.PupMenu("No active buffer.")
- return
- texts = [bpy.data.texts.active]
-
- Blender.SaveUndoState('Convert BGE 2.49')
-
- for txt in texts:
- bufName = txt.name
- if txt.lib:
- bufName = txt.lib + '/' + bufName
- lines = txt.asLines()
- for i in range(0, len(lines)):
- if not lines[i].endswith('\n'):
- lines[i] = lines[i] + '\n'
-
- nc, ne = convert248to249(lines, fileName = bufName)
- nconverted = nconverted + nc
- nerrors = nerrors + ne
- txt.clear()
- for line in lines:
- txt.write(line)
-
- finally:
- Window.WaitCursor(0)
-
- message = "Converted %d attributes." % nconverted
- if nerrors == 1:
- message = message + " There was 1 error (see console)."
- if nerrors > 1:
- message = message + " There were %d errors (see console)." % nerrors
- message = message + "|Please review all the changes."
- Draw.PupMenu(message)
-
-def main():
- try:
- import Blender
- except ImportError:
- runAsConsoleScript()
- else:
- runAsTextPlugin()
-
-# This lets you import the script without running it
-if __name__ == "__main__":
- import sys
- import getopt
- import io
- main()