public apiMeshGeomIterator(object userGeometry, MObject component)
            : base(userGeometry, component)
        {
            meshGeometry = (apiMeshGeom)userGeometry;

            reset();
        }
        public static MDagPath CreateJoint(string jtName)
        {
            MFnIkJoint joint    = new MFnIkJoint();
            MObject    jtObject = joint.create();

            return(MDagPath.getAPathTo(jtObject));
        }
Example #3
0
        /// <summary>
        /// Init the two list influentNodesBySkin and revelantNodesBySkin of a skin cluster.
        /// By getting the parents of the influent nodes.
        /// </summary>
        /// <param name="skin">the skin cluster</param>
        /// <returns>
        /// The list of nodes that form the skeleton
        /// </returns>
        private List <MObject> GetRevelantNodes(MFnSkinCluster skin)
        {
            if (revelantNodesBySkin.ContainsKey(skin))
            {
                return(revelantNodesBySkin[skin]);
            }

            List <MObject> influentNodes = GetInfluentNodes(skin);
            List <MObject> revelantNodes = new List <MObject>();


            // Add parents until it's a kWorld
            foreach (MObject node in influentNodes)
            {
                MObject currentNode = node;
                //MObject parent = findValidParent(node);   // A node can have several parents. Which one is the right one ? It seems that the first one is most likely a transform

                while (!currentNode.apiType.Equals(MFn.Type.kWorld))
                {
                    MFnDagNode dagNode = new MFnDagNode(currentNode);

                    if (revelantNodes.Count(revelantNode => Equals(revelantNode, currentNode)) == 0)
                    {
                        revelantNodes.Add(currentNode);
                    }

                    // iter
                    MObject firstParent = dagNode.parent(0);
                    currentNode = firstParent;
                }
            }
            revelantNodesBySkin.Add(skin, revelantNodes);

            return(revelantNodes);
        }
Example #4
0
        //
        //    Description:
        //        Overloaded function from MPxDragAndDropBehavior
        //    this method will assign the correct output from the slope shader
        //    onto the given attribute.
        //
        public override void connectNodeToAttr(MObject sourceNode, MPlug destinationPlug, bool force)
        {
            MFnDependencyNode src = new MFnDependencyNode(sourceNode);

            //if we are dragging from a slopeShaderNodeCSharp
            //to a shader than connect the outColor
            //plug to the plug being passed in
            //
            if(destinationPlug.node.hasFn(MFn.Type.kLambert)) {
                if (src.typeName == "slopeShaderNodeCSharp")
                {
                    MPlug srcPlug = src.findPlug("outColor");
                    if(!srcPlug.isNull && !destinationPlug.isNull)
                    {
                        string cmd = "connectAttr ";
                        cmd += srcPlug.name + " ";
                        cmd += destinationPlug.name;
                        MGlobal.executeCommand(cmd);
                    }
                }
            } else {
                //in all of the other cases we do not need the plug just the node
                //that it is on
                //
                MObject destinationNode = destinationPlug.node;
                connectNodeToNode(sourceNode, destinationNode, force);
            }
        }
Example #5
0
        public MSelectionList RestoreSelectionOnList(MSelectionList targetList = null, bool selectResult = false)
        {
            if (targetList == null || targetList.length == 0)
            {
                targetList = BasicFunc.GetSelectedList();
            }

            MSelectionList resultSelection = new MSelectionList();

            for (int i = 0; i < targetList.length; i++)
            {
                if (i >= selectedIndicesList.Count)
                {
                    break;
                }
                MDagPath dag = new MDagPath();
                targetList.getDagPath((uint)i, dag);
                MFnSingleIndexedComponent sic = new MFnSingleIndexedComponent();
                MObject components            = sic.create(MFn.Type.kMeshPolygonComponent);
                sic.addElements(new MIntArray(selectedIndicesList[i]));
                resultSelection.add(dag, components);
                //resultSelection.add(dag);
            }
            if (selectResult)
            {
                BasicFunc.Select(resultSelection);
            }
            return(resultSelection);
        }
Example #6
0
        /// <summary>
        /// Return the type of the direct descendants of the node
        /// </summary>
        /// <param name="mDagPath"></param>
        /// <returns> Return Mesh, Camera, Light or Unknown</returns>
        private MFn.Type getApiTypeOfDirectDescendants(MDagPath mDagPath)
        {
            for (uint i = 0; i < mDagPath.childCount; i++)
            {
                MObject    childObject = mDagPath.child(i);
                MFnDagNode nodeObject  = new MFnDagNode(childObject);

                switch (childObject.apiType)
                {
                case MFn.Type.kMesh:
                    if (IsMeshExportable(nodeObject, mDagPath))
                    {
                        return(MFn.Type.kMesh);
                    }
                    break;

                case MFn.Type.kCamera:
                    if (IsCameraExportable(nodeObject, mDagPath))
                    {
                        return(MFn.Type.kCamera);
                    }
                    break;
                }
                // Lights api type are kPointLight, kSpotLight...
                // Easier to check if has generic light function set rather than check all cases
                if (mDagPath.hasFn(MFn.Type.kLight) && IsLightExportable(nodeObject, mDagPath))
                {
                    // Return generic kLight api type
                    return(MFn.Type.kLight);
                }
            }

            return(MFn.Type.kUnknown);
        }
        // Adds a generic attribute that accepts a float, float2, float3
        public static void addComplexFloatGenericAttribute(ref MObject attrObject, string longName, string shortName)
        {
            // Create the generic attribute and set the 3 accepts types
            MFnGenericAttribute gAttr = new MFnGenericAttribute();
            attrObject = gAttr.create( longName, shortName );
            try
            {
                gAttr.addAccept(MFnNumericData.Type.kFloat);

                gAttr.addAccept(MFnNumericData.Type.k2Float);

                gAttr.addAccept(MFnNumericData.Type.k3Float);
            }
            catch (System.Exception)
            {
                MGlobal.displayError("error happens in addAccept");
            }

            gAttr.isWritable = false;
            gAttr.isStorable = false;

            // Add the attribute to the node
            try
            {
                addAttribute(attrObject);
            }
            catch (System.Exception)
            {
                MGlobal.displayError("error happens in addAttribute");
            }
        }
        public static void initialize()
        {
            MFnNumericAttribute nAttr = new MFnNumericAttribute();

            // single float attribute affecting a generic attribute
            try{
                gInputInt = nAttr.create( "gInputInt", "gii",
                    MFnNumericData.Type.kInt, 0 );
            }
            catch (System.Exception)
            {
                MGlobal.displayError("error happens in addAccept");
            }
            nAttr.isStorable = true;
            nAttr.isKeyable = true;

            try{
                addAttribute( gInputInt );
            }
            catch (System.Exception)
            {
                MGlobal.displayError("error happens in addAccept");
            }

            addComplexFloatGenericAttribute(ref gOutputFloat_2Float_3Float, "gOutputFloat_2Float_3Float", "gof2f3f" );

            try{
                attributeAffects( gInputInt, gOutputFloat_2Float_3Float );
            }
            catch (System.Exception)
            {
                MGlobal.displayError("error happens in addAccept");
            }
            return;
        }
