287 lines
7.5 KiB
Plaintext
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;
|
|
)
|