Urho3D/Source/Extras/OgreMaxscriptExport/ogre/lib/OgreSkeletonLib_usefulfns.ms

287 lines
7.5 KiB
Plaintext

----------------------------------------------------------------------------------------
-- ------------------------------ SOME USEFUL FUNCTIONS ----------------------------- --
----------------------------------------------------------------------------------------
-- global variables
global g_MAX = false;
global g_MAX_use_listener = false;
-- global structures
struct exportOptions (sampleRate, ikSampleRate, scale, flipyz, flipNormal, exportColours, exportUV, UVchannels, exportHelpers);
struct exportAnims (names, startframes, endframes, lengths) ;
global Anims;
global Options;
global OgreExportFloater;
global OgreExportOptions, OgreExportObject, OgreExportMesh, OgreExportAnimation, OgreExportMaterial, OgreExportAbout;
--------------------------------------------------------------------
-- compute the transform, if you want to flip Y and Z axis,
-- because the axis which 'defines height' in OGRE is the Y axis,
-- whereas 3dsmax uses the Z one.
--------------------------------------------------------------------
function flipYZTransform Tform = (
local axis1,axis2,axis3,t,m
-- computes the matrix
axis1 = point3 1 0 0 ;
axis2 = point3 0 0 1 ;
axis3 = point3 0 -1 0 ;
t = point3 0 0 0 ;
m=matrix3 axis1 axis2 axis3 t ;
-- multiplies by the inverse
Tform = Tform*inverse(m) ;
return Tform ;
)
-----------------------------------------------------------------------------
-- check if the bone is the root object of the biped
-----------------------------------------------------------------------------
function isPelvis bipObj =
(
if (bipObj == undefined) then return false ;
if (classof bipObj != Biped_Object) then return false;
return ((biped.getNode bipObj 13) == bipObj) ;
)
-----------------------------------------------------------------------------
-- check if the bone is the footstep object of the biped
-----------------------------------------------------------------------------
function isFootStep bipObj =
(
if (bipObj == undefined) then return false ;
if (classof bipObj != Biped_Object) then return false;
return ((biped.getNode bipObj 16) == bipObj) ;
)
--------------------------------------------------------------------
-- returns if the bone is the root or not,
-- ia if its parent is undefined or is not a bone.
--------------------------------------------------------------------
function isRoot b = (
if (b.parent==undefined or not (iskindof b.parent BoneGeometry or iskindOf b.parent Biped_Object) ) then
return true ;
else
return false ;
)
--------------------------------------------------------------------
-- returns if the bone is the root or not,
-- handles standard bones as well as biped
--------------------------------------------------------------------
function isRootUniversal b = (
if (isRoot b) then
return true;
else if (isPelvis b) then
return true;
else
return false;
)
--------------------------------------------------------------------
-- returns if the object is a root or not,
-- handles any kind oj object
--------------------------------------------------------------------
function isRootUniversal2 b = (
bname = replaceSpaces b.name;
ind = (findItem RootsList bname);
if (ind == 0) then
return false;
else
return true;
)
--------------------------------------------------------------------
-- returns if the object is part of the skin (or physique modifier)
--------------------------------------------------------------------
function isPartOfModifier b sk phy = (
name = replaceSpaces b.name ;
if (sk!=undefined) then
(
for i=1 to (skinOps.GetNumberBones sk) do
(
bname = skinOps.GetBoneName sk i 1 ;
replaceSpaces bname ;
if (name == bname) then
return true;
)
)
else if (phy!=undefined) then
(
for i=1 to (physiqueOps.GetBoneCount $) do
(
bname = (physiqueOps.GetBones $)[i].name;
replaceSpaces bname ;
if (name == bname) then
return true;
)
)
return false;
)
--------------------------------------------------------------------
-- creates a new array (which must be set up as an array before
-- calling this function) in which there isn't the same element.
-- Moreover, the array is sorted.
--------------------------------------------------------------------
function keepLoneValues a b= (
local e, last_e ;
sort a ;
last_e = undefined ;
for e in a do (
if (e!=last_e) then
append b e ;
last_e = e ;
)
)
---------------------------------------------------------------------
-- replaces " " by "_" in a string.
-- when a name is for example Left Biceps max knows it at Left_Biceps
-- and execute function will not work if you don't use this function
---------------------------------------------------------------------
function replaceSpaces s =
(
for i=1 to s.count do
(
if (s[i] == " ") then
s[i] = "_" ;
)
s ;
)
--------------------------------
-- return the length of an array
--------------------------------
function arrayLength a =
(
local i ;
i = 1 ;
while (a[i] != undefined) do
i = i + 1 ;
i-1 ;
)
-----------------------------------------------------------------------------
-- return the skin modifier or undefined if object don't have a skin modifier
-----------------------------------------------------------------------------
function getSkin obj =
(
local s,i ;
s = undefined ;
if obj != undefined then
for i in obj.modifiers do
(
if iskindof i Skin do
s = i ;
)
s ;
)
-----------------------------------------------------------------------------
-- return the physique modifier or undefined if object don't have it
-----------------------------------------------------------------------------
function getPhysique obj =
(
local s,i ;
s = undefined ;
if obj != undefined then
for i in obj.modifiers do
(
if iskindof i Physique do
s = i ;
)
s ;
)
-----------------------------------------------------------------------------
-- return the OctopusExport modifier or undefined if object don't have it
-----------------------------------------------------------------------------
function getOctopusExport obj =
(
local s,i ;
s = undefined ;
if obj != undefined then
for i in obj.modifiers do
(
if iskindof i OctopusMeshModifier do
s = i ;
)
s ;
)
--------------------------------------------------
-- return an Array with the root bones of the skin
--------------------------------------------------
function getRoots skin =
(
local rootstab,n,i,c,d ;
rootstab = #() ;
n = skinOps.GetNumberBones skin ;
for i = 1 to n do
(
c= skinOps.GetBoneName skin i 1 ;
replaceSpaces c ;
d = getNodeByName c ;
if (isRoot d) then
append rootstab d ;
)
rootstab ;
)
--------------------------------------------------------
-- return an Array with the ID of root bones of the skin
--------------------------------------------------------
function getRootsId skin =
(
local rootstab,n,i,c,d ;
rootstab = #() ;
n = skinOps.GetNumberBones skin ;
for i = 1 to n do
(
c= skinOps.GetBoneName skin i 1 ;
replaceSpaces c ;
d = getNodeByName c ;
if (isRoot d) then
append rootstab i ;
)
rootstab ;
)
-------------------------------------------------------
-- return a angleAxis given a Quaternion
-------------------------------------------------------
function toAngleAxis q =
(
local angle, axis;
local result;
fSqrLength = q.x*q.x+q.y*q.y+q.z*q.z ;
if (fSqrLength > 0.0) then
(
angle = ((acos q.w) * pi / 90);
fInvLength = 1.0 / (sqrt fSqrLength);
axis = [q.x*fInvLength, q.y*fInvLength, q.z*fInvLength];
result = angleAxis angle axis;
)
else
(
angle = 0;
axis = [1,0,0];
result = angleAxis angle axis;
)
return result;
)