Example #9
0
        public static MFnBlendShapeDeformer GetBlendShape(MObject targetObject = null)
        {
            if (targetObject == null)
            {
                targetObject = BasicFunc.GetSelectedObject(0);
            }
            MDagPath          dag_target  = MDagPath.getAPathTo(targetObject);
            MFnDependencyNode node_target = new MFnDependencyNode(targetObject);
            MPlug             plug        = node_target.findPlug("inMesh");

            Debug.Log("node_target:" + node_target.name + " plug:" + plug.name);
            MItDependencyGraph mit = new MItDependencyGraph(plug, MFn.Type.kBlendShape, MItDependencyGraph.Direction.kUpstream);

            //MDagPath dagPath = new MDagPath();
            //MItDependencyNodes mitnode = new MItDependencyNodes(MFn.Type.kBlendShape);


            while (!mit.isDone)
            {
                MObject           mo    = mit.currentItem();
                MFnDependencyNode dnode = new MFnDependencyNode(mo);
                Debug.Log("moing:" + dnode.absoluteName);
                if (mo.hasFn(MFn.Type.kBlendShape))
                {
                    Debug.Log("find blendshape");
                    return(new MFnBlendShapeDeformer(mo));
                }
                mit.next();
            }

            return(null);
        }
Example #10
0
        public override void doIt(MArgList args)
        {
            MArgDatabase argData = new MArgDatabase(syntax, args);

            bool creating = true;

            if (argData.isFlagSet(kCreateFlag))
            {
                creating = true;
            }
            else if (argData.isFlagSet(kDeleteFlag))
            {
                creating = false;
            }
            else
            {
                throw new ArgumentException("Command Syntax is incorrect", "args");
            }

            if (creating)
            {
                lineManipObj = modifier.createNode("simpleLineManipCSharp", MObject.kNullObj);
            }
            else
            {
                if (lineManipObj != null)
                {
                    modifier.deleteNode(lineManipObj);
                }
                lineManipObj = null;
            }

            redoIt();
        }
Example #11
0
        public void RenderPick(Matrix4d viewproj, MObject Root)
        {
            GL.Viewport(0, 0, MScreen.Width, MScreen.Height);
            // Globals.Index = 0;
            if (pickmaterial == null)
            {
                Console.Error.WriteLine("PickMaterial is NULL");
                return;
            }
            Globals.ShaderOverride = pickmaterial.shader;
            pickmaterial.shader.Bind();
            GL.ClearColor(Color4.White);
            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

            Globals.Index++;
            Root.Index = Index;

            Vector3  rgb       = IntToRgb(Index);
            int      ccc       = RGBtoInt(rgb);
            Matrix4d offsetmat = Matrix4d.CreateTranslation(-Globals.GlobalOffset);

            pickmaterial.shader.SetVec3("object_index", rgb);
            Root.Render(viewproj, offsetmat);

            Globals.ShaderOverride = null;
        }
Example #12
0
        void SetMaterial(MSceneObject mo, string sMaterialID)
        {
            if (sMaterialID == null)
            {
                sMaterialID = MMaterial.DEFAULT_MATERIAL;
            }
            //MSceneObject mo = (MSceneObject)MScene.ModelRoot.FindModuleByInstanceID(e.InstanceID);
            MObject   o   = MScene.MaterialRoot.FindModuleByName(sMaterialID);
            MMaterial mat = null;

            if (o != null && o.Type == MObject.EType.Material)
            {
                mat = (MMaterial)o;
                if (mat != null)
                {
                    mo.SetMaterial(mat);
                    mat.MaterialID = sMaterialID;
                }
            }

            if (MassiveTools.IsURL(sMaterialID))
            {
                mat = (MMaterial) new MMaterial("URLShader");
                MShader DefaultShader = (MShader)MScene.MaterialRoot.FindModuleByName(MShader.DEFAULT_SHADER);
                mat.AddShader(DefaultShader);
                mat.ReplaceTexture(Globals.TexturePool.GetTexture(sMaterialID));
                mat.MaterialID = sMaterialID;
                MScene.MaterialRoot.Add(mat);
                mo.SetMaterial(mat);
                mo.material.Setup();
            }
        }
Example #13
0
            public void Paint(MObject obj)
            {
                int x2 = Math.Min(obj.X - obj.Center.X + obj.Width + obj.Parent.X - X, Width);
                int y2 = Math.Min(obj.Y - obj.Center.Y + obj.Height + obj.Parent.Y - Y, Height);
                int x;
                int y = -Math.Min(0, obj.Y - obj.Center.Y + obj.Parent.Y - Y);

                for (int i = Math.Max(obj.Y - obj.Center.Y + obj.Parent.Y - Y, 0); i < y2; i++)
                {
                    x = -Math.Min(0, obj.X - obj.Center.X + obj.Parent.X - X);
                    for (int j = Math.Max(obj.X - obj.Center.X + obj.Parent.X - X, 0); j < x2; j++)
                    {
                        if (obj.Char(y, x) != ' ')
                        {
                            if (obj.Char(y, x) == '')
                            {
                                matrix[i, j].S = ' ';
                            }
                            else
                            {
                                matrix[i, j].S = obj.Char(y, x);
                            }
                        }
                        x++;
                    }
                    y++;
                }
                for (int i = 0; i < obj.Posterity.Count; i++)
                {
                    Paint(obj.Posterity[i]);
                }
            }
Example #14
0
        public override void writer(MFileObject file, string optionsString, MPxFileTranslator.FileAccessMode mode)
        {
            string       fullName = file.fullName;
            StreamWriter sWriter  = new StreamWriter(fullName);

            sWriter.Write("# Simple text file of custom node information" + Environment.NewLine);

            MItDependencyNodes iterator = new MItDependencyNodes();

            while (!iterator.isDone)
            {
                MObject obj = iterator.thisNode;
                try
                {
                    MFnDependencyNode dnFn     = new MFnDependencyNode(obj);
                    MPxNode           userNode = dnFn.userNode;
                    if (userNode != null)
                    {
                        sWriter.Write("# custom node: " + dnFn.name + Environment.NewLine);
                    }
                }
                catch (System.Exception)
                {
                }

                iterator.next();
            }
            sWriter.Close();

            return;
        }
Example #15
0
        //This is a potentially slow operation and can be called every nth frame.
        void CalcObject(MObject moParent)
        {
            Array ar = moParent.Modules.ToArray();

            for (int i = 0; i < ar.Length; i++)
            {
                MObject m = (MObject)ar.GetValue(i);
                if (m == null)
                {
                    continue;
                }

                if (m.Renderable)
                {
                    MSceneObject mo = (MSceneObject)m;
                    //meshes use their parent's transforms
                    if ((mo.Type != EType.Mesh) && (mo.Type != EType.BoneMesh))
                    {
                        mo.DistanceFromAvatar = Vector3d.Distance(mo.transform.Position, AvatarPos);
                    }

                    if (mo.DistanceFromAvatar > mo.DistanceThreshold)
                    {
                        mo.Index   = -2;
                        mo.Clipped = true;
                        //return;
                    }
                    else
                    {
                        mo.Clipped = false;
                    }
                }
                CalcObject(m);
            }
        }
Example #16
0
File: Form1.cs Project: zzyyu/SetIP
        private void button1_Click(object sender, EventArgs e)
        {
            //测试
            ManagementBaseObject       myInMBO        = null;
            ManagementBaseObject       myOutMBO       = null;
            ManagementClass            myMClass       = new ManagementClass("Win32_NetWorkAdapterConfiguration");
            ManagementObjectCollection myMOCollection = myMClass.GetInstances();

            foreach (ManagementObject MObject in myMOCollection)
            {
                if (!(bool)MObject["IPEnabled"])
                {
                    continue;
                }
                myInMBO = MObject.GetMethodParameters("EnableStatic");
                myInMBO["IPAddress"]  = new string[] { textBox1.Text };
                myInMBO["SubnetMask"] = new string[] { textBox2.Text };
                myOutMBO = MObject.InvokeMethod("EnableStatic", myInMBO, null);
                //设置网关地址
                myInMBO = MObject.GetMethodParameters("SetGateways");
                myInMBO["DefaultIPGateway"] = new string[] { textBox3.Text };
                myOutMBO = MObject.InvokeMethod("SetGateways", myInMBO, null);
                //设置DNS
                myInMBO = MObject.GetMethodParameters("SetDNSServerSearchOrder");
                myInMBO["DNSServerSearchOrder"] = new string[] { textBox4.Text, textBox5.Text };
                myOutMBO = MObject.InvokeMethod("SetDNSServerSearchOrder", myInMBO, null);
                break;
            }
            ShowInfo();
            MessageBox.Show("IP地址设置成功!");
        }
