HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
SOP/SOP_SParticle.h
/*
* Copyright (c) 2024
* 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 <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;
namespace HDK_Sample {
class SOP_SParticle : public SOP_Node
{
public:
SOP_SParticle(OP_Network *net, const char *name, OP_Operator *op);
~SOP_SParticle() override;
static OP_Node *myConstructor(OP_Network*, const char *,
protected:
const char *inputLabel(unsigned idx) const override;
void birthParticle();
const UT_Vector3 &force);
void initSystem();
void timeStep(fpreal now);
// Method to cook geometry for the SOP
OP_ERROR cookMySop(OP_Context &context) override;
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(fpreal t){ INT_PARM("birth", 2, 0, t) }
fpreal FX(fpreal t) { FLT_PARM("force", 1, 0, t) }
fpreal FY(fpreal t) { FLT_PARM("force", 1, 1, t) }
fpreal FZ(fpreal t) { FLT_PARM("force", 1, 2, t) }
const GU_Detail *mySource;
GA_Index mySourceNum; // Source point to birth from
GA_ROHandleV3 mySourceVel; // Velocity attrib in source
GU_RayIntersect *myCollision;
GEO_PrimParticle *mySystem;
fpreal myLastCookTime; // Last cooked time
GA_RWHandleV3 myVelocity; // My velocity attribute
GA_RWHandleF myLife; // My life attribute
static int *myOffsets;
};
} // End HDK_Sample namespace
#endif