ShowTransform
From Director Online Wiki
on ShowTransform(aTransform, aScope, aPrecision) --------------------- -- ACTION: Creates a string representation of a transform suitable -- for displaying in the Message window for debugging -- purposes -- INPUT: <aTransform> should be a transform or an node object -- <aScope> only has an effect if it is #world and aTransform -- is in fact a node object. In this case, the -- worldTransform of the node is used. If aScope is an -- integer, it may be used for aPrecision. -- <aPrecision> may be a positive integer indicating the -- number of figures to show after the decimal point. 5 is -- used by default -- OUTPUT: Returns a string where the transform matrix is displayed -- in neat columns, so long as a mono-spaced font is used. -- If aTransform is not a transform or a node object, -- the error symbol #invalidTransform is returned instead. -------------------------------------------------------------------- vString = RETURN -- output value -- Parameter checking if not integerP(aPrecision) then if integerP(aScope) then aPrecision = aScope end if end if case ilk(aTransform) of #transform: -- continue #group, #model, #light, #camera: case aScope of #world: aTransform = aTransform.getWorldTransform() otherwise: -- #self aTransform = aTransform.transform end case otherwise: return #invalidTransform end case if integerP(aPrecision) then if aPrecision < 0 then aPrecision = 5 end if else aPrecision = 5 end if -- End of parameter checking -- Determine the maximum width of this column vlWidths = [1, 1, 1, 1] -- number of spaces required by each column vlFigures = [] -- number of spaces required by each item -- Determine the number of spaces for each column repeat with i = 1 to 16 vColumn = ((i - 1) mod 4) + 1 vColumnMax = vlWidths[vColumn] vItem = aTransform[i] vNegative = vItem < 0 if vNegative then vFigures = 1 -- for the minus sign else vFigures = 0 end if vItem = bitXor(vItem, 0) -- strips decimal part -- Thanks to Jonas Brink Wors?ɬ?e <jonas@savannah.dk> for the tip if not vItem then vFigures = vFigures + 1 else repeat while vItem vFigures = vFigures + 1 vItem = vItem / 10 end repeat end if if vNegative then vlFigures[i] = -vFigures -- so -0.00000001 is shown correctly else vlFigures[i] = vFigures end if if vColumnMax < vFigures then vlWidths[vColumn] = vFigures end if end repeat -- Determine how the numbers should display vPrecision = the floatPrecision if integerP(aPrecision) then if aPrecision > 0 then the floatPrecision = aPrecision end if end if -- Create the display string repeat with i = 1 to 16 vColumn = ((i - 1) mod 4) + 1 vItem = string(aTransform[i]) vSpaces = vlFigures[i] -- Ensure that very small negative numbers don't lose their sign if vSpaces < 0 then if vItem.char[1] <> "-" then put "-" before vItem end if vSpaces = -vSpaces end if -- Pad this item with the right number of spaces vSpaceCount = vlWidths[vColumn] - vSpaces vSpaces = " " repeat while vSpaceCount put " " after vSpaces vSpaceCount= vSpaceCount - 1 end repeat put vSpaces&vItem after vString if vColumn = 4 then put RETURN after vString end if end repeat the floatPrecision = vPrecision return vString end ShowTransform