Example #17
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="isFull">If true all nodes are printed, otherwise only relevant ones</param>
        private void PrintDAG(bool isFull, MObject root = null)
        {
            var dagIterator = new MItDag(MItDag.TraversalType.kDepthFirst);

            if (root != null)
            {
                dagIterator.reset(root);
            }
            RaiseMessage("DAG: " + (isFull ? "full" : "relevant"));
            while (!dagIterator.isDone)
            {
                MDagPath mDagPath = new MDagPath();
                dagIterator.getPath(mDagPath);

                if (isFull || isNodeRelevantToExportRec(mDagPath) || mDagPath.apiType == MFn.Type.kMesh || mDagPath.apiType == MFn.Type.kCamera || mDagPath.hasFn(MFn.Type.kLight) || mDagPath.apiType == MFn.Type.kLocator)
                {
                    RaiseMessage("name=" + mDagPath.partialPathName + "\t type=" + mDagPath.apiType, (int)dagIterator.depth + 1);
                }
                else
                {
                    dagIterator.prune();
                }
                dagIterator.next();
            }
        }
Example #18
0
 public static void NotifyChange(object sender, MObject mo, GraphChangedEvent.ChangeType Reason)
 {
     if (GraphChangeHandler != null)
     {
         GraphChangeHandler(sender, new GraphChangedEvent(mo, Reason));
     }
 }
Example #19
0
        //
        // Takes the  nodes that are on the active selection list and adds an
        // attribute changed callback to each one.
        //
        public override void doIt(MArgList args)
        {
            MObject 		node = new MObject();
            MSelectionList 	list = new MSelectionList();

            // Register node callbacks for all nodes on the active list.
            //
            MGlobal.getActiveSelectionList( list );

            for ( uint i=0; i<list.length; i++ )
            {
                list.getDependNode( i, node );

                try
                {
                    node.AttributeChanged += userCB;
                }
                catch (Exception)
                {
                    MGlobal.displayInfo("MNodeMessage.addCallback failed\n");
                    continue;
                }

                // C# SDK will cleanup events, when this plugin is unloaded
                // callbacks.append(node);
            }

            return;
        }
Example #20
0
        /// <summary>
        /// Find a bone in the skin cluster connections.
        /// From this bone travel the Dag up to the root node.
        /// </summary>
        /// <param name="skin">The skin cluster</param>
        /// <returns>
        /// The root node of the skeleton.
        /// </returns>
        private MObject GetRootNode(MFnSkinCluster skin)
        {
            MObject rootJoint = null;

            if (rootBySkin.ContainsKey(skin))
            {
                return(rootBySkin[skin]);
            }

            // Get a joint of the skin
            rootJoint = GetInfluentNodes(skin)[0];

            // Check the joint parent until it's a kWorld
            MFnDagNode        mFnDagNode  = new MFnDagNode(rootJoint);
            MObject           firstParent = mFnDagNode.parent(0);
            MFnDependencyNode node        = new MFnDependencyNode(firstParent);

            while (!firstParent.apiType.Equals(MFn.Type.kWorld))
            {
                rootJoint   = firstParent;
                mFnDagNode  = new MFnDagNode(rootJoint);
                firstParent = mFnDagNode.parent(0);
                node        = new MFnDependencyNode(firstParent);
            }

            rootBySkin.Add(skin, rootJoint);
            return(rootJoint);
        }
Example #21
0
        private float getMultiplier(MDagPath objPath)
        {
            // Retrieve value of the size attribute from the node
            MObject footprintNode = objPath.node;

            if (!footprintNode.isNull)
            {
                MPlug plug = new MPlug(footprintNode, footPrint.size);
                if (!plug.isNull)
                {
                    MDistance sizeVal = new MDistance();
                    try
                    {
                        plug.getValue(sizeVal);
                        return((float)sizeVal.asCentimeters);
                    }
                    catch (Exception)
                    {
                        MGlobal.displayInfo("Error doing getValue on plugin");
                    }
                }
            }

            return(1.0f);
        }
		//======================================================================
		//
		// Check the parsed arguments and do/undo/redo the command as appropriate
		//
		void checkArgs(ref MArgDatabase argsDb)
		{
			MSelectionList objects = new MSelectionList();

            argsDb.getObjects(objects);

			for (uint i = 0; i < objects.length; ++i)
			{
                MDagPath dagPath = new MDagPath();
                objects.getDagPath((uint)i, dagPath);
                MFnDagNode dagNode = new MFnDagNode(dagPath.node);
                MObject obj = dagNode.child(0);
                if (obj.apiTypeStr == "kMesh")
                {
                    fMesh = new MFnMesh(obj);
                    fObj = obj;
                    fObjTransform = dagPath.node;
                }
			}

			if( fMesh == null || fObj == null || fObjTransform == null )
			{
				string errMsg = MStringResource.getString(MetaDataRegisterMStringResources.kObjectNotFoundError);
				throw new ArgumentException(errMsg, "argsDb");
			}
		}
Example #23
0
        /// <summary>
        /// Originally written in C++ by RobTheBloke.
        /// See https://nccastaff.bournemouth.ac.uk/jmacey/RobTheBloke/www/research/maya/mfnmesh.htm
        /// </summary>
        /// <param name="shadingEngine"></param>
        /// <returns>The shader name.</returns>
        private static MObjectArray GetMaterials(MObject shadingEngine)
        {
            // attach a function set to the shading engine
            var fn = new MFnDependencyNode(shadingEngine);

            // get access to the surfaceShader attribute. This will be connected to
            // lambert , phong nodes etc.
            var sShader = fn.findPlug("surfaceShader");

            // will hold the connections to the surfaceShader attribute
            var materials = new MPlugArray();

            // get the material connected to the surface shader
            sShader.connectedTo(materials, true, false);
            var materialsObjects = new MObjectArray();

            if (materials.Count <= 0)
            {
                return(materialsObjects);
            }
            // if we found a material
            foreach (var plug in materials)
            {
                materialsObjects.Add(plug.node);
            }
            return(materialsObjects);
        }
Example #24
0
        public override bool updateCompleteVertexGroup(MObject component)
        //
        // Description
        //     Make sure complete vertex group data is up-to-date.
        //     Returns true if the component was updated, false if it was already ok.
        //
        //     This is used by deformers when deforming the "whole" object and
        //     not just selected components.
        //
        {
            MFnSingleIndexedComponent fnComponent = new MFnSingleIndexedComponent(component);

            // Make sure there is non-null geometry and that the component
            // is "complete". A "complete" component represents every
            // vertex in the shape.
            //
            if ((null != fGeometry) && (fnComponent.isComplete))
            {
                int maxVerts;
                fnComponent.getCompleteData(out maxVerts);
                int numVertices = (int)fGeometry.vertices.length;

                if ((numVertices > 0) && (maxVerts != numVertices))
                {
                    // Set the component to be complete, i.e. the elements in
                    // the component will be [0:numVertices-1]
                    //
                    fnComponent.setCompleteData(numVertices);
                    return(true);
                }
            }

            return(false);
        }
