latticeNoise/latticeNoise.h
 
 
 
latticeNoise/latticeNoise.h
//-
// ==========================================================================
// Copyright 1995,2006,2008 Autodesk, Inc. All rights reserved.
//
// Use of this software is subject to the terms of the Autodesk
// license agreement provided at the time of installation or download,
// or which otherwise accompanies this software in either electronic
// or hard copy form.
// ==========================================================================
//+


#include <maya/MPxCommand.h>
#include <maya/MPxNode.h>

//
//  Class: latticeNoiseCmd
//
//  Description:
//      The latticeNoise command creates a new lattice (ffd) deformer.  A 
//      latticeNoise node is placed between the deformed lattice shape and the 
//      actual deformer node.  This causes the deformed object to wobble as 
//      random continuous noise is added to the pointes of the lattice.
//
//  eg
//     This causes the currently selected object to be deformed
//  
//       latticeNoise;
//
//     This causes the specified geometry to be deformed
//
//       latticeNoise sphereShape1; 
//

class MArgList;

class latticeNoiseCmd : public MPxCommand
{
public:
                                        latticeNoiseCmd() {};
        virtual                 ~latticeNoiseCmd() {}; 

        MStatus                 doIt( const MArgList& args );
        static void*    creator();
};

//
//  Class: latticeNoiseNode
//
//  Description:
//      A "latticeNoise" node adds random noise to lattice geometry over time.
//      This makes the geometry being deformed by the lattice look like 
//      wobbly jello.
//
//
//  Node:       latticeNoise
//
//  Attributes: input     - input lattice 
//              amplitude - amplitude of the noise
//              frequency - frequency of the noise
//              time      - the current time
//              output    - the modified lattice
//      

class latticeNoiseNode : public MPxNode
{
public:
                                                latticeNoiseNode() {};
        virtual                         ~latticeNoiseNode() {}; 

    virtual MStatus             compute( const MPlug& plug, MDataBlock& data );
        static  void*           creator();
        static  MStatus         initialize();

public:
        static  MObject     input;     // The input lattice.
        static  MObject     amplitude; // The noise amplitude.
        static  MObject     frequency; // The noise frequency.
        static  MObject     time;      // The time.
        static  MObject     output;    // The output lattice.
        static  MTypeId         id;        // The IFF type id
};

//
//  Class: noise
//
//  Description:
//      The noise class is used for generating pseudo-random continuous noise.
//      The noise values generated are always between 0 and 1.
//
//      The technique used is a simple lattice noise algorithm based upon one 
//      by Ken Perlin.  This particular implementation is adapted from 
//      Darwyn Peachey's (Texturing and Modeling: a Procedural Approach,
//              S. Ebert Editor, 1994).
//

#define TABLE_SIZE 256

extern const int kTableMask;
#define MODPERM(x) permtable[(x)&kTableMask]

typedef struct {
        float x;
        float y;
        float z;
} pnt;

class noise {
public:

        static float  atValue( float x );
        static float  atPoint( float x, float y, float z ); 

        static pnt    atPointAndTime( float x, float y, float z, float t );

        static void   initTable( long seed );

private:

        static int    permtable   [256];
        static float  valueTable1 [256];
        static float  valueTable2 [256];
        static float  valueTable3 [256];
        static int    isInitialized;
        
        static float  spline( float x, float knot0, float knot1, float knot2, 
                                                  float knot3 );

        static float  value( int x, int y, int z, float table[] = valueTable1 );
        static float  value( int x, int y, int z, int t,
                                                 float table[] = valueTable1 );
        static float  value( int x, float table[] = valueTable1 );


};
 

inline float noise::value( int x, int y, int z, int t, float table[] ) {
        return table[MODPERM( x + MODPERM( y + MODPERM( z + MODPERM( t ) ) ) )];
}

inline float noise::value( int x, int y, int z, float table[] ) {
        return table[MODPERM( x + MODPERM( y + MODPERM( z ) ) )];
}

inline float noise::value( int x, float table[] ) {
        return table[MODPERM( x )];
}