Vormav Posted June 25, 2009 Share Posted June 25, 2009 (edited) Hey. Question for anyone familiar with creating new networks and OP_OperatorTable objects. I'm adding a new network node to DOPs. Following from as much as I could guess from the source headers, I have isNetwork() returning 1, isSubnetwork() returning 0, etc. So now it behaves like a network with DOPs functionality. That's most of what I want. When this is all done, it's only going to make sense to use a certain subset of the available DOP nodes inside of this network. For that reason, I want to be able to limit both the node types that can be created inside the network and make the right-click op menu reflect that limited set of nodes. From my understanding, all of that is defined by the node's OP_OperatorTable. So, I've tried creating my own OP_OperatorTable, adding specific operator types to it with addOperator (the same way you install standard dso operators), then I apply that table with setOperatorTable inside the node's constructor method. No good: all dop operators are still available under the network, and any operators I add exclusively to my network's operator table are not available. So, maybe I'm misunderstanding the Houdini architecture a little bit. Is what I'm trying to do here not possible through the HDK? Even if I can't remove some of the available dop nodes within my network, I'd at least like to be able to add a few nodes that can only be created within this specific network. Certainly there are plenty of cases in Houdini where that has been done (for instance, vop subnet in/out). But then again, all of those cases could have been hard-coded, and inaccessible to the HDK programmer. I also thought that maybe Houdini is internally checking the network's operator type/typeId (getOpTypeID()/getOpType()) and looking up the correct operator table somewhere else using that id/name, so I've tried overriding all of those methods to point at some new kind of optype...again, with no luck, not even any 'invalid optype' warnings/errors. (we can't really create new operator types through the hdk anyway, though, right? Just new nodes for existing op types?). Edited June 25, 2009 by Vormav Quote Link to comment Share on other sites More sharing options...
edward Posted June 26, 2009 Share Posted June 26, 2009 An OP_OperatorTable defines an entire xOP context. I don't think you want to be redefining a new operator context. On your DOP_Node subclass, override the virtual function OP_Network::getOperatorFilter() to return a pointer to an instance of your own OP_OperatorFilter subclass (see OP_Network.h). Your custom OP_OperatorFilter subclass should override allowOperatorAsChild() to return false if it wants to disallow the given operator type. This is typically done via a string comparison with OP_Operator::getName(). Quote Link to comment Share on other sites More sharing options...
Vormav Posted June 26, 2009 Author Share Posted June 26, 2009 Perfect. Thank you. I was able to filter just about everything as desired. Well, the odd exception seems to be the ground plane. That's the only operator that for some reason doesn't even get passed through the op filter (i'm printing op names to stdout from within the filter. All ops except the ground plane make an appearance). Strange. But I think I can ignore that. Quote Link to comment Share on other sites More sharing options...
edward Posted June 26, 2009 Share Posted June 26, 2009 I took a quick step through the code and it looks like it passes "groundplane" to the op filter to me. Quote Link to comment Share on other sites More sharing options...
Vormav Posted June 27, 2009 Author Share Posted June 27, 2009 (edited) Maybe it's version specific. I'm on H10.0.249.3 here. Running this filter method: virtual bool allowOperatorAsChild(OP_Operator* op) { UT_String name = op->getName(); std::cout << "Checking " << name << "\n"; } I get the following: Checking gasnetslicebalance Checking switchvalue Checking gascombustion Checking gassphdensity Checking pointcollider Checking grouprel Checking wireplasticity Checking conrelationship Checking gasparticlemovetoiso Checking gasintermittentsolve Checking gasanalysis Checking applyrel Checking gasseedmarkers Checking smokeconfigureobject Checking renderparms Checking colliderel Checking wireglueconstraint Checking fluidforce Checking gasresizefield Checking emptydata Checking clothphysparms Checking matrixfield Checking rbdpinconstraint Checking mask Checking wireangularspringconstraint Checking sbdpinconstraint Checking switchsolver Checking pumprel Checking dopnet Checking ropnet Checking merge Checking sopscalarfield Checking switch Checking gasenforceboundary Checking scalarfieldvisualization Checking anchorobjpointnumrot Checking gasdsdconfigureobject Checking gaswavelets Checking gasresizefluid Checking sinkrel Checking gasupres Checking vopforce Checking anchorobjpointnumpos Checking gasparticleforces Checking gascross Checking anchorobjspacerot Checking gasdsdsolver Checking hardconrel Checking gassurfacesnap Checking rbdstate Checking popobject Checking anchorobjspacepos Checking fetchdata Checking copyobject Checking linktosourceobject Checking rippleobject Checking rbdsolver Checking wireconfigureobject Checking gasvorticlegeometry Checking gasadjustparticlecoordinates Checking gasnetfetchdata Checking gasstrainforces Checking sbdspringconstraint Checking indexfield Checking gasvorticleforces Checking gassubstep Checking referenceframeforce Checking sandobject Checking staticsolver Checking groupandapply Checking gassurfacetension Checking vopnet Checking modifydata Checking clothconfigureobject Checking sliceplane Checking group Checking clothstitchgroup Checking gasembedfluid Checking thinplatecollider Checking matrixfieldvisualization Checking rop_dop Checking container Checking rigidbodysolver Checking gasseedparticles Checking file Checking volumecollider Checking vectorfieldvisualization Checking clothstitchconstraint Checking particlefluidemitter Checking scalarfield Checking activevalue Checking rbdautofreeze Checking vortexforce Checking popnet Checking gasfieldvop Checking anchorworldspacerot Checking physparms Checking drag Checking emptyrel Checking affector Checking subnet Checking pyrosolver Checking clothcollisionproperties Checking anchorworldspacepos Checking fluidobject Checking twostateconrel Checking windforce Checking rbdangularconstraint Checking indexfieldvisualization Checking multisolver Checking gasvorticlerecycle Checking gasparticletosdf Checking wirephysparms Checking wireobject Checking gasupresobject Checking gravity Checking clothobject Checking popsolver Checking gasmatchfield Checking positioncomposite Checking gascorrectbymarkers Checking copysolver Checking volume Checking gasnetfieldborderexchange Checking ripplesolver Checking position Checking springconrel Checking rbdglueobject Checking gasparticletofield Checking sphereedgetree Checking particlefluidobject Checking gasextrapolate Checking rbdspringconstraint Checking gasburngeometry Checking blendfactor Checking pointforce Checking clothstitchseams Checking partition Checking delete Checking anchoralignaxis Checking gasexternalforces Checking anchorobjpointidrot Checking sandsolver Checking sopgeo Checking velimpulseforce Checking gasdiffuse Checking anchorobjpointidpos Checking rippleconfigureobject Checking wirevolumecollider Checking gasparticlepressure Checking odesolver Checking particlefluidsink Checking gasbuildrelationshipmask Checking gasfetchfieldstoembed Checking rbdfracturedobject Checking sandconfigureobject Checking gasvelocitystretch Checking gasadjustelasticity Checking gasgeometrytosdf Checking rbdpointobject Checking rbdconfigureobject Checking gasfeedback Checking gasbuoyancy Checking gaselasticity Checking netfetchdata Checking constraint Checking copydata Checking anchorobjprimpos Checking smokeobject Checking gasreinitializesdf Checking objnet Checking gasnetsliceexchange Checking gasrest Checking gasprojectnondivergent Checking fluidsolver Checking blendsolver Checking magnetforce Checking terrainobject Checking instancedobject Checking wiresolver Checking clothsolver Checking slicealongline Checking rbdkeyactive Checking fan Checking fluidconfigureobject Checking squishyobject Checking split Checking gasdsd Checking renderparmsvolatile Checking wireangularconstraint Checking particlefluidsolver Checking emptyobject Checking gasvortexconfinement Checking gassandforces Checking objpos Checking gascomputeparticleattributes Checking gasreduce Checking copyobjectinfo Checking nocollider Checking gasblur Checking gasadvect Checking wirevisualization Checking noise Checking rbdvisualization Checking applydata Checking sopsolver Checking particlefieldvisualization Checking noconrel Checking gasdissipate Checking motion Checking shopnet Checking pointpos Checking gasstrainintegrate Checking scriptsolver Checking gasfieldtoparticle Checking null Checking anchorobjpointgrouprot Checking gassolver Checking gascalculate Checking impulseforce Checking gasintegrator Checking geometrycopy Checking cop2net Checking anchorobjpointgrouppos Checking uniformforce Checking rbdobject Checking gasvolumeramp Checking colliderlabel Checking gassphforces Checking clothmaterialbehavior Checking rbdhingeconstraint Checking gasburngeometryobject Checking gasfeatherfield Checking vectorfield Checking odeconfigureobject Checking wirewirecollider Checking popshapematch Checking smokesolver Checking sopvectorfield Checking rbdangularspringconstraint Checking gaslookup Checking sopnet Checking fieldforce Checking staticobject Checking sourcerel Checking particlefluidconfigureobject Checking chopnet Checking filedata Checking buoyancyforce Checking spherepointtree Checking gasbuildcollisionmask Checking wireelasticity Edited June 27, 2009 by Vormav Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.