Example #25
0
        public override bool doRelease(M3dView view)
        {
            // Scale nodes on the selection list.
            // Simple implementation that does not
            // support undo.
            MSelectionList list = new MSelectionList();

            MGlobal.getActiveSelectionList(list);
            MObject node = new MObject();

            for (MItSelectionList iter = new MItSelectionList(list); !iter.isDone; iter.next())
            {
                iter.getDependNode(node);
                MFnTransform xform;
                try
                {
                    xform = new MFnTransform(node);
                }
                catch (System.Exception)
                {
                    continue;
                }

                double[] newScale = new double[3];
                newScale[0] = mousePointGlName.x + 1;
                newScale[1] = mousePointGlName.y + 1;
                newScale[2] = mousePointGlName.z + 1;
                xform.setScale(newScale);
            }
            return(true);
        }
Example #26
0
        public static void RemoveUnusedTextures(MSelectionList list)
        {
            if (list == null)
            {
                Debug.Log("list null");
                return;
            }
            List <MObject> deleteList = new List <MObject>();

            for (int i = 0; i < list.length; i++)
            {
                MObject mo = new MObject();
                list.getDependNode((uint)i, mo);
                MFnDependencyNode imageNode     = new MFnDependencyNode(mo);
                MPlug             texOutputPlug = imageNode.findPlug(ConstantValue.plugName_fileTexOutputColor);
                MPlugArray        destPlugs     = new MPlugArray();
                texOutputPlug.destinations(destPlugs);
                if (destPlugs.Count == 0)
                {
                    deleteList.Add(mo);
                    Debug.Log("remove no use:" + imageNode.absoluteName);
                }
                else
                {
                    Debug.Log("still used:" + imageNode.absoluteName);
                    for (int j = 0; j < destPlugs.length; j++)
                    {
                        Debug.Log(" by:" + destPlugs[0].partialName(true));
                    }
                }
            }
            BasicFunc.DeleteObjects(deleteList);
        }
        public static Dictionary <string, object> getSmoothMesh(MFnMesh mayaMesh)
        {
            MObject     tempMesh = new MObject();
            MFnMeshData meshData = new MFnMeshData();
            MObject     dataObject;
            MObject     smoothedObj = new MObject();

            dataObject  = meshData.create();
            smoothedObj = mayaMesh.generateSmoothMesh(dataObject);
            MFnMesh meshFn = new MFnMesh(smoothedObj);


            // var smoothMeshObj = mayaMesh.generateSmoothMesh();


            // MFnDependencyNode mfnDn = new MFnDependencyNode(smoothedObj);
            // var meshDag = DMInterop.getDagNode(mfnDn.name);
            Mesh dynamoMesh = DMMesh.MTDMeshFromMayaMesh(meshFn, MSpace.Space.kObject);

            //MGlobal.displayInfo(smoothedObj.apiTypeStr);

            //MGlobal.deleteNode(smoothedObj);


            return(new Dictionary <string, object>
            {
                { "mesh", dynamoMesh },
                { "mayaMesh", meshFn }
            });
        }
Example #28
0
		public apiMeshGeomIterator(object userGeometry, MObject component)
			: base(userGeometry, component)
		{
			meshGeometry = (apiMeshGeom)userGeometry;

			reset();
		}
        // Adds a generic attribute that accepts a float, float2, float3
        public static void addComplexFloatGenericAttribute(ref MObject attrObject, string longName, string shortName)
        {
            // Create the generic attribute and set the 3 accepts types
            MFnGenericAttribute gAttr = new MFnGenericAttribute();

            attrObject = gAttr.create(longName, shortName);
            try
            {
                gAttr.addAccept(MFnNumericData.Type.kFloat);

                gAttr.addAccept(MFnNumericData.Type.k2Float);

                gAttr.addAccept(MFnNumericData.Type.k3Float);
            }
            catch (System.Exception)
            {
                MGlobal.displayError("error happens in addAccept");
            }

            gAttr.isWritable = false;
            gAttr.isStorable = false;

            // Add the attribute to the node
            try
            {
                addAttribute(attrObject);
            }
            catch (System.Exception)
            {
                MGlobal.displayError("error happens in addAttribute");
            }
        }
 public void OnEnter(StateMachine machine, IState prevState, object param)
 {
     sceneManager.rightEvents.TriggerPressed += rightTriggerPressed;
     sceneManager.rightEvents.GripPressed    += rightGripPressed;
     status = STATUS.SELECT;
     curObj = null;
 }
Example #31
0
        //======================================================================
        //
        // Check the parsed arguments and do/undo/redo the command as appropriate
        //
        void checkArgs(ref MArgDatabase argsDb)
        {
            MSelectionList objects = new MSelectionList();

            argsDb.getObjects(objects);

            for (uint i = 0; i < objects.length; ++i)
            {
                MDagPath dagPath = new MDagPath();
                objects.getDagPath((uint)i, dagPath);
                MFnDagNode dagNode = new MFnDagNode(dagPath.node);
                MObject    obj     = dagNode.child(0);
                if (obj.apiTypeStr == "kMesh")
                {
                    fMesh         = new MFnMesh(obj);
                    fObj          = obj;
                    fObjTransform = dagPath.node;
                }
            }

            if (fMesh == null || fObj == null || fObjTransform == null)
            {
                string errMsg = MStringResource.getString(MetaDataRegisterMStringResources.kObjectNotFoundError);
                throw new ArgumentException(errMsg, "argsDb");
            }
        }
Example #32
0
        private MFnSkinCluster getMFnSkinCluster(MFnMesh mFnMesh)
        {
            MFnSkinCluster mFnSkinCluster = null;

            MPlugArray connections = new MPlugArray();

            mFnMesh.getConnections(connections);
            foreach (MPlug connection in connections)
            {
                MObject source = connection.source.node;
                if (source != null)
                {
                    if (source.hasFn(MFn.Type.kSkinClusterFilter))
                    {
                        mFnSkinCluster = new MFnSkinCluster(source);
                    }

                    if ((mFnSkinCluster == null) && (source.hasFn(MFn.Type.kSet) || source.hasFn(MFn.Type.kPolyNormalPerVertex)))
                    {
                        mFnSkinCluster = getMFnSkinCluster(source);
                    }
                }
            }

            return(mFnSkinCluster);
        }
Example #33
0
        public static void DeleteUnusedShadingNode(MSelectionList list)
        {
            if (list == null)
            {
                Debug.Log("list null");
                return;
            }
            List <MFnDependencyNode> deleteList = new List <MFnDependencyNode>();

            for (int i = 0; i < list.length; i++)
            {
                MObject mo = new MObject();
                list.getDependNode((uint)i, mo);
                if (mo.hasFn(MFn.Type.kShadingEngine))
                {
                    MFnDependencyNode sgNode = new MFnDependencyNode(mo);
                    MPlug             plug_dagSetMemebers = sgNode.findPlug(ConstantValue.plugName_dagSetMembers);
                    Debug.Log("numelements:" + plug_dagSetMemebers.numElements);
                    if (plug_dagSetMemebers.numElements == 0)
                    {
                        deleteList.Add(sgNode);
                    }
                }
                //Debug.Log(sgNode.name);
            }
            BasicFunc.DeleteObjects(deleteList);
        }
Example #34
0
        private bool isAiStandardSurfaceNotStdNotPBS(MFnDependencyNode materialDependencyNode)
        {
            // TODO - This is a fix until found a better way to identify AiStandardSurface material
            MObject materialObject = materialDependencyNode.objectProperty;

            return(!materialObject.hasFn(MFn.Type.kLambert) && !isStingrayPBSMaterial(materialDependencyNode) && isAiStandardSurface(materialDependencyNode));
        }
