| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- ----------------------------------------------------------------------------------------
- -- ------------------------------ 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;
- )
|