Jul 20 2011

converting activeX tabs to dotNet tabs in maxScript (repost)

This is an other repost from an old blog.. i figure i transfer it over 🙂

Ok, so i started updating some scripts that I’ve used tabs for, this is what i have found so far.

the dot net controller syntax for tabs is..

dotNetControl axList "System.Windows.Forms.Tabcontrol"

this makes a tab controller with the variable name of axList
the previous activeX controller would make the tab group and give you one default tab, this is not the same for dotNet tabs. in dotNet Tabs you have to create each tab your self.

adding new tabs is very easy, here’s the syntax to add tabs….

Tab = axList.tabPages.add "myAwsomeTab"

tab information can be access through “tabPages”, for example to query how many tabs there are in the tab controller you can do this…

numberOfTabs = axList.tabPages.count

to query individual tabs you have to use add “.Item” and then the index of the node you want to acess, (keep in mind that dot net controller arrays start at 0 and not at 1 like activeX and maxscript arrays)

firstTab = axList.tapPages.item[0]

this will store the first tab in the tab controller to in the variable first Tab.

if you need to query the or change the selected node there are now two methods to do this

selectedIndex = axlist.selectedIndex
selectedTab = axlist.selectedTab

the last thing i found out is some simple way of changing the appearance of your tabs.

tabStyle = dotNetClass  "System.Windows.Forms.TabAppearance"

this give you a dot net class from which you can apply 1 of the the following 3 styles


this is how you apply the flatButtons style to your tab controller.

tabStyle = dotNetClass  "System.Windows.Forms.TabAppearance"
axlist.Appearance = apClass.flatButtons

this is what I’ve run into today, i don’t like how the tab’s are highlighted by default when selected i don’t think it is obvious enough. i will play around and see if a can find some good methods of changing that, i might play around with changing the color of selected nodes or something until then, good luck and good night.



Jul 20 2011

controlling Dot Net Fonts in Maxscript (Repost)

This are some old notes, i had posted on another site regarding activeX to dotNet scripting… might be old news but i figured someone might find it usefull 🙂

So today i began to look into dot net controllers inside of max so that i can brake the studios current dependency on max 8 (activeX controller in max 9 don’t work unless 8 is installed),

and while it seem that the general work flow of the activeX controllers carries over to dotNet, there are allot of thing that are not documented and have become way more complex.

the main thing i noticed is dealing with object fonts, sizes, and styles such as bold italic etc, has become a bit more of a chore. here are some of the things i’ve found out, that i couldn’t find any where on the net.

when dealing with tree view nodes under activeX this is how you would change the text

node.font = "Tahoma"
node.fontsize = 7
node.bold = true

this has become a bit more complex in dotNet. a font is now an object value which is created out of sevral other objects and classes…

“fontfamily” this is the actual windows font to use

“fontStyle” this is the style of the text which can be bold , italic, crossed, etc

size can be controlled by a single integer value

so the first thing is to create both of this objects

fontFam = dotNetObject "system.drawing.fontfamily" "tahoma" --this makes the font object
fontStyle = dotNetClass "system.drawing.fontStyle" --this creates a list from which style can be pulled

next we will put it all together

myFont = dotNetObject "system.drawing.font" fontFam 7 fontStyle.bold
--the node font can now be overwritten by this line
node.nodeFont = myFont

anwyas i hope this helps some of you out there some. i will try and make more of this blog as i keep working with the new dotNet controllers in maxscript.



Nov 4 2009

The math behind extracting EULER VALUES from a 4×4 transform matrix

This little snippet of code was given to my by my buddy Scott Parrish, who’s a fellow creature TD at ILM.

global proc float[] matrixExtractRot (matrix $aMatrix)
  float $result[3];
  $result[0] = rad_to_deg(atan2($aMatrix[1][2], $aMatrix[2][2]));
  $result[1] = rad_to_deg(-asin ($aMatrix[0][2]));
  $result[2] = rad_to_deg(atan2($aMatrix[0][1], $aMatrix[0][0]));
  return $result;

Aug 18 2009

The math behind rayintersect (closest point on ray)

when i was i first thinking about writing the the rayIntersect function, my plan was to iterate through the entire mesh, and test all the triangles in mesh object with the rayIntersectTriangle function.
the fundamental problem with this is that to run this test on every traingle in a mesh can become very slow.
so i started thinking of running a simpler less expensive test on the faces, figure out which faces are more likely to intersect and only process those. for this i’m thinking i can figure out what the closest point along the ray is to the center of the face, and test the distance between the closet point and the center of the face.
if the this distance is larger than the diameter of the face then this triangle will be ignored.

fn closestPointOnRay ray pos =
    w = pos - ray.pos
    vsq = dot(ray.dir,ray.dir)
    proj = dot(w,ray.dir)
    return  (ray.pos + (proj/vsq)*ray.dir)

i have not tested this function yet. but it should look something like this.
the next thing I’m going to do is test for the for the distance, but use a cool trick that i found in the book “Essential Mathematics for games and interactive applications”.
the most common way for solving the distance between two points is using the good all Pythagorean theory or (x2 + y2 + z2 = d2).
so in order to find the distance of a point from origin we have get the square root of (x2+y2+z2).
being that the square root is one of the heavier math calculations we can avoid it buy just test for the distance squared.

fn sqrDistance pA pB =
    p = pA - pB
    d = (p.x * p.x)+(p.xy* p.y)+(p.z * p.z)
    return d

so we can the test would look something like

fn faceSimpleTest =
    cp = closestPointOnRay ray.pos faceCenter
    sqD = sqrDistance cp faceCenter
    if sqD < faceDiameter then
        return true

Aug 18 2009

The math behind rayintersect (Ray intersect triangle test)

I’m currently working in a 3d package that dosn’t have a rayintersect function available to it’s scripting lenguage. for those who don’t know a ray intersect function is used to test where and if an infinite line in space intersects a triangle. this can be used for many effects in 3d like deforming an object by projecting it’s verts into another surface, or for stoping one object from going through an other 🙂

anyway so i need to write a function in python that will allow me to do this test. i think i have found the math behind it so i figure i write it down here in MAXscript forma, so i can use this a reference to write the python version at work tommorrow

fn RayIntersectTriangle vA vB vC ray =
    //vA vB vC are the positions of the 3 verts that make of the face were testing
    e1 = vB - vA
    e2 = vC - vA
    p = cross(ray.dir e2)
    a = dot(e1,p)
    if a == 0 then return false //no intrsection here the face is parallel to the ray
    //compute denominator
    f = 1.0/a
    //compute barycentric coords
    s = ray.pos - vA
    u = f * dot(s,p)
    if u < 0.0 or u > 1.0 then return false //the u is outside the face
    q = cross(s,e1)
    v = f*dot(ray.dir,q)
    if v < 0.0 or v > 1.0 then return false //the v is outside the face
    t = f*dot(e2,q)
    return (t >= 0)

so the idea is to tweak the function so it return the uv coordinates of the the intersection, which will be easy. then we’ll need to convert does barycentric coordinates to a world space position. which i will look into tomorrow.
this function can then be used to test a ray against all the faces in a geometric mesh.
this might return many intersections of which we would choose the closest one 🙂
this code was translated from the book essential mathematics for games & interactive applications.
i have not tested the code yet so there might be some bugs.

Mar 27 2009


Here’s the splash man tool from the old site, this is the first test tool i’m uploading to work out my new tool publishing method.