Example #35
0
        public void receiveCurveFromMaya(string node_name, out Point3DCollection controlVertices, out List<double> weights, out List<double> knots, out int degree, out bool closed, out bool rational)
        {
            MPlug plLocal = getPlug(node_name, "local");
            MObject oLocal = new MObject();
            plLocal.getValue(oLocal);

            MFnNurbsCurve nc = new MFnNurbsCurve(oLocal);

            MPointArray p_aCVs = new MPointArray();
            nc.getCVs(p_aCVs, MSpace.Space.kWorld);
            controlVertices = new Point3DCollection();
            weights = new List<double>();
            foreach (MPoint p in p_aCVs)
            {
                controlVertices.Add(new Point3D(p.x, p.y, p.z));
                weights.Add(1.0);
            }

            double min = 0, max = 0;
            nc.getKnotDomain(ref min, ref max);
            MDoubleArray d_aKnots = new MDoubleArray();
            nc.getKnots(d_aKnots);

            knots = new List<double>();
            knots.Add(min);
            foreach (double d in d_aKnots)
            {
                knots.Add(d);
            }
            knots.Add(max);

            degree = nc.degree;
            closed = nc.form == MFnNurbsCurve.Form.kClosed ? true : false;
            rational = true;
        }
    protected override void Awake()
    {
        base.Awake();

        if (_rTrans == null) _rTrans = GetComponent<RectTransform>();
        if (_mObj == null) _mObj = transform.GetComponentInParentRecursively<MObject>();
    }
Example #37
0
        /// <summary>
        /// Init the list influentNodesBySkin of a skin cluster.
        /// By find the kjoint that are connected to the skin.
        /// </summary>
        /// <param name="skin">the skin cluster</param>
        /// <returns>
        /// The list of skin kjoint
        /// </returns>
        private List <MObject> GetInfluentNodes(MFnSkinCluster skin)
        {
            if (influentNodesBySkin.ContainsKey(skin))
            {
                return(influentNodesBySkin[skin]);
            }

            List <MObject> influentNodes = new List <MObject>();

            // Get all influenting nodes
            MPlugArray connections = new MPlugArray();

            skin.getConnections(connections);
            foreach (MPlug connection in connections)
            {
                MObject source = connection.source.node;
                if (source != null && source.hasFn(MFn.Type.kJoint))
                {
                    if (influentNodes.Count(node => Equals(node, source)) == 0)
                    {
                        influentNodes.Add(source);
                    }
                }
            }
            influentNodesBySkin.Add(skin, influentNodes);

            return(influentNodes);
        }
        public static void initialize()
        {
            MFnNumericAttribute nAttr = new MFnNumericAttribute();

            // single float attribute affecting a generic attribute
            try{
                gInputInt = nAttr.create("gInputInt", "gii",
                                         MFnNumericData.Type.kInt, 0);
            }
            catch (System.Exception)
            {
                MGlobal.displayError("error happens in addAccept");
            }
            nAttr.isStorable = true;
            nAttr.isKeyable  = true;

            try{
                addAttribute(gInputInt);
            }
            catch (System.Exception)
            {
                MGlobal.displayError("error happens in addAccept");
            }

            addComplexFloatGenericAttribute(ref gOutputFloat_2Float_3Float, "gOutputFloat_2Float_3Float", "gof2f3f");

            try{
                attributeAffects(gInputInt, gOutputFloat_2Float_3Float);
            }
            catch (System.Exception)
            {
                MGlobal.displayError("error happens in addAccept");
            }
            return;
        }
Example #39
0
        public override void connectToDependNode(MObject node)
        {

            // Find the rotate and rotatePivot plugs on the node.  These plugs will 
            // be attached either directly or indirectly to the manip values on the
            // rotate manip.
            //
            MFnDependencyNode nodeFn = new MFnDependencyNode(node);
            MPlug rPlug = nodeFn.findPlug("rotate");
            MPlug rcPlug = nodeFn.findPlug("rotatePivot");

            // If the translate pivot exists, it will be used to move the state manip
            // to a convenient location.
            //
            MPlug tPlug = nodeFn.findPlug("translate");

            // To avoid having the object jump back to the default rotation when the
            // manipulator is first used, extract the existing rotation from the node
            // and set it as the initial rotation on the manipulator.
            //
            MEulerRotation existingRotation = new MEulerRotation(vectorPlugValue(rPlug));
            MVector existingTranslation = new MVector(vectorPlugValue(tPlug));

            // 
            // The following code configures default settings for the rotate 
            // manipulator.
            //

            MFnRotateManip rotateManip = new MFnRotateManip(fRotateManip);
            rotateManip.setInitialRotation(existingRotation);
            rotateManip.setRotateMode(MFnRotateManip.RotateMode.kObjectSpace);
            rotateManip.displayWithNode(node);

            // Add a callback function to be called when the rotation value changes
            //

            //rotatePlugIndex = addManipToPlugConversionCallback( rPlug, (manipToPlugConversionCallback)&exampleRotateManip::rotationChangedCallback );
            ManipToPlugConverion[rPlug] = rotationChangedCallback;
            // get the index of plug
            rotatePlugIndex = this[rPlug];

            // Create a direct (1-1) connection to the rotation center plug
            //
            rotateManip.connectToRotationCenterPlug(rcPlug);

            // Place the state manip at a distance of 2.0 units away from the object
            // along the X-axis.
            //
            MFnStateManip stateManip = new MFnStateManip(fStateManip);
            MVector delta = new MVector(2, 0, 0);
            stateManip.setTranslation(existingTranslation + delta,
                MSpace.Space.kTransform);

            finishAddingManips();
            base.connectToDependNode(node);
        }
Example #40
0
        public static bool initialize()
        {
            MFnUnitAttribute unitFn = new MFnUnitAttribute();

            size = unitFn.create( "size", "sz", MFnUnitAttribute.Type.kDistance );
            unitFn.setDefault( 1.0 );

            addAttribute( size );

            return true;
        }
		public TrackingObject(MObject source)
		{
			this.Position = new Vector2D((double)source.X(), (double)source.Y());
			this.Area = source.Area();
			this.Width = source.Width();
			this.Height = source.Height();
			this.Left = source.Left();
			this.Right = source.Right();
			this.Top = source.Top();
			this.Bottom = source.Bottom();
		}
Example #42
0
        protected MObject createMesh(MTime time, ref MObject outData)
        {
            int numVertices, frame;
            float cubeSize;
            MFloatPointArray points = new MFloatPointArray();
            MFnMesh meshFS = new MFnMesh();

            // Scale the cube on the frame number, wrap every 10 frames.
            frame = (int)time.asUnits(MTime.Unit.kFilm);
            if (frame == 0)
                frame = 1;
            cubeSize = 0.5f * (float)(frame % 10);

            const int numFaces = 6;
            numVertices = 8;

            MFloatPoint vtx_1 = new MFloatPoint(-cubeSize, -cubeSize, -cubeSize);
            MFloatPoint vtx_2 = new MFloatPoint(cubeSize, -cubeSize, -cubeSize);
            MFloatPoint vtx_3 = new MFloatPoint(cubeSize, -cubeSize, cubeSize);
            MFloatPoint vtx_4 = new MFloatPoint(-cubeSize, -cubeSize, cubeSize);
            MFloatPoint vtx_5 = new MFloatPoint(-cubeSize, cubeSize, -cubeSize);
            MFloatPoint vtx_6 = new MFloatPoint(-cubeSize, cubeSize, cubeSize);
            MFloatPoint vtx_7 = new MFloatPoint(cubeSize, cubeSize, cubeSize);
            MFloatPoint vtx_8 = new MFloatPoint(cubeSize, cubeSize, -cubeSize);
            points.append(vtx_1);
            points.append(vtx_2);
            points.append(vtx_3);
            points.append(vtx_4);
            points.append(vtx_5);
            points.append(vtx_6);
            points.append(vtx_7);
            points.append(vtx_8);


            // Set up an array containing the number of vertices
            // for each of the 6 cube faces (4 verticies per face)
            //
            int[] face_counts = { 4, 4, 4, 4, 4, 4 };
            MIntArray faceCounts = new MIntArray(face_counts);

            // Set up and array to assign vertices from points to each face 
            //
            int[] face_connects = {	0, 1, 2, 3,
									4, 5, 6, 7,
									3, 2, 6, 5,
									0, 3, 5, 4,
									0, 4, 7, 1,
									1, 7, 6, 2	};
            MIntArray faceConnects = new MIntArray(face_connects);

            MObject newMesh = meshFS.create(numVertices, numFaces, points, faceCounts, faceConnects, outData);

            return newMesh;
        }
