/* * Copyright (c) 2013 * Side Effects Software Inc. All rights reserved. * * Redistribution and use of Houdini Development Kit samples in source and * binary forms, with or without modification, are permitted provided that the * following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. The name of Side Effects Software may not be used to endorse or * promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY SIDE EFFECTS SOFTWARE `AS IS' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN * NO EVENT SHALL SIDE EFFECTS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * *---------------------------------------------------------------------------- * This is a simple particle system... Not too much to it, but this can be * used as a template for your own... */ #ifndef __SOP_SParticle_h__ #define __SOP_SParticle_h__ #include <GB/GB_AttributeRef.h> #include <SOP/SOP_Node.h> #define INT_PARM(name, idx, vidx, t) \ return evalInt(name, &myOffsets[idx], vidx, t); #define FLT_PARM(name, idx, vidx, t) \ return evalFloat(name, &myOffsets[idx], vidx, t); class GEO_ParticleVertex; class GEO_PrimParticle; class GU_RayIntersect; namespace HDK_Sample { class SOP_SParticle : public SOP_Node { public: SOP_SParticle(OP_Network *net, const char *name, OP_Operator *op); virtual ~SOP_SParticle(); static PRM_Template myTemplateList[]; static OP_Node *myConstructor(OP_Network*, const char *, OP_Operator *); protected: virtual unsigned disableParms(); virtual const char *inputLabel(unsigned idx) const; void birthParticle(); int moveParticle(GEO_ParticleVertex *vtx, const UT_Vector3 &force); void initSystem(); void timeStep(float now); // Method to cook geometry for the SOP virtual OP_ERROR cookMySop(OP_Context &context); private: // These use defines to make it easy to add parms and remove them. // The evaluation routines use the indexed name lookup which is quite // fast, yet easy to change indices (since the order of the indices // doesn't have to be in sequential order... int RESET() { INT_PARM("reset", 0, 0, 0) } int BIRTH(float t) { INT_PARM("birth", 2, 0, t) } float FX(float t) { FLT_PARM("force", 1, 0, t) } float FY(float t) { FLT_PARM("force", 1, 1, t) } float FZ(float t) { FLT_PARM("force", 1, 2, t) } const GU_Detail *mySource; int mySourceNum; // Source point to birth from GB_AttributeRef mySourceVel; // Velocity attrib in source GU_RayIntersect *myCollision; GEO_PrimParticle *mySystem; float myLastCookTime; // Last cooked time GB_AttributeRef myVelocity; // My velocity attribute GB_AttributeRef myLife; // My life attribute static int *myOffsets; // This variable is used together with the call to the "checkInputChanged" // routine to notify the handles (if any) if the input has changed. GU_DetailGroupPair myDetailGroupPair; }; } // End HDK_Sample namespace #endif
1.5.9