Example #43
0
 public override MPxGeometryIterator geometryIteratorSetup(MObjectArray componentList, MObject components, bool forReadOnly)
 {
     apiSimpleShapeIterator result;
     if (components.isNull)
     {
         result = new apiSimpleShapeIterator(controlPoints, componentList);
     }
     else
     {
         result = new apiSimpleShapeIterator(controlPoints, components);
     }
     return result;
 }
Example #44
0
 //////////////////////////////////////////////////////////////////
 //
 // Overrides from MPxGeometryData
 //
 //////////////////////////////////////////////////////////////////
 public override MPxGeometryIterator iterator( MObjectArray componentList,
     MObject component,
     bool useComponents)
 {
     apiMeshGeomIterator result = null;
     if ( useComponents ) {
         result = new apiMeshGeomIterator( fGeometry, componentList );
     }
     else {
         result = new apiMeshGeomIterator( fGeometry, component );
     }
     return result;
 }
        public override void createVertexStream(MObject objPath,
            MVertexBuffer vertexBuffer,
            MComponentDataIndexing targetIndexing,
            MComponentDataIndexing sharedIndexing,
            MVertexBufferArray sourceStreams)
        {
            // get the descriptor from the vertex buffer.
            // It describes the format and layout of the stream.
            MVertexBufferDescriptor descriptor = vertexBuffer.descriptor;

            // we are expecting a float stream.
            if (descriptor.dataType != Autodesk.Maya.OpenMayaRender.MHWRender.MGeometry.DataType.kFloat) return;

            // we are expecting a float2
            if (descriptor.dimension != 2) return;

            // we are expecting a texture channel
            if (descriptor.semantic != Autodesk.Maya.OpenMayaRender.MHWRender.MGeometry.Semantic.kTexture) return;

            // get the mesh from the current path, if it is not a mesh we do nothing.
            MFnMesh mesh = null;
            try {
                mesh = new MFnMesh(objPath);
            } catch(System.Exception) {
                return; // failed
            }

            MUintArray indices = targetIndexing.indicesProperty;
            uint vertexCount = indices.length;
            if (vertexCount <= 0) return;

            unsafe {
                // acquire the buffer to fill with data.
                float * buffer = (float *)vertexBuffer.acquire(vertexCount);

                for (int i = 0; i < vertexCount; i++)
                {
                    // Here we are embedding some custom data into the stream.
                    // The included effects (vertexBufferGeneratorGL.cgfx and
                    // vertexBufferGeneratorDX11.fx) will alternate
                    // red, green, and blue vertex colored triangles based on this input.
                    *(buffer++) = 1.0f;
                    *(buffer++) = (float)indices[i]; // color index
                }

                // commit the buffer to signal completion.
                vertexBuffer.commit( (byte *)buffer);
            }
        }
Example #46
0
 public Point3DCollection receiveVertexPositionsFromMaya(string node_name)
 {
     MPlug plLocal = getPlug(node_name, "outMesh");
     MObject oOutMesh = new MObject();
     plLocal.getValue(oOutMesh);
     MFnMesh m = new MFnMesh(oOutMesh);
     MPointArray p_aVertices = new MPointArray();
     m.getPoints(p_aVertices, MSpace.Space.kWorld);
     Point3DCollection vertices = new Point3DCollection();
     foreach (MPoint p in p_aVertices)
     {
         vertices.Add(new Point3D(p.x, p.y, p.z));
     }
     return vertices;
 }
Example #47
0
        public static void initialize()
        {
            MFnUnitAttribute unitAttr = new MFnUnitAttribute();
            MFnTypedAttribute typedAttr = new MFnTypedAttribute();

            animCube.time = unitAttr.create("time", "tm", MFnUnitAttribute.Type.kTime, 0.0);

            animCube.outputMesh = typedAttr.create("outputMesh", "out", MFnData.Type.kMesh);
            typedAttr.isStorable = false;

            addAttribute(animCube.time);
            addAttribute(animCube.outputMesh);

            attributeAffects(animCube.time, animCube.outputMesh);
        }
        public static bool initializer()
        {
            MFnEnumAttribute enumAttr = new MFnEnumAttribute();

            // Create the layerType attribute and define its enum values.
            //
            exCameraSet.layerTypeAttr = enumAttr.create("layerType", "lt", 0);

            enumAttr.addField("Mono", 0);
            enumAttr.addField("Left", 1);
            enumAttr.addField("Right", 2);

            // Make this attribute a multi so it can store a value per camera layer.
            //
            enumAttr.isArray = true;
            return true;
        }
Example #49
0
		public static void initialize()
		//
		// Description
		//
		//    Attribute (static) initialization.
		//
		{
			MFnNumericAttribute numAttr = new MFnNumericAttribute();
			MFnEnumAttribute enumAttr = new MFnEnumAttribute();
			MFnTypedAttribute typedAttr = new MFnTypedAttribute();

			// ----------------------- INPUTS -------------------------

			size = numAttr.create("size", "sz", MFnNumericData.Type.kDouble, 1.0);
			numAttr.isArray = false;
			numAttr.usesArrayDataBuilder = false;
			numAttr.isHidden = false;
			numAttr.isKeyable = true;
			addAttribute(size);

			shapeType = enumAttr.create("shapeType", "st", 0);
			enumAttr.addField("cube", 0);
			enumAttr.addField("sphere", 1);
			enumAttr.isHidden = false;
			enumAttr.isKeyable = true;
			addAttribute(shapeType);

			inputMesh = typedAttr.create("inputMesh", "im", MFnData.Type.kMesh);
			typedAttr.isHidden = true;
			addAttribute(inputMesh);

			// ----------------------- OUTPUTS -------------------------
			outputSurface = typedAttr.create("outputSurface", "os", new MTypeId(apiMeshData.id));
			typedAttr.isWritable = false;
			addAttribute(outputSurface);

			// ---------- Specify what inputs affect the outputs ----------
			//
			attributeAffects(inputMesh, outputSurface);
			attributeAffects(size, outputSurface);
			attributeAffects(shapeType, outputSurface);
		}
Example #50
0
        public override bool getSourceIndexing(MObject obj, MComponentDataIndexing sourceIndexing)
		{
            // get the mesh from the current path, if it is not a mesh we do nothing.
			MFnMesh mesh = null;
			try {
				mesh = new MFnMesh(obj);
			} catch(System.Exception) {
				return false;
			}

			// if it is an empty mesh we do nothing.
			int numPolys = mesh.numPolygons;
			if (numPolys <= 0) return false;

			// for each face
            MUintArray vertToFaceVertIDs = sourceIndexing.indicesProperty;
			uint faceNum = 0;
			for (int i = 0; i < numPolys; i++)
			{
				// assign a color ID to all vertices in this face.
				uint faceColorID = faceNum % 3;

				int vertexCount = mesh.polygonVertexCount(i);
				for (int j = 0; j < vertexCount; j++)
				{
					// set each face vertex to the face color
					vertToFaceVertIDs.append(faceColorID);
				}

				faceNum++;
			}

			// assign the source indexing
			sourceIndexing.setComponentType(MComponentDataIndexing.MComponentType.kFaceVertex);

			return true;
		}
Example #51
0
        public static void initialize()
        {
            MFnNumericAttribute numAttr = new MFnNumericAttribute();
            MFnTypedAttribute typedAttr = new MFnTypedAttribute();

            // ----------------------- INPUTS --------------------------
            inputSurface = typedAttr.create("inputSurface", "is", new MTypeId(apiMeshData.id));
            typedAttr.isStorable = false;
            addAttribute( inputSurface );

            // ----------------------- OUTPUTS -------------------------

            // bbox attributes
            //
            bboxCorner1 = numAttr.create( "bboxCorner1", "bb1", MFnNumericData.Type.k3Double, 0 );
            numAttr.isArray = false;
            numAttr.usesArrayDataBuilder = false;
            numAttr.isHidden = false;
            numAttr.isKeyable = false;
            addAttribute( bboxCorner1 );

            bboxCorner2 = numAttr.create( "bboxCorner2", "bb2", MFnNumericData.Type.k3Double, 0 );
            numAttr.isArray = false;
            numAttr.usesArrayDataBuilder = false;
            numAttr.isHidden = false;
            numAttr.isKeyable = false;
            addAttribute( bboxCorner2 );

            // local/world output surface attributes
            //
            outputSurface = typedAttr.create("outputSurface", "os", new MTypeId(apiMeshData.id));
            addAttribute( outputSurface );
            typedAttr.isWritable = false;

            worldSurface = typedAttr.create("worldSurface", "ws", new MTypeId(apiMeshData.id));
            typedAttr.isCached = false;
            typedAttr.isWritable = false;
            typedAttr.isArray = true;
            typedAttr.usesArrayDataBuilder = true;
            typedAttr.disconnectBehavior = MFnAttribute.DisconnectBehavior.kDelete;
             			typedAttr.isWorldSpace = true;
            addAttribute( worldSurface );

            // Cached surface used for file IO
            //
            cachedSurface = typedAttr.create("cachedSurface", "cs", new MTypeId(apiMeshData.id));
            typedAttr.isReadable = true;
            typedAttr.isWritable = true;
            typedAttr.isStorable = true;
            addAttribute( cachedSurface );

            // ---------- Specify what inputs affect the outputs ----------
            //
            attributeAffects( inputSurface, outputSurface );
            attributeAffects( inputSurface, worldSurface );
            attributeAffects( outputSurface, worldSurface );
            attributeAffects( inputSurface, bboxCorner1 );
            attributeAffects( inputSurface, bboxCorner2 );
            attributeAffects( cachedSurface, outputSurface );
            attributeAffects( cachedSurface, worldSurface );

            attributeAffects( mControlPoints, outputSurface );
            attributeAffects( mControlValueX, outputSurface );
            attributeAffects( mControlValueY, outputSurface );
            attributeAffects( mControlValueZ, outputSurface );
            attributeAffects( mControlPoints, cachedSurface );
            attributeAffects( mControlValueX, cachedSurface );
            attributeAffects( mControlValueY, cachedSurface );
            attributeAffects( mControlValueZ, cachedSurface );
            attributeAffects( mControlPoints, worldSurface );
            attributeAffects( mControlValueX, worldSurface );
            attributeAffects( mControlValueY, worldSurface );
            attributeAffects( mControlValueZ, worldSurface );
        }
Example #52
0
 //
 // Description
 //
 //    Creates a geometry iterator compatible with his shape.
 //
 // Arguments
 //
 //    componentList - list of components to be iterated
 //    components    - component to be iterator
 //    forReadOnly   -
 //
 // Returns
 //
 //    An iterator for the components
 //
 // Associates a user defined iterator with the shape (components)
 //
 public override MPxGeometryIterator geometryIteratorSetup( MObjectArray componentList,
     MObject components,
     bool forReadOnly = false)
 {
     apiMeshGeomIterator result = null;
     if ( components.isNull ) {
         result = new apiMeshGeomIterator( meshGeom(), componentList );
     }
     else {
         result = new apiMeshGeomIterator( meshGeom(), components );
     }
     return result;
 }
Example #53
0
        //
        // Description
        //
        //    Converts the given component values into a selection list of plugs.
        //    This method is used to map components to attributes.
        //
        // Arguments
        //
        //    component - the component to be translated to a plug/attribute
        //    list      - a list of plugs representing the passed in component
        //
        public override void componentToPlugs(MObject component, MSelectionList list)
        {
            if ( component.hasFn(MFn.Type.kSingleIndexedComponent) ) {

                MFnSingleIndexedComponent fnVtxComp = new MFnSingleIndexedComponent( component );
                MObject thisNode = thisMObject();
                MPlug plug = new MPlug( thisNode, mControlPoints );
                // If this node is connected to a tweak node, reset the
                // plug to point at the tweak node.
                //
                convertToTweakNodePlug(plug);

                int len = fnVtxComp.elementCount;

                for ( int i = 0; i < len; i++ )
                {
                    plug.selectAncestorLogicalIndex((uint)fnVtxComp.element(i), plug.attribute);
                    list.add(plug);
                }
            }
        }
Example #54
0
        //
        // Description
        //
        //    Returns the bounding box for this object.
        //    It is a good idea not to recompute here as this funcion is called often.
        //
        public override MBoundingBox boundingBox()
        {
            MObject thisNode = thisMObject();
            MPlug c1Plug = new MPlug( thisNode, bboxCorner1 );
            MPlug c2Plug = new MPlug( thisNode, bboxCorner2 );
            MObject corner1Object = new MObject();
            MObject corner2Object = new MObject();
            c1Plug.getValue( corner1Object );
            c2Plug.getValue( corner2Object );

            double[] corner1 = new double[3];
            double[] corner2 = new double[3];

            MFnNumericData fnData = new MFnNumericData();
            fnData.setObject( corner1Object );
            fnData.getData(out corner1[0], out corner1[1], out corner1[2]);
            fnData.setObject( corner2Object );
            fnData.getData(out corner2[0], out corner2[1], out corner2[2]);

            MPoint corner1Point = new MPoint( corner1[0], corner1[1], corner1[2] );
            MPoint corner2Point = new MPoint( corner2[0], corner2[1], corner2[2] );

            return new MBoundingBox( corner1Point, corner2Point );
        }
Example #55
0
 //
 // Description
 //
 //    Specifies that this shape can provide an iterator for getting/setting
 //    control point values.
 //
 // Arguments
 //
 //    writable   - Maya asks for an iterator that can set points if this is true
 //    forReadOnly - Maya asking for an iterator for querying only
 //
 public override bool acceptsGeometryIterator( MObject obj,
     bool writeable = true,
     bool forReadOnly = false)
 {
     return true;
 }
Example #56
0
        //
        // Description
        //
        //    Returns offsets for the given components to be used my the
        //    move tool in normal/u/v mode.
        //
        // Arguments
        //
        //    component - components to calculate offsets for
        //    direction - array of offsets to be filled
        //    mode      - the type of offset to be calculated
        //    normalize - specifies whether the offsets should be normalized
        //
        // Returns
        //
        //    true if the offsets could be calculated, false otherwise
        //
        // Support the move tools normal/u/v mode (components)
        //
        public override bool vertexOffsetDirection( MObject component,
            MVectorArray direction,
            MVertexOffsetMode mode,
            bool normalize)
        {
            bool offsetOkay = false ;

            MFnSingleIndexedComponent fnComp = new MFnSingleIndexedComponent( component );
            if ( component.apiType != MFn.Type.kMeshVertComponent ) {
                return false;
            }

            offsetOkay = true ;

            apiMeshGeom geomPtr = meshGeom();
            if ( null == geomPtr ) {
                return false;
            }

            // For each vertex add the appropriate offset
            //
            int count = fnComp.elementCount;
            for ( int idx=0; idx<count; idx++ )
            {
                MVector normal = geomPtr.normals[ fnComp.element(idx) ];

                if( mode == MVertexOffsetMode.kNormal ) {
                    if( normalize ) normal.normalize() ;
                    direction.append( normal );
                }
                else {
                    // Construct an orthonormal basis from the normal
                    // uAxis, and vAxis are the new vectors.
                    //
                    MVector uAxis = new MVector();
                    MVector vAxis = new MVector();
                    uint i, j, k;
                    double a;
                    normal.normalize();

                    i = 0;
                    a = Math.Abs( normal[0] );
                    if ( a < Math.Abs(normal[1]) )
                    {
                        i = 1;
                        a = Math.Abs(normal[1]);
                    }

                    if ( a < Math.Abs(normal[2]) )
                    {
                        i = 2;
                    }

                    j = (i+1)%3;
                    k = (j+1)%3;

                    a = Math.Sqrt(normal[i]*normal[i] + normal[j]*normal[j]);
                    uAxis[i] = -normal[j]/a;
                    uAxis[j] = normal[i]/a;
                    uAxis[k] = 0.0;
                    vAxis = normal.crossProduct( uAxis );

                    if ( mode == MVertexOffsetMode.kUTangent ||
                         mode == MVertexOffsetMode.kUVNTriad )
                    {
                        if( normalize ) uAxis.normalize() ;
                        direction.append( uAxis );
                    }

                    if ( mode == MVertexOffsetMode.kVTangent ||
                         mode == MVertexOffsetMode.kUVNTriad )
                    {
                        if( normalize ) vAxis.normalize() ;
                        direction.append( vAxis );
                    }

                    if ( mode == MVertexOffsetMode.kUVNTriad ) {
                        if( normalize ) normal.normalize() ;
                        direction.append( normal );
                    }
                }
            }

            return offsetOkay;
        }
Example #57
0
        //
        // Description
        //
        //    During file save this method is called to determine which
        //    attributes of this node should get written. The default behavior
        //    is to only save attributes whose values differ from the default.
        //
        //
        //
        public override bool shouldSave(MPlug plug, ref bool result)
        {
            if( plug.attribute.equalEqual(mControlPoints) ||
                plug.attribute.equalEqual(mControlValueX) ||
                plug.attribute.equalEqual(mControlValueY) ||
                plug.attribute.equalEqual(mControlValueZ) )
            {
                if( hasHistory() ) {
                    // Calling this will only write tweaks if they are
                    // different than the default value.
                    //
                    return base.shouldSave( plug, ref result );
                }
                else {
                    result = false;
                }
            }
            else if ( plug.attribute.equalEqual(cachedSurface) ) {
                if ( hasHistory() ) {
                    result = false;
                }
                else {
                    MObject data = new MObject();
                    plug.getValue( data );
                    result = ( ! data.isNull );
                }
            }
            else {
                return base.shouldSave( plug, ref result );
            }

            return true;
        }
        public static void initialize()
        {
            // constraint attributes

            {	// Geometry: mesh, readable, not writable, delete on disconnect
                MFnTypedAttribute typedAttrNotWritable = new MFnTypedAttribute();
                GeometrySurfaceConstraint.constraintGeometry = typedAttrNotWritable.create( "constraintGeometry", "cg", MFnData.Type.kMesh);
                typedAttrNotWritable.isReadable = true;
                typedAttrNotWritable.isWritable = false;
                typedAttrNotWritable.disconnectBehavior = MFnAttribute.DisconnectBehavior.kDelete;
            }
            {	// Parent inverse matrix: delete on disconnect
                MFnTypedAttribute typedAttr = new MFnTypedAttribute();
                GeometrySurfaceConstraint.constraintParentInverseMatrix = typedAttr.create( "constraintPim", "ci", MFnData.Type.kMatrix);
                typedAttr.disconnectBehavior = MFnAttribute.DisconnectBehavior.kDelete;

                // Target geometry: mesh, delete on disconnect
                GeometrySurfaceConstraint.targetGeometry = typedAttr.create( "targetGeometry", "tg", MFnData.Type.kMesh);
                typedAttr.disconnectBehavior = MFnAttribute.DisconnectBehavior.kDelete;
            }
            {	// Target weight: double, min 0, default 1.0, keyable, delete on disconnect
                MFnNumericAttribute typedAttrKeyable = new MFnNumericAttribute();
                GeometrySurfaceConstraint.targetWeight = typedAttrKeyable.create( "weight", "wt", MFnNumericData.Type.kDouble, 1.0);
                typedAttrKeyable.setMin( (double) 0 );
                typedAttrKeyable.isKeyable = true;
                typedAttrKeyable.disconnectBehavior = MFnAttribute.DisconnectBehavior.kDelete;
            }
            {	// Compound target(geometry,weight): array, delete on disconnect
                MFnCompoundAttribute compoundAttr = new MFnCompoundAttribute();
                GeometrySurfaceConstraint.compoundTarget = compoundAttr.create( "target", "tgt");
                compoundAttr.addChild(GeometrySurfaceConstraint.targetGeometry);
                compoundAttr.addChild(GeometrySurfaceConstraint.targetWeight);
                compoundAttr.isArray = true;
                compoundAttr.disconnectBehavior = MFnAttribute.DisconnectBehavior.kDelete;
            }

            addAttribute(GeometrySurfaceConstraint.constraintParentInverseMatrix);
            addAttribute(GeometrySurfaceConstraint.constraintGeometry);
            addAttribute(GeometrySurfaceConstraint.compoundTarget);

            attributeAffects(compoundTarget, constraintGeometry);
            attributeAffects(targetGeometry, constraintGeometry);
            attributeAffects(targetWeight, constraintGeometry);
            attributeAffects(constraintParentInverseMatrix, constraintGeometry);
        }
 // The implementation here is a bit different from its counterpart C++ sample because
 // .NET SDK decides not to support the obsolete C++ API:
 //
 // bool connectTargetAttribute (void *opaqueTarget, int index, MObject &constraintAttr);
 //
 protected override bool connectTarget( MDagPath targetPath, int index )
 {
     try
     {
         MObject targetObject = new MObject(targetPath.node);
         MFnDagNode targetDagNode = new MFnDagNode(targetObject);
         connectTargetAttribute(targetPath, index, targetDagNode.attribute("worldMesh"),
             GeometrySurfaceConstraint.targetGeometry);
     }
     catch (Exception)
     {
         MGlobal.displayError("Failed to connect target.");
         return false;
     }
     return true;
 }
Example #60
0
		//
		// Write out the 'addAttr' and 'setAttr' commands for a node.
		//
		protected void writeNodeAttrs(FileStream f, MObject node, bool isSelected)
		{
			MFnDependencyNode	nodeFn = new MFnDependencyNode(node);

			if (nodeFn.canBeWritten)
			{
				MStringArray	addAttrCmds = new MStringArray();
				MStringArray	setAttrCmds = new MStringArray();

				getAddAttrCmds(node, addAttrCmds);
				getSetAttrCmds(node, setAttrCmds);

				uint numAddAttrCmds = addAttrCmds.length;
				uint numSetAttrCmds = setAttrCmds.length;

				if (numAddAttrCmds + numSetAttrCmds > 0)
				{
					//
					// If the node is not already selected, then issue a command to
					// select it.
					//
					if (!isSelected) writeSelectNode(f, node);

					int i;
					string result = "";
					for (i = 0; i < numAddAttrCmds; i++)
						result += (addAttrCmds[i] + "\n");

					for (i = 0; i < numSetAttrCmds; i++)
						result += (setAttrCmds[i] + "\n");

					writeString(f, result);
				}
